我正在尝试将一些代码从光栅化着色器转换为光线跟踪着色器

  • 本文关键字:光线跟踪 转换 代码 glsl
  • 更新时间 :
  • 英文 :


从我看到的dFdx和dFdy函数不运行在壁橱击中着色器。所以我要把它转换成类似的形式。我认为这是等价的,但我没有得到相同的结果。我错过什么了吗?

从我从LearnOpenGl https://learnopengl.com/PBR/Lighting获得的栅格着色器:

vec3 getNormalFromMap()
{
vec3 tangentNormal = texture(normalMap, TexCoords).xyz * 2.0 - 1.0;
vec3 Q1  = dFdx(WorldPos);
vec3 Q2  = dFdy(WorldPos);
vec2 st1 = dFdx(TexCoords);
vec2 st2 = dFdy(TexCoords);
vec3 N   = normalize(Normal);
vec3 T  = normalize(Q1*st2.t - Q2*st1.t);
vec3 B  = -normalize(cross(N, T));
mat3 TBN = mat3(T, B, N);
return normalize(TBN * tangentNormal);
}

我试图重新创造它:

vec3 getNormalFromMap(MaterialInfo material, Vertex vertex)
{
vec3 T = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vec3(vertex.tangent));
vec3 B = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vec3(vertex.BiTangant));
vec3 N = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vertex.normal);
mat3 TBN = transpose(mat3(T, B, N));
vec3 normal = texture(TextureMap[material.NormalMapID], vertex.uv).xyz;
normal = normalize(normal * 2.0 - 1.0);

return TBN * normal;
}

在代码的注释中,它说它应该能够以正常的方式完成,所以我只是想知道如果我的转换代码是错误的,如果问题是在着色器的其他地方。

https://learnopengl.com/code_viewer_gh.php?code=src/6.pbr/1.2.lighting_textured/1.2.pbr.fs

// ----------------------------------------------------------------------------
// Easy trick to get tangent-normals to world-space to keep PBR code simplified.
// Don't worry if you don't get what's going on; you generally want to do normal 
// mapping the usual way for performance anways; I do plan make a note of this 
// technique somewhere later in the normal mapping tutorial.

没关系,我想出来了。原来我是在对TBN矩阵进行转置而我本该这样做,却忘了对TBN *法线进行归一化。

旧代码:

vec3 getNormalFromMap(MaterialInfo material, Vertex vertex)
{
vec3 T = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vec3(vertex.tangent));
vec3 B = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vec3(vertex.BiTangant));
vec3 N = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vertex.normal);
mat3 TBN = transpose(mat3(T, B, N));
vec3 normal = texture(TextureMap[material.NormalMapID], vertex.uv).xyz;
normal = normalize(normal * 2.0 - 1.0);

return TBN * normal;
}

固定代码:

vec3 getNormalFromMap(MaterialInfo material, Vertex vertex)
{
vec3 T = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vec3(vertex.tangent));
vec3 B = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vec3(vertex.BiTangant));
vec3 N = normalize(mat3(meshProperties[gl_InstanceCustomIndexEXT].ModelTransform * MeshTransform[gl_InstanceCustomIndexEXT].Transform) * vertex.normal);
mat3 TBN = mat3(T, B, N);
vec3 normal = texture(TextureMap[material.NormalMapID], vertex.uv).xyz;
normal = normalize(normal * 2.0 - 1.0);

return normalize(TBN * normal);
}

最新更新