OpenGL从线性化深度不正确重建眼睛视点位置

时间:2013-10-20 09:26:14

标签: c++ opengl deferred-rendering

我一直试图在过去两周内实施延迟呈现。我终于使用模板缓冲和线性化深度来到现场照明传递部分。我持有3个帧缓冲纹理:反照率,法线+深度(X,Y,Z,EyeViewLinearDepth),照明纹理。所以我绘制了我的光(球体)并应用了这个片段着色器:

void main(void)
{
  vec2 texCoord = gl_FragCoord.xy * u_inverseScreenSize.xy;

  float linearDepth = texture2D(u_normalDepth, texCoord.st).a;

  // vector to far plane
  vec3 viewRay = vec3(v_vertex.xy * (-farClip/v_vertex.z), -farClip);
  // scale viewRay by linear depth to get view space position
  vec3 vertex = viewRay * linearDepth;

  vec3 normal = texture2D(u_normalDepth, texCoord.st).xyz*2.0 - 1.0;

  vec4 ambient = vec4(0.0, 0.0, 0.0, 1.0);
  vec4 diffuse = vec4(0.0, 0.0, 0.0, 1.0);
  vec4 specular = vec4(0.0, 0.0, 0.0, 1.0);

  vec3 lightDir = lightpos - vertex ;
  vec3 R = normalize(reflect(lightDir, normal));
  vec3 V = normalize(vertex);

  float lambert = max(dot(normal, normalize(lightDir)), 0.0);

  if (lambert > 0.0) {
    float distance = length(lightDir);
    if (distance <= u_lightRadius) {  

      //CLASSICAL LIGHTING COMPUTATION PART
    }
  }


  vec4 final_color = vec4(ambient + diffuse + specular);
  gl_FragColor = vec4(final_color.xyz,  1.0);

}

您需要知道的变量:v_vertex是顶点(球体)的眼睛空间位置,lightpos是眼睛空间中光线的位置/中心,在眼睛空间中的几何通过阶段生成线性深度。

问题是,如果检查:if (distance <= u_lightRadius),代码会失败。在我删除距离检查之前,永远不会计算光。我确信我正确地传递了这些值,半径为170.0,光线位置仅与模型相距40-50个单位。绝对有问题,但我无法以某种方式找到它。我尝试了半径和其他变量的许多可能性。

0 个答案:

没有答案