众所周知,几乎所有 3D 软件的视图部分都有一个 XYZ 轴。假设像这样画一个坐标轴。这是我的方法。
首先,有一个名为drawOneAxis()的函数用于仅绘制一个轴。我们调用它三次。但是,每次绘制轴之前,都要更改模型矩阵,以便我们可以得到三个相互垂直的轴。这就是函数changeUniform_MVP()所做的。
void draw()
{
for (int i = 0; i < 3; i++) // 0 - X axis, 1 - Y axis, 2 - Z axis
{
changeUniform_MVP(i);
drawOneAxis();
}
}
顶点着色器:
#version 110
uniform mat4 MVP;
void main()
{
gl_Position = MVP * gl_Vertex;
}
在函数init()中,着色器被成功编译和链接,我们得到一个名为programID的程序 ID 。在init()结束时,我们通过调用glUseProgram( programID )来使用着色器。
我的两台电脑上的结果:
PC 1: intel card, openGL 3.1, all is well
PC 2: intel card, openGL 2.1, only one axis is drew (Z axis)
为什么我们在这里得到两个不同的结果?
一件神奇的事!!!在函数draw()中添加两行代码后,PC2 上的结果是正确的。
void draw()
{
for (int i = 0; i < 3; i++)
{
glUseProgram(programID); // 1
changeUniform_MVP(i);
drawOneAxis();
glUseProgram(0); // 2
}
}
看来我们每次画东西时都必须重新设置程序。但我认为这是不必要的,因为我们使用相同的着色器来绘制所有的东西。我对此感到非常困惑。
它是旧英特尔卡驱动程序的错误吗?为什么加上这两行代码就OK了?