2011-04-18 2 views
16

부동 소수점 텍스처 주위로 머리를 감싸려고 노력하고 있습니다. 그러나 저에게 설명 할 수있는 좋은 리소스를 찾기가 어렵습니다. OpenGL ARB_texture_float 스펙을 읽으려고했지만 여전히 내 머리 속에 들어갈 수 없습니다.정확히 부동 소수점 텍스처 란 무엇입니까?

그리고 텍스처에로드하는 이미지의 채널 RGBA 또는 RGB 데이터 당 8 비트의 일반 부동 소수점 데이터와 관련된 점은 무엇입니까?

내 질문과 관련하여 도움을 주셔서 감사합니다.

답변

3

FP 텍스처에는 특수 지정된 범위의 내부 형식 (RGBA_16F, RGBA_32F 등)이 있습니다. 일반 텍스처는 고정 소수점 데이터를 저장하므로이 값을 읽으면 범위 값이 [0,1]이됩니다. 반대로 FP 텍스처는 [-inf, + inf] 범위를 결과로 제공합니다 (정밀도가 더 높을 필요는 없습니다).

많은 경우 (HDR 렌더링과 같은) FP 텍스처없이 [0,1] 범위에 맞게 값을 변환하기 만하면 쉽게 진행할 수 있습니다. 그러나 지연 범위 렌더링과 같은 경우가 있습니다. 예를 들어 범위를 신경 쓰지 않고도 월드 공간 좌표를 저장할 수 있습니다.

+0

데이터를 셰이더 (예 : 등가)로 가져 오는 데 유용합니다. – pmr

+0

그러면 채널 이미지 당 일반 RGB 또는 RGBA 8 비트를 읽고 어떻게 값을 내부적으로 해석합니까? 예 : 0-255 또는 0-1 범위의 값이 내부적으로 다른 다른 범위로 조정됩니까? – lokstok

+0

@lokstok. '정규화 된'이라는 glTexImage에 대한 매개 변수가 있습니다. "true"로 설정하면 입력 바이트가 [0,1] 범위로 변환됩니다. 그렇지 않으면 나는 당신이 [0-255] (나는 그것을 시도하지 않았다)를 얻을 것이라고 생각한다. – kvark

15

here입니다.

기본적으로 부동 소수점 텍스처는 데이터가 부동 소수점 유형 인 텍스처입니다. 즉 클램핑되지 않습니다. 따라서 텍스처에 3.14f가 있으면 셰이더에서 같은 값을 읽습니다.

채널 수를 달리하여 만들 수 있습니다. 또한 형식에 따라 16 비트 또는 32 비트 텍스처를 생성 할 수 있습니다. 예 : 데이터는 다음과 같이 될 수

// create 32bit 4 component texture, each component has type float  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, data); 

:

float data[16][16]; 
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever 

다음 쉐이더에서 정확히 같은 얻을 수있는 값 (당신은 FLOAT32 텍스처를 사용하는 경우).

uniform sampler2D myFloatTex; 
float value = texture2D(myFloatTex, texcoord.xy); 

는 16 비트 포맷을 사용한다면, 당신은 쉐이더에서 읽을 때마다 당신은 convertion이있을 것이다, GL_RGBA16F을 말한다. 그래서 이것을 피하기 위해 half4 타입을 사용할 수 있습니다 : half4 value = texture2D (my16BitTex, texcoord.xy);

기본적으로 정규화 된 8 비트와 부동 소수점 텍스처의 차이점은 첫 번째 경우 값이 [0..1] 범위로 고정되고 클램핑되지만 후자는 값을 그대로 받게된다는 점입니다 16 < -> 32 변환을 제외하고 위의 예 참조).

FBO를 렌더 타겟으로 사용하고 싶지 않을 수도 있습니다.이 경우 모든 포맷이 렌더 타겟으로 첨부되지 않을 수도 있습니다. 예 : 휘도 및 강도 형식을 첨부 할 수 없습니다.

또한 모든 하드웨어가 부동 소수점 텍스처 필터링을 지원하지는 않으므로 필요한 경우 먼저 하드웨어에서 검사해야합니다.

희망이 도움이됩니다.