2012-10-22 2 views
2

현재 OpenGL-es를 사용하고 있으며 gl 쉐이딩 언어를 사용하고 있습니다. 나는 텍스처에 렌더링하려고하지만 정밀도의 손실을 발견했습니다. 예를 들어 텍스처에 0.5의 float 값을 쓸 때 텍스처에 저장된 실제 값은 약 0.498입니다. 더 높은 정밀도를 얻으려면 어떻게해야합니까?GLSL 프래그먼트 쉐이더의 정밀도 상실

답변

1
당신은 아마 포장 - 포장을 풀고 당신의 가치를 통해 (픽셀/텍셀 당 하나의 값 경우) 값을 저장 고려해야한다

:

vec4 packFloat(const float value) { 
    const vec4 bitSh = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0); 
    const vec4 bitMsk = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0); 
    vec4 res = fract(value * bitSh); 
    res -= res.xxyz * bitMsk; 
    return res; 
} 

float unpackFloat(const vec4 value) { 
    const vec4 bitSh = vec4(1.0/(256.0 * 256.0 * 256.0), 1.0/(256.0 * 256.0), 1.0/256.0, 1.0); 
    return (dot(value, bitSh)); 
} 

이것은 깊이 맵과 같은 값을 저장하기 위해 괜찮을 수도 그리고 이것은 각 픽셀/텍셀에 대해 32 비트 범위의 종류가 될 것입니다.

+0

고마워요! 나는이 방법이 나를 도울 것이라고 생각하며 나는 이렇게 높은 정밀도를 달성하려고 노력할 것이다! 고맙습니다! – Timothy

+0

잘하면 그것이 작동;) – TheWhiteLlama

+0

이것은 보간을 해제하지 않으면 작동하지 않을 것입니다. –

0

변수 앞에 highp 정밀도 한정자를 추가하십시오.

+1

역시 작동하지 않습니다. 모두 고마워. – Timothy

1

구성 요소 당 8 비트 이상을 사용하는 텍스처로 렌더링합니다. appropriate OpenGL ES extensions for that이 없으면 일반적으로 할 수있는 일이 많지 않습니다.

+0

조금 보완 된 것 같지만 확장을 사용하는 방법을 보려고합니다. 도와 줘서 고마워! – Timothy

1

렌더링 파이프 라인의 마지막 단계에서 픽셀 값을 0..1 범위로 조정하므로 다음으로 높은 정밀도로는 충분하지 않을 수도 있습니다. 끝점은 0..1입니다. 따라서 1은 255로 표시되며 1/256 대신 1/255의 계수를 제안합니다.

동일한 내용이 모든 정밀도에 적용됩니다. 0.5는 정확하게 표현할 수 없습니다.

+0

플로트가 0..1의 범위로 스케일 될 것이라는 것을 압니다. 그러나 나는 아직도 약간 혼란 스럽습니다. 나는 0.5가 128/256이고 그것이 고정밀 도로 제시 될 수 있다고 생각했다. – Timothy

+1

정확히 0.5로 표시하려면 float 값을 256으로 나눠야합니다. 그러나 256 개의 8 비트 정수 값만 사용할 수 있습니다. 0은 0.0으로 매핑되고 255는 1.0에 매핑됩니다. 중간에 정확히 정수 값이 없습니다 (예 : 127.5) –

+0

알았습니다. 지금 무엇을해야하는지 알 것 같습니다. 고마워. – Timothy