为什么此 GLSL 代码在旧的英特尔卡 (openGL 2.1) 上不起作用?



我们知道,几乎所有的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
    }
}

似乎每次我们画东西时都必须重置程序。但我认为这是不必要的,因为我们使用相同的着色器来绘制所有的东西。我对此很困惑。

是旧Intel卡驱动程序的bug吗?为什么添加两行代码后就OK了?

难以回答。旧的Intel OpenGL驱动确实有问题。

drawThreeAxes也许()?

最新更新