【问题标题】:Normalmapping only "working" in negative axis法线贴图仅在负轴上“工作”
【发布时间】:2019-01-26 12:49:34
【问题描述】:

所以基本上我在我的 3d 程序中实现法线贴图,我遇到了一个问题,法线贴图似乎只显示在负轴上,当我靠近它时,它会偏移并且是错误的位置。

我尝试做很多事情,包括使用不同的方法,乘以光的方向和相机位置而不是法线贴图,使用转置和反转的 TBN 矩阵,检查纹理加载过程并关闭所有处理可能会干扰更多。

这是我在顶点着色器中的主要方法:

gl_Position = ProjectionMatrix * EyeMatrix * ModelMatrix * vec4(Position, 1.0);
texCoords = TexCoords;
position = (ModelMatrix * vec4(Position, 1.0)).xyz;

vec3 n = normalize((ModelMatrix * vec4(Normal, 0.0))).xyz;
vec3 t = normalize((ModelMatrix * vec4(Tangent, 0.0))).xyz;

t = normalize(t - dot(t, n) * n);

vec3 b = cross(t, n);

tbnMatrix = mat3(t, b, n);

这是我计算光照的方法:

vec3 calculatePointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir, float energyConservation)
{
vec3 lightDir = normalize(light.position - fragPos);

float diff = max(dot(normal, normalize(lightDir + viewDir)), 0.0);

float spec = energyConservation * pow(max(dot(normal, normalize(lightDir + viewDir)), material.specularIntensity), material.specularDampening);

float distance    = length(light.position - fragPos);
float attenuation = 1.0 / (light.attenuation.constant + light.attenuation.linear * distance + 
             light.attenuation.quadratic * pow(distance, 2.2));    

vec3 ambient  = light.baseLight.ambient * vec3(texture(material.texture_diffuse, texCoords));
vec3 diffuse  = (light.baseLight.diffuse * light.baseLight.intensity) * diff * vec3(texture(material.texture_diffuse, texCoords));
vec3 specular = (light.baseLight.specular * light.baseLight.intensity) * spec * vec3(texture(material.texture_gloss, texCoords));

ambient  *= attenuation;
diffuse  *= attenuation;
specular *= attenuation;

return (ambient + diffuse + specular);
}

这是我的法线贴图的代码:

vec3 normal = normalize(tbnMatrix * (255.0/128.0 * texture(material.texture_normal, texCoords).xyz - 1));

下面是切线的样子:

以下是应用 TBN 矩阵后的切线:

这里是加载的 T 组件(没有任何版本):
这是 B 组件(顶点着色器中的那个):
这是加载的 N 组件(没有任何版本):

这是我使用法线贴图渲染场景时得到的结果:


这是没有法线贴图(启用 mipmapping 和各向异性过滤)时的样子:

(请记住,我也有高光贴图)

【问题讨论】:

  • 完全不清楚这些图像应该显示什么。例如:“这是切线的样子” 哪一个?物体空间一,转化为世界空间的一?重新正交化后的那个?我的建议是首先系统地检查您的所有输入和模型数据本身。此外,您的漫反射计算完全关闭,您使用的是dot(N,H) 而不是dot(N,L)
  • 我使用的是不同的方法,它不是不正确的,如果我使用我使用 Blinn-Phong 的常规方法,它不会改变结果,并且

标签: java opengl 3d glsl lwjgl


【解决方案1】:

几周后我发现了这个问题,这是一个非常简单的错误。在纹理加载处理期间,我使用GL_SRGB 而不是普通的GL_RGB,并且 SRGB 是纹理的伽马校正版本而不是实际的纯图像。所以我必须在构造函数中为正常、光泽和置换贴图禁用和启用 SRGB 加载选项,基本上是屏幕上未显示的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多