我正在使用着色器在我的图像中绘制深度贴图。 这是我的着色器代码:
顶点着色器:
void main(void) {
gl_PointSize = aPointSize;
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
visdepth = aisdepth;
vHasTexture = aHasTexture;
if (aHasTexture > 0.5)
vTextureCoord = aTextureCoord;
}
Fragement Shader:
void main(void) {
if (vHasTexture < 0.5 && visdepth < 0.5)
gl_FragColor = vColor;
if (vHasTexture > 0.5) {
vec4 textureColor = texture2D(uTexture, vec2(vTextureCoord.s, vTextureCoord.t));
gl_FragColor = vec4(textureColor.rgb, textureColor.a * uTextureAlpha);
}
if (visdepth > 0.5){
float ndcDepth = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) /
(gl_DepthRange.far - gl_DepthRange.near);
float clipDepth = ndcDepth /gl_FragCoord.w;
gl_FragColor = vec4((clipDepth*0.5)+0.5);
}
}
我使用以下链接作为我的计算参考:draw the depth value in opengl using shaders
我将所有值都设为白色,如下所示:
从上面的两幅图中可以清楚地看到,图像最右侧的点落后。这不会反映在我下载的图像中。使用drawArrays函数后,我使用toDataUrl函数下载画布数据。图像是下载的结果。有谁知道这个可能的原因吗?
答案 0 :(得分:0)
对于那些寻求回答这个问题的人,这里有一点提示:
如果你想查看深度图,你必须线性化它...
float linearize_Z(float depth , float zNear , float zFar){
return (2*zNear ) / (zFar + zNear - depth*(zFar -zNear)) ;
}