GLSL和glBegin(GL_TRIANGLES)不起作用

时间:2012-06-28 08:35:13

标签: c++ opengl glsl

此代码仅呈现十二面体并完全忽略glBegin(GL_TRIANGLES)块:

glutSolidDodecahedron();
glBegin(GL_TRIANGLES);
glNormal3f(1, 0, 0);
glVertex3f(11, 0, 0);
glNormal3f(0, 1, 1);
glVertex3f(-11, 0, 0);
glNormal3f(0, 0, 1);
glVertex3f(0, 0, 11);
glEnd();

这两个着色器非常简单:

顶点着色器:

varying vec3 normal;
void main()
{   
gl_Position = ftransform();
gl_FrontColor = gl_Color;
gl_BackColor = gl_Color;
normal =  gl_Normal;
normal = gl_NormalMatrix  * normal;
}

和frag:

uniform vec3 lightDir;
varying vec3 normal;
void main()
{
    float intensity = dot(lightDir, normal);
    gl_FragColor =  0.5 * (1.5 + intensity) * gl_Color;
}

虽然glutSolidX类型的函数适用于此示例(基于Lightouse3D教程),但如何快速绘制三角形,从一帧到另一帧更改坐标(我尝试过数组和GL_DYNAMIC_DRAW,但是与旧的“固定管道”方法相比,这工作太多了。我看到其他人仍然成功地使用glBegin(..); glEnd();块与GLSL着色器成功,所以它必须是可能的。可能会遗漏什么?

1 个答案:

答案 0 :(得分:5)

glBegin / glEnd块中三角形顶点的坐标是

 11, 0,  0
-11, 0,  0
  0, 0, 11

这意味着它在视图中完全平坦。这就像从一个如此坚硬的角度观看一张纸,它就变成了一条线。因为三角形没有厚度,所以甚至不绘制这条线,三角形看起来不可见。