2012-01-28 6 views
9

고정 GIFL에서 고정 된 크기의 부동 소수점 배열을 속성으로 정점 셰이더에 전달할 수 있습니까? 그렇다면 어떻게?정점 고정 크기 배열 당 GLSL

attribute float weights[25]; 

가 어떻게 내 C++ &의 OpenGL 프로그램에서 속성 배열을 채울 것입니다 :

내가 캐릭터 애니메이션에 대한 정점 가중치별로 갖고 싶어

그래서 내 버텍스 쉐이더에 다음과 같은 일을하고 싶습니다? question에서 배열 속성의 속성 위치를 얻은 다음 그 위치에 색인을 추가 할 수 있다는 것을 보았습니다. 누군가 내 꽤 큰 배열에 대한 예제를 줄 수 있을까요?

감사합니다.

답변

16

요청하신 사항부터 시작하겠습니다.

거의 존재하지 않는 하드웨어에 현재 attribute float weights[25];이 컴파일됩니다. 셰이더는 속성 배열을 가질 수 있지만 각 배열 인덱스는 속성 인덱스를 나타냅니다. 그리고 모든 하드웨어에 현재 존재하는 속성 인덱스의 최대 수는 16입니다. 16. 무게가일 경우입니다.

이제 vec4 속성을 사용할 수 있다는 것을 기억하면 충분할 수 있습니다. 따라서 네 개의 배열 요소를 모두 단일 속성에 저장합니다. 당신의 배열은 attribute vec4 weights[7];이 될 수 있습니다. 귀하의 체중을 가져 오는 논리는 물론 변경해야합니다.

그럼에도 불구하고 실제로는 이 어떤 의미인지에 대한 파생물을 정점 데이터로 사용하지 않는 것 같습니다. 각 속성은 정점 데이터의 구성 요소를 나타냅니다. 렌더링 호출의 각 정점에는 같은 양의 데이터가 있습니다. 그 데이터의 내용은 다를 것이지만 얼마나 많은 데이터가 아닌지.

당신이 제안하고있는 것을하기 위해서, 당신의 메쉬에있는 꼭지점은 무게를 설명하는 25 개의 부유물이 필요합니다. 이것이 표준화되지 않은 부호없는 바이트로 저장되었다고해도, 최소 25 바이트의 데이터가 남아 있습니다. 그게 많이 있습니다. 특히 광대 한 버텍스의 대부분을 고려할 때,이 값의 대부분은 0이됩니다. 최악의 경우에도, 단일 버텍스에 영향을주는 아마 6 ~ 7 개의 뼈를 볼 수 있습니다.

일반적으로 스키닝은 버텍스 쉐이더에서 수행되는데, 하나의 버텍스에 영향을 미치는 뼈의 수를 네 개로 제한합니다.. 이 방법은 속성 배열을 사용하지 않습니다. 무게에 vec4 속성을 사용하기 만하면됩니다. 물론, 당신은 또한 어떤 뼈가 어떤 체중과 관련이 있는지 말할 필요가 있습니다. 따라서 해당 가중치에 대한 뼈 색인을 지정하는 두 번째 vec4 속성이 있습니다.

이것은 좋은 균형을 이룹니다. 2 개의 추가 속성 (크기면에서 부호없는 바이트가 될 수 있음) 만 사용합니다. 대부분의 버텍스는 1 ~ 3 개의 뼈에 의해서만 영향을 받으므로 대부분의 버텍스는 알지 못합니다. 일부는 4를 사용하고 나머지는 여전히 5+를 사용합니다. 이 경우 가장 낮은 가중치를 잘라 내고 비례 적으로 다른 가중치를 다시 계산하면됩니다.

+2

대단히 감사합니다. 당신은 내 질문에 모두 대답했습니다. 이 기능이 성능을 크게 향상 시키길 바랍니다. 다시 한번 감사드립니다. – Nicholas

11

Nicol Bolas는 이미 과제 재구성 방법에 대한 답변을 주셨습니다. 아마도 쿼터니언 곱셈을 통해 버텍스에 대한 부동 소수점 처리가 많은 GPU 처리 능력을 낭비 할 것이기 때문에 그렇게해야합니다. 어쨌든 정점에 대한 속성의 대부분은 항등 변환으로 거의 바뀔 것입니다.

그러나 학문적 인 이유로 저는 정점 당 25 개의 부동 수를 전달하는 방법을 알려 드리려고합니다. 열쇠는 이것에 대해 속성을 사용하지 않고 일부 버퍼 (텍스처)에서 데이터를 가져 오는 것입니다. GLSL 버텍스 쉐이더 스테이지는 내장 변수가 gl_VertexID인데, 현재 처리중인 버텍스의 인덱스를 전달합니다. 최근 OpenGL을 사용하면 꼭지점 셰이더에서 텍스처에 액세스 할 수 있습니다. 따라서 값을 보유하고있는 크기는 vertex_count × 25입니다. 정점 셰이더에서 당신은 그들이 골격 애니메이션에 사용되는 즉 texelFetch(param_buffer, vec2(gl_VertexID, 3));

만약이 시스템은 종종 질감이 스키닝이라고는 texelFetch 기능을 사용하여 액세스 할 수 있습니다. 그러나 그것은 실제 공연 돼지이기 때문에 절대로 사용하지 않아야합니다. 그러나 인간의 얼굴을 정확하게 시뮬레이트하려는 경우 얼굴 근육 시스템을 구현할 때와 같이 모든 정점을 26 개의 근육에 가중시켜야하는 경우와 같이 피할 수없는 경우도 있습니다.

+0

매우 흥미 롭습니다! 나는 미래의 일을 위해 그것을 명심 할 것이다. – Nicholas