glNormalPointer 定义一个顶点数组或面法线?

glNormalPointer define an array of vertex or faces normals?

我使用 glNormalPointer() 在我的代码中加载法线值。问题是我无法理解应该为每个顶点或每个面加载哪些法线?有趣的是,我尝试了两种变体,但没有发现任何差异。

您能否说明我应该将哪些法线传递给着色器?

我在以下顶点着色器中使用法线:

#version 120

void main() {
    vec3 normal, lightDir;
    vec4 diffuse, ambient, globalAmbient;
    float NdotL;

    normal = gl_NormalMatrix * gl_Normal;
    gl_Position = gl_ModelViewProjectionMatrix *  gl_Vertex;
    // Calculate color
    lightDir = normalize(vec3(gl_LightSource[0].position));
    NdotL = max(abs(dot(normal, lightDir)), 0.0);
    diffuse = gl_Color * gl_LightSource[0].diffuse;
    ambient = gl_Color * gl_LightSource[0].ambient;
    globalAmbient = gl_LightModel.ambient * gl_Color;
    gl_FrontColor =  NdotL * diffuse + globalAmbient + ambient;
 }

所有顶点属性数组,无论是内置的还是用户定义的,都为每个顶点提供数据,顶点着色器调用与从数组中获取的元素之间的比率为 1:1。 OpenGL没有"face normals"的概念。您可以使用 flat interpolation and knowledge of the provoking vertex 来创建面法线的效果,但您的输入数据仍必须为每个顶点提供法线。