我使用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;
}
答案 0 :(得分:3)
所有顶点属性数组(无论是内置的还是用户定义的)都为每个顶点提供数据,顶点着色器调用与从数组中提取的元素之间的比率为1:1。 OpenGL没有“面部法线”的概念。您可以使用flat interpolation和knowledge of the provoking vertex来创建面法线的效果,但输入数据仍然必须为每个顶点设置法线。