애플리케이션의 경우 메쉬의 깊이 이미지를 만들어야합니다. 기본적으로 나는 각 픽셀이 카메라 중심점과 교차점 사이의 거리를 알려주는 이미지를 원합니다. 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_FragColor
과 glReadPixels
OpenGL은 float을 8 비트로 변환 한 후 다시 float로 변환합니다.
거리 값을 정밀도를 잃지 않고 float으로 어떻게 추출 할 수 있습니까?
8 비트 RGBA 인 백 버퍼에 쓰고 있는데, float 값을 쓰고 싶다면'HALF_FLOAT' 또는'FLOAT' 텍스처가 첨부 된'FrameBufferObject'를 렌더링 한 다음 그 값을 읽어야합니다 조직. –
깊이가 1/5000 인 이유는 무엇입니까? 왜 쉽게 사용할 수있는'length' 내장 함수, 즉'length (verpos)'를 사용하지 않는 것입니까? 기술적으로는 단편 색상에 깊이를 쓰고 (그리고 색상 쓰기를 모두 비활성화하는) 단계를 생략하고 깊이 버퍼의 내용을 읽고 깊이 값의 1/x 매핑을 선형화 할 수도 있습니다. 깊이 버퍼에는 적어도 16 비트, 더 많은 가능성이 24 비트가 있습니다. 기술적으로 심도 버퍼에 선형 깊이를 쓸 수도 있지만 성능에 영향을 미칩니다. – datenwolf
@datenwolf 값이 '[0, 1]'범위에 있도록 5000으로 나눕니다. – user38034