2014-12-18 2 views
-1

정점 (또는 기하) 셰이더에서 내 정점 중 일부를 계산하려고합니다. 마침내 정점을 그릴 때 정점 배열 객체에 부여한 순서를 잃어 버렸습니다 (GL_ELEMENT_ARRAY_BUFFER 사용). glDrawElements 함수는이 상황에서 작동하지 않고 대신 glDrawArrays를 사용해야합니다. 내가 잘못?변형 피드백 삼각형 메쉬의 잃어버린 순서

변환 피드백에 대한 삼각형 인덱스의 순서를 저장하려면 어떻게해야합니까?

답변

0

틀린 것은 아닙니다. 정점은 정점 (또는 기하학) 셰이더에 의해 처리되는 순서로 변환 피드백 버퍼에 기록됩니다. 나는 그 주위에 쉬운 길을 보지 못했다.

즉, 캡처 한 버퍼에 정점을 그리려면 glDrawArrays()을 사용합니다. 또는 GL 4.0 이상에서는 glDrawTransformFeedback()을 사용할 수도 있습니다.

색인을 생성하고 정점을 원래 순서대로 되돌리려면 다시 조각해야합니다. 색인 버퍼 배열 idxA에서 n 지표로 채워진 경우, 상기 캡쳐 버퍼 배열 inVertexA의 정점과 정점하여 입력 버퍼는이 어레이 capturedVertexA에서, 원래의 순서로 변화 정점으로 outVertexA에 기록 될 수있다 :

for (int k = 0; k < n; ++k) { 
    outVertexA[idxA[k]] = capturedVertexA[k]; 
} 

도면이 프리미티브 유형 GL_TRIANGLES 인 경우 작동합니다. GL_TRIANGLE_STRIP과 같은 그림으로 그리는 경우 변환 피드백이 별도의 삼각형을 생성하기 때문에 색인 논리가 약간 더 복잡해집니다.

변환 피드백을 통해 출력을 다시 실행하고 원래 인덱스 배열의 역 매핑 인 인덱스 배열을 사용하여 GPU가 꼭지점을 다시 셔플하게 할 수 있다고 생각합니다.

어떤 경우에도 어색해 보입니다. 사용 사례를 다시 생각해보고 이 원래 순서대로 정점을 다시 필요로하는지 확인하십시오.

면책 조항 : 나는 결코 피드백 변환을 사용하지 않았으며 드라이버에서 구현/수정 작업을 거의 수행하지 않았습니다. 위의 모든 내용은 사양을 읽는 것으로부터의 나의 이해입니다.

+0

응답 해 주셔서 감사합니다. Finnaly 나는 렌더링 패스에 glDrawElements를 사용했고 VBO에서 핑퐁 효과를 얻기 위해 TF와 동일한 VAO를 서로 교환하는 두 개의 다른 VBO를 바인딩했습니다. 메쉬의 버텍스를 변경하고 싶지는 않습니다. 모든 삼각형에 대해서만 GPGPU 연산을 수행하고 싶습니다. – alexGrac