2016-07-25 2 views
0

애플리케이션의 경우 메쉬의 깊이 이미지를 만들어야합니다. 기본적으로 나는 각 픽셀이 카메라 중심점과 교차점 사이의 거리를 알려주는 이미지를 원합니다. OpenGL을 사용하여이 작업을 수행하므로 대부분의 계산이 CPU 대신 GPU에서 수행 될 수 있습니다.프래그먼트 해머에서 되돌아 오는 플로트

다음은 버텍스 쉐이더 코드입니다. 교차점의 실제 좌표를 계산하고 좌표를 varying vec4에 저장하여 조각 쉐이더에서 액세스 할 수 있도록합니다.

varying vec4 verpos; 
void main(void) 
{ 
    gl_Position = ftransform(); 
    verpos = gl_ModelViewMatrix*gl_Vertex; 
} 

여기 조각 쉐이더 코드입니다. 프래그먼트 셰이더에서는 피타고라스를 사용하여 원점 (0,0,0)까지의 누적 거리를 계산하기 위해이 좌표를 사용합니다. CPU에 계산 된 값에 대한 액세스를 얻으려면, 나의 계획은 내가에만 결과를받을 수, gl_FragColor을 사용하여 색상과 거리를 저장하고, glReadPixels(0, 0, width, height, GL_RED, GL_FLOAT, &distances[0]);

varying vec4 verpos; 
void main() 
{ 
    float x = verpos.x; 
    float y = verpos.y; 
    float z = verpos.z; 

    float depth = sqrt(x*x + y*y + z*z)/5000.0; 
    gl_FragColor = vec4(depth, depth, depth, 1.0); 
} 

문제는 사용하여 색상 값을 추출하는 것입니다 0.003921569 (=1/255)의 정밀도. 결과 값은 예를 들어 0.364705890, 0.364705890, 0.364705890, 0.364705890, 0.368627459, 0.368627459, 0.368627459입니다. 한 줄에있는 값의 대부분은 정확히 같고 1/255의 점프가 있습니다. 어딘가에 inbetween gl_FragColorglReadPixels OpenGL은 float을 8 비트로 변환 한 후 다시 float로 변환합니다.

거리 값을 정밀도를 잃지 않고 float으로 어떻게 추출 할 수 있습니까?

+1

8 비트 RGBA 인 백 버퍼에 쓰고 있는데, float 값을 쓰고 싶다면'HALF_FLOAT' 또는'FLOAT' 텍스처가 첨부 된'FrameBufferObject'를 렌더링 한 다음 그 값을 읽어야합니다 조직. –

+0

깊이가 1/5000 인 이유는 무엇입니까? 왜 쉽게 사용할 수있는'length' 내장 함수, 즉'length (verpos)'를 사용하지 않는 것입니까? 기술적으로는 단편 색상에 깊이를 쓰고 (그리고 색상 쓰기를 모두 비활성화하는) 단계를 생략하고 깊이 버퍼의 내용을 읽고 깊이 값의 1/x 매핑을 선형화 할 수도 있습니다. 깊이 버퍼에는 적어도 16 비트, 더 많은 가능성이 24 비트가 있습니다. 기술적으로 심도 버퍼에 선형 깊이를 쓸 수도 있지만 성능에 영향을 미칩니다. – datenwolf

+0

@datenwolf 값이 '[0, 1]'범위에 있도록 5000으로 나눕니다. – user38034

답변

1

FBO에 R32F 또는 R16F 텍스처를 첨부하고 렌더링합니다. 그런 다음 glReadPixels()과 같이 glGetTexImage2D() 픽셀을 추출합니다.

관련 문제