开始学习计算机 2024-04-06 09:19 采纳率: 0%
浏览 6

normal mapping

这是我编写的关于normal mapping的代码,但是它现在的效果是全部黑色的,请问各位我哪个地方出现了问题TAT

img


这是我的效果图

img


这是原本的图


layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec3 vertexNormal;
layout(location = 2) in vec2 textureCoords;
layout(location = 3) in vec3 vertexTangent;

uniform mat4 transformationMatrix;
uniform mat4 rotationMatrix;
uniform mat4 translationMatrix;
uniform vec3 diffuseColor;
uniform float textureLevel;


out vec3 fragNormal;
out vec3 fragPos;
out vec3 fragTexCoords;
out mat3 TBN;

void main() {
    gl_Position = transformationMatrix * vec4(vertexPos, 1);
    fragPos = (translationMatrix * rotationMatrix * vec4(vertexPos, 1)).xyz;
    fragNormal = (rotationMatrix * vec4(vertexNormal, 1)).xyz;
    fragTexCoords = vec3(textureCoords, textureLevel);

    vec3 T = normalize((rotationMatrix * vec4(vertexTangent, 0.0)).xyz);
    vec3 N = normalize((rotationMatrix * vec4(vertexNormal, 0.0)).xyz);
    vec3 B = cross(N, T);

    TBN = mat3(T, B, N);
}

这是我的顶点着色器

in vec3 fragNormal;
in vec3 fragPos;
in vec3 fragTexCoords;
in mat3 TBN;

layout (binding = 2) uniform sampler2DArray diffuseTexture;

// 定义法线贴图
layout(binding = 3) uniform sampler2DArray normalMap;
vec3 calculateBlinnPhong(vec3 lightDir, vec3 lightColour){

    vec3 normalMapColor = texture(normalMap, fragTexCoords).rgb;

    vec3 normal = normalize(TBN * (normalMapColor * 2.0 - 1.0));
    

    float diffuseMult = max(dot(normalize(normal), lightDir), 0.f);
    vec3 diffuseContribution = diffuseMult * getDiffuseColour();

    vec3 halfVector = normalize((-1 * viewDirection) + lightDir);
    float specularMult = max(dot(halfVector, normal), 0.f);
    specularMult = pow(specularMult, shininess);
    vec3 specularContribuion = specularMult * specularColour;

    float ambientLight = 0.05f;
    vec3 ambientContribution = ambientLight * getAmbientColour();

    vec3 lightContribution = (diffuseContribution + specularContribuion + ambientContribution) * lightColour;
    return lightContribution;

}

这是我的片段着色器
请问大家我需要怎么修改

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-06 09:19
    关注

    引自免费微信小程序:皆我百晓生

    非常抱歉,您的问题有些复杂,似乎您正在尝试解决一个与OpenGL编程相关的视觉化问题。针对这些问题,我会尽力为您提供指导。

    首先,您的代码有一些基本错误。在计算法线贴图时,您没有正确地处理特殊情况。正常情况下,法线的方向应该垂直于光线的方向,但在绘制光线方向和法线方向交点时,这两条线可能会重叠在一起。您可以在计算法线后将法线进行透视转换,使得法线方向可以清晰地看到。

    其次,您对纹理在屏幕上的位置理解有误。您将纹理坐标应用于了顶点着色器,而不是用于描绘法线贴图。这是因为法线贴图并不依赖于纹理的位置,而是依赖于法线方向。您应该在着色器中使用法线贴图参数,如location = 1来表示法线贴图。

    以下是根据上述调整后的代码示例:

    layout (binding = 2) uniform sampler2DArray diffuseTexture;
    
    // 定义法线贴图
    layout(binding = 3) uniform sampler2DArray normalMap;
    vec3 calculateBlinnPhong(vec3 lightDir, vec3 lightcolour){
        vec3 normalMapColor = texture(normalMap, fragTex_coords).rgb;
    
        vec3 normal = normalize(TBN * (normalMapColor * 2.0 - 1.0));
        
    
        float diffuseMult = max(dot(normalize(normal), lightDir), 0.f);
        vec3 diffuseContribution = diffuseMult * getDiffuseColour();
    
        vec3 halfVector = normalize((-1 * viewDirection) + lightDir);
        float specularMult = max(dot(halfVector, normal), 0.f);
        specularMult = pow(specularMult, shininess);
        vec3 specularContribuion = specularMult * specularColour;
    
        float ambientLight = 0.05f;
        vec3 ambientContribution = ambientLight * getAmbient_colour();
    
        vec3 lightContribution = (diffuseContribution + specularContribuion + ambientContribution) * lightcolour;
        return lightContribution;
    
    }
    

    您可以将这段代码复制到新的文件中,并将其粘贴到游戏主循环中的适当位置。此外,您可能还需要根据实际的图形设置调整颜色映射、材质等。

    希望这些建议能帮到您,如果您还有其他问题,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月6日

悬赏问题

  • ¥60 如何批量获取json的url
  • ¥15 对法兰连接元件所承受的表面载荷等效转化为法兰开孔接触面上的等效表面载荷?
  • ¥15 comsol仿真压阻传感器
  • ¥15 Python线性规划函数optimize.linprog求解为整数
  • ¥15 llama3中文版微调
  • ¥15 在win系统Django虚拟环境下载mysqlclient报错
  • ¥15 pg数据库导入数据序列重复
  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)