为什么这个GLSL代码不适用于旧的Intel卡(openGL 2.1)?

时间:2013-04-18 02:35:38

标签: opengl glsl shader intel vertex-shader

众所周知,几乎所有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)

为什么我们在这里得到两个不同的结果? 一个神奇的事情!!!添加两行代码后,结果在PC2上正确 draw()

void draw()
{
    for (int i = 0; i < 3; i++)
    {
        glUseProgram(programID);  // 1
        changeUniform_MVP(i);
        drawOneAxis();
        glUseProgram(0);  // 2
    }
}

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

这是旧版英特尔卡驱动程序的错误吗?添加两行代码后为什么还行?

1 个答案:

答案 0 :(得分:0)

很难回答。较旧的英特尔OpenGL驱动程序确实存在问题。

drawThreeAxes()也许?