Luc*_*ian 8 opengl 3d shader glsl depth
我有一对GLSL着色器,它为我提供了场景中对象的深度贴图.我现在得到的是每个像素到相机的距离.我需要的是获得从像素到相机平面的距离.让我用一点画来说明
* |--*
/ |
/ |
C-----* C-----*
\ |
\ |
* |--*
Run Code Online (Sandbox Code Playgroud)
3个星号是像素,C是相机.星号的线条是"深度".在第一种情况下,我得到像素到相机的距离.在第二个中,我希望得到每个像素到平面的距离.
必须有一种方法可以通过使用一些投影矩阵来做到这一点,但我很难过.
这是我正在使用的着色器.请注意,eyePosition是camera_position_object_space.
顶点着色器:
void main() {
position = gl_Vertex.xyz;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
像素着色器:
uniform vec3 eyePosition;
varying vec3 position;
void main(void) {
vec3 temp = vec3(1.0,1.0,1.0);
float depth = (length(eyePosition - position*temp) - 1.0) / 49.0;
gl_FragColor = vec4(depth, depth, depth, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
Nic*_*las 13
你真的想要以艰难的方式做到这一点.简单地将东西转换为相机空间,并从那里开始工作.
varying float distToCamera;
void main()
{
vec4 cs_position = glModelViewMatrix * gl_Vertex;
distToCamera = -cs_position.z;
gl_Position = gl_ProjectionMatrix * cs_position;
}
Run Code Online (Sandbox Code Playgroud)
在相机空间(一切都相对于相机的位置/方向的空间)中,到顶点的平面距离恰好是Z坐标的负值(更高的负Z越远).
所以你的片段着色器甚至不需要eyePosition; "深度"直接来自顶点着色器.