2015-02-06 59 views
2

OpenGL 렌더러를 C++로 프로그래밍하고 있습니다. 가능한 한 적은 메모리를 차지하도록 가능한 한 효율적이고 각 정점/보통/UV 텍셀 좌표/접선/등을 원합니다. 색인, 줄무늬 및 팬을 사용하고 있습니다. 32 비트 부동 소수점은 필요하지 않으며 16 비트 부동 소수점은 적어도 법선과 UV와 같은 일부에서는 괜찮을 것이라고 생각했습니다. 나는 이것의 어떤 예를 찾을 수 없을 것입니다. "GL_HALF_FLOAT"에 대한 이야기를 찾을 수 있지만 실제 예는 없습니다. 나는 올바른 길을 가고 있는가? 아니면 이것에 대해 조사할만한 가치가없는 것입니까? 누구든지이 예제를 알고 있다면 소스 코드 링크를 보낼 수 있습니까?"GL_HALF_FLOAT"with OpenGL Rendering 및 GLSL

+1

'uint' 데이터 유형을 사용하여 2 개의 하프 플로트를 패킹하고 언팩 할 수 있습니다. 그러나 GLSL에서 얻을 수있는 가장 작은 데이터 유형은 32 비트입니다. 자세한 내용은 ['uint packHalf2x16 (\t vec2 v)'] (https://www.opengl.org/sdk/docs/man4/html/packHalf2x16.xhtml)을 참조하십시오. –

+0

@ AndonM.Coleman 정점 버퍼에'HALF_FLOAT' 데이터를 넣을 수 있습니다. 물론 쉐이더에 도달하면 32 비트 정밀도로 확장되지만 반 부동 소수점은 좌표에 충분한 정밀도라면 메모리 공간과 대역폭을 절약 할 수 있습니다. –

+0

@RetoKoradi : 내 마음이 다른 곳에 있기 때문에 나는 완전히 그 질문을 잘못 읽었습니다 : - 나는 태그를보고 GLSL에서'float'의 정밀도를 바꾸고 싶다고 생각했습니다. 예, 당신은 절대적으로 맞습니다 - 반 부동 소수점은 glm과 같은 언어의 일부가 아니기 때문에 (C++이라고 가정하면) 그 역할을 수행해야합니다. –

답변

4

OpenGL ES와 달리 전체 셰이더 코드는 항상 32 비트 부동 소수점으로 작동합니다. OpenGL 3.0부터 버텍스 데이터를 반 플로트로 지정하는 것은 지원됩니다. 정밀도가 사용자의 요구에 충분하면 정점 데이터의 메모리 사용량을 줄이고 정점 페칭에 필요한 대역폭을 줄일 수 있습니다.

반 플로트의 정밀도는 약 3-4 자릿수입니다. 따라서 정확성은 실제로 심각하게 제한됩니다.

어떻게 사용하는지는 매우 간단합니다. 반올림 값에 대한 포인터가있는 경우 다른 유형과 마찬가지로 glBufferData() 또는 glBufferSubData()을 사용하여 VBO에 저장합니다. glVertexAttribPointer() 호는 예를 들어 3 개 요소와 속성을 사용하여, 다음과 같을 것이다 :

glVertexAttribPointer(loc, 3, GL_HALF_FLOAT, GL_FALSE, 0); 

데이터 자체의 포맷은 ARB_texture_float 확장으로 정의된다. 공식적으로 이름이 지정되지는 않았지만 적어도 IEEE 754-2008 형식과 매우 유사합니다. 이전에 Wikipedia 형식 설명을 기반으로 한 변환 코드를 작성 했으므로 OpenGL 사용에는 문제가 없습니다.

대부분의 언어에는 절반 수레에 대한 기본 제공 유형이 없습니다. 따라서 float에서 half-float 로의 변환을 수행하거나 다른 사람이 작성한 코드를 사용하려면 몇 줄의 코드를 작성해야합니다.

반 플로우트 변환에 대한 다음 리소스는 빠른 검색에서 가져온 것입니다. 나는 그들 중 아무 개인적인 경험이 없다, 당신은 당신의 요구에 가장 적합한 하나를 찾기 위해 자신의 검색을 수행해야 가능한 성능 이점을 설명, 인텔