2017-03-22 9 views
0

나는이 정점 당 6 바이트로 실행 일부 포장 정점 데이터 :GLES2.0 glVertexAttribPointer : 이상한 보폭 및 오프셋 값을 사용하면 성능이 저하됩니까?

glVertexAttribPointer Shader.pos3d_loc, 3, GL_UNSIGNED_BYTE, True, 6, 0 
glVertexAttribPointer Shader.norm_loc, 3, GL_UNSIGNED_BYTE, True, 6, 3 

4 바이트의 배수가 아닌 진보와 오프셋을 사용하여 유도 어떠한 성능 저하 (예 : 숨겨진 메모리 복사)이 있습니까?

+0

이 시점에서 복사가 수행되지 않습니다. 꼭지점 버퍼에 데이터를 복사하거나 필요에 따라 하나씩 값에 액세스합니다. 이 값들은 OpenGL에게 버퍼 해석 방법을 알려주는 것입니다. 예를 들어 normal [i] .x = (float) ((ubyte) ((void *) ptr) [stride * i])) 여기서 ubyte는 GL_UNSIGNED_BYTE 매개 변수에서 온 것입니다. –

+0

고마워요. 저는 함수가하는 일을 이해 합니다만, GL이 상당한 성능 비용으로 내부적으로 데이터를 변환하는 정렬 및 형식 관련 문제가 있음을 알고 있습니다. 홀수 보폭과 정렬을 지정하면 GL이 최종 렌더링 호출이 발생할 때 내부적으로 데이터를 다시 버퍼링하게되는지 궁금했습니다. – Peeling

답변

0

짧은 대답은 '그것은 의존한다'는 : PC에

하고 (적어도 일부) 안드로이드 장치는 단단히 이런 식으로 3 요소 특성을 포장에 대한 식별 처벌이 없습니다.

IOS에서는 (어쨌든이 글을 쓰는 시점에서) 큰 성능 패널티가 있습니다. IOS GL 구현은 내부적으로 4 바이트 정렬되지 않은 모든 속성을 언팩하고 정렬합니다. 메모리와 CPU 히트가 발생합니다. 동적 VBO로 작업하지 않는 한 CPU 히트가 눈에 띄지 않을 수도 있습니다.