【问题标题】:Vulkan Texture fuzzy issueVulkan 纹理模糊问题
【发布时间】:2018-05-02 04:09:35
【问题描述】:

我有一个简单的 Vulkan 设置,它加载了一个非常大的网格文件(女性)并应用了漫反射和法线贴图纹理。

顶点着色器:

#version 450 core

layout (set = 0, binding = 0) uniform ModelMatrix {
    mat4 model;
} modelMatrix;

layout (push_constant) uniform ViewProjection {
    mat4 view;
    mat4 projection;
} viewProjection;

layout (location = 0) in vec3 inPos;

layout (location = 1) in vec3 inNor;

layout (location = 2) in vec2 inUV;

layout (location = 3) in vec3 inTan;

layout (location = 4) in vec3 inBitan;

layout (location = 0) out vec3 fragPos;

layout (location = 1) out vec2 fragUV;

layout (location = 2) out vec3 fragNor;

layout (location = 3) out vec3 fragTan;

layout (location = 4) out vec3 fragBitan;


void main()
{
    fragPos     = vec3(viewProjection.view * modelMatrix.model * vec4(inPos, 1.0));
    fragNor     = mat3(viewProjection.view * modelMatrix.model) * inNor;
    fragUV      = inUV;
    fragTan     = mat3(viewProjection.view * modelMatrix.model) * inTan;
    fragBitan   = mat3(viewProjection.view * modelMatrix.model) * inBitan;


    gl_Position = viewProjection.projection * vec4(fragPos, 1.0);
}

片段着色器:

#version 450 core

layout (location = 0) in vec3 fragPos;

layout (location = 1) in vec2 fragUV;

layout (location = 2) in vec3 fragNor;

layout (location = 3) in vec3 fragTan;

layout (location = 4) in vec3 fragBitan;

layout (location = 0) out vec4 outFragColor;

layout (set = 0, binding = 0) uniform MVP {
    mat4 model;
} mvp;

layout (set = 0, binding = 1) uniform sampler2D textureSampler;

layout (set = 0, binding = 2) uniform sampler2D normalSampler;

layout (set = 0, binding = 3) uniform sampler2D specSampler;

layout (push_constant) uniform VP {
    mat4 view;
    mat4 projection;
} vp;

const vec3 lightPos = vec3(0.0, 0.0, 300.0);

const float lightIntensity = 1.0f;

const float shininess = 50.0;

void main()
{
    mat3 TBN = transpose(mat3(
        fragTan,
        fragBitan,
        fragNor
    ));

    vec3 normapFragNor = normalize(texture(normalSampler, fragUV).rgb * 2.0 - 1.0);

    vec3 lightDirectionTangSpace = TBN * (lightPos - fragPos);

    float dotProduct = dot(normalize(lightDirectionTangSpace), normalize(normapFragNor));

    float meshNormalDotProduct = dot(normalize(lightDirectionTangSpace), normalize(fragNor));

    float diffuse = min(max(dotProduct, 0.0), 1.0);


    float specular = pow(diffuse, shininess);

    vec4 texelColor = texture(textureSampler, fragUV);

    vec3 specularColor = vec3(texture(specSampler, fragUV));


    float specResultColorComponent = min(1.0, diffuse);

    outFragColor = vec4(diffuse * vec3(texelColor)  , texelColor.a); // For Spec Map: diffuse * vec3(texelColor) + (specular * specularColor)
}

结果:

可以看出,整个网格上的碎片有点模糊和嘈杂,特别是在手臂上。

每当我在 Unity3D 中加载这个网格具有相同的纹理时,结果是没有提到的噪音:

另一个具有法线贴图 + 规格贴图的模型就像一个魅力,所以这对我来说听起来很矛盾,因为 Unity3D 可以正确渲染这三个模型,但是我的程序无法仅为特定模型生成光照值,这意味着着色器可以解释纹理/模型中的数据!

这个问题的根源是什么?

[更新]

使用几何着色器可视化法线后:

【问题讨论】:

  • 这可能是转换、顶点属性、数据插值的问题。分别检查每个输入数据/顶点属性并将它们显示为颜色。然后对您在着色器中执行的每个步骤执行相同的操作。想想他们应该是什么样子,并试图找出哪一个是错的。如果你找出了哪些数据/操作/属性不正确,就更容易找到问题的根源。
  • @chakmeshma:为什么要将模型矩阵设为描述符集变量,但投影使用推送常量?模型矩阵的变化比投影更频繁(通常整个场景都相同)。推送常量用于快速变化的值。
  • @chakmeshma:您是否尝试按照我上面描述的方式调试您的问题?您是否获得了任何结果,将工作模型与不起作用的模型进行了比较?你只分享了你的着色器代码。当然,这可能是您的着色器中的一个问题,很难发现。但它也可能是由上面提到的顶点属性、输入数据格式、数据传输问题、着色器阶段之间的数据插值等其他原因引起的。如果没有您提供的更多信息,我们可能无法为您提供帮助。
  • 我怀疑统一模型加载器对实际模型数据进行了一些清理/魔术,在其他一些软件中加载和重新导出模型可能会解决问题。此外,我发现提供的屏幕截图太小/太远,无法正确查看工件或调试法线。
  • @chakmeshma 我看到这个问题很长时间没有更新。你解决了你的问题吗?是的,是什么问题?如果不是,您是否尝试使用我描述的方法调试问题?

标签: textures shader vulkan


【解决方案1】:

在我看来,您对法线(以及可能的其他法线)的转换似乎是错误的。您通常不会使用与顶点相同的矩阵进行变换。通常使用反转置。

尝试使用例如可视化法线使用几何着色器(发射线)。

【讨论】:

  • 事实上,使用相同的矩阵进行顶点和法线变换是一种有效的行为。如果我们只均匀地缩放对象(相同的比例应用于所有维度),我们就可以做到这一点。如果对象的缩放比例不均匀,则正常变换确实需要反转置。但即使我们在这种情况下确实使用了相同的矩阵,结果看起来也会与上面看到的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多