Opengl 基本逐顶点Phong着色器有暗点

Opengl 基本逐顶点Phong着色器有暗点,opengl,glsl,opengl-3,lighting,Opengl,Glsl,Opengl 3,Lighting,我刚刚开始学习OpenGL3.x,我正在尝试在OpenGL4.4中实现一个基本的ADS/Phong着色器 不幸的是,我在低保利版本的斯坦福兔子下面发现了这些奇怪的黑点。在使用了其他一些模型后,我得出结论,罪魁祸首不可能是兔子,所以它可能是我的着色器 顶点着色器 #version 330 layout(location = 0) in vec3 vertexPosition_modelspace; layout(location = 1) in vec3 vertex_normal; ou

我刚刚开始学习OpenGL3.x,我正在尝试在OpenGL4.4中实现一个基本的ADS/Phong着色器

不幸的是,我在低保利版本的斯坦福兔子下面发现了这些奇怪的黑点。在使用了其他一些模型后,我得出结论,罪魁祸首不可能是兔子,所以它可能是我的着色器

顶点着色器

#version 330

layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec3 vertex_normal;

out vec3 lightIntensity;

uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelMatrix;

// Diffuse
// K REFLECTIVITY, L SOURCE INTENSITY
// a AMBIENT, d DIFFUSE, s SPECULAR
struct Light{
    vec3 position;
    vec3 La;
    vec3 Ld;
    vec3 Ls;
};
uniform Light light;

struct Material{
    float shininess;
    vec3 Ka;
    vec3 Kd;
    vec3 Ks;
};
uniform Material material;

void main(){    
    vec4 vertex = vec4(vertexPosition_modelspace, 1.0f);
    vec4 eyeCoords = modelMatrix * vertex;

    vec3 n = normalize(vertex_normal); // Normal
    vec3 s = normalize(light.position - eyeCoords.xyz); // D tw light
    vec3 v = normalize(eyeCoords.xyz);
    vec3 r = reflect(-s, n);
    float sDotN = max(dot(s, n), 0.0);

    vec3 ambient = light.La * material.Ka;
    vec3 diffuse = light.Ld * material.Kd * sDotN;
    vec3 specular = vec3(0.0f);

    if(sDotN > 0.0f){
        specular = light.Ls * material.Ks * pow(max(dot(r, v), 0.0), material.shininess);
    }

    lightIntensity = ambient + diffuse + specular;

    gl_Position = modelViewProjectionMatrix * vertex;
}

是什么导致了这种情况?我该如何修复它?

结果是我传递的是顶点而不是法线-我完全破坏了我的模型加载程序。现在一切都很好,如果传递了正确的制服,上述代码将起作用

你确定法线计算正确吗?@smani再次查看.obj文件,我实际上找不到任何以vn为前缀的线-我正在使用assimp填充顶点和法线数组-我不确定它是否生成法线,因为它们没有指定。我将尝试寻找另一个明确指定法线的模型。如果法线是自动生成的,另一个罪魁祸首可能是多边形的方向不一致,因此一些法线的方向不正确。若要检查所有多边形的方向是否相同,请使用前(或后)面剔除进行绘制,并检查几何体中是否有孔。@smani我正在使用后面剔除和深度测试进行绘制。刚刚尝试了另一个模型,它确实指定了它的法线,这是完全相同的故事。这里是一个球体模型,有完全相同的问题:-我正在使用assimp中的aiProcess\u FlipWindingOrder标志。