0

ご存知のように、ほとんどすべての 3D ソフトウェアには、ビュー セクションに XYZ 軸があります。そのような座標軸を描くとします。これが私の方法です。

まず、1 つの軸だけを描画するために使用されるdrawOneAxis()という名前の関数があります。3 回呼び出します。ただし、軸を描画する前に、モデル マトリックスを変更して、互いに垂直な 3 つの軸を取得できるようにします。これは関数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 )を呼び出してシェーダーを使用します。

私の2台のコンピューターでの結果:

PC 1: intel card, openGL 3.1, all is well
PC 2: intel card, openGL 2.1, only one axis is drew (Z axis)

ここで 2 つの異なる結果が得られるのはなぜですか?
1 つの魔法のこと !!! 関数draw()に 2 行のコードを追加すると、結果は PC2 で正しくなります。

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

何かを描くたびにプログラムをリセットしなければならないようです。でも同じシェーダーで全部描いているので不要だと思います。私はこれについて非常に混乱しています。

古いIntelカードのドライバのバグですか?2 行のコードを追加しても問題ないのはなぜですか?

4

1 に答える 1