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 来创建面法线的效果,但您的输入数据仍必须为每个顶点提供法线。
我使用 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 来创建面法线的效果,但您的输入数据仍必须为每个顶点提供法线。