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

时间:2018-02-10 17:43:17

标签: opengl 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 个答案:

答案 0 :(得分:3)

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