1

そのため、opengl ゲームにはいくつかの異なるオブジェクトがあります。テクスチャをロードするか、頂点に色を付けると、ゲーム内の他のすべてのオブジェクトにそのテクスチャが与えられるか、それらの頂点に色が付けられます。たとえば、テクスチャ「a」を適用する立方体がたくさんあります。次に、テクスチャ 'b' を適用するスカイボックスがあります。次に両方をレンダリングすると、何らかの理由で両方ともテクスチャ 'b' になります。glPushMatrix()キューブをレンダリングするときにandを呼び出しますglPopMatrix()が、なぜスカイボックスのテクスチャを持っているのでしょうか? ここにいくつかのコードがあります:

public void render() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glLoadIdentity();

    glRotatef(input.xrot, 1.0f, 0, 0);
    glRotatef(input.yrot, 0, 1.0f, 0);

    glTranslatef(-input.xpos, -input.ypos - 19, -input.zpos - 5);

    box.render();
    chunk.render();
    BitMapFont.drawString("X: " + (int)-input.xpos + " Y: " + (int)-input.ypos + " Z: " + (int)-input.zpos, 10, 0);
}

チャンク クラスのレンダリング メソッド:

public void render() {
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboV);
    glVertexPointer(vertSize, GL_FLOAT, 0, 0L);

    GL15.glBindBuffer(GL15.GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING, vboT);
    glTexCoordPointer(3, GL_FLOAT, 0, 0L);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glPushMatrix();
    glDrawArrays(GL_QUADS, 0, vertSize * vertAmount * faceAmount * currentBlockCount);
    glPopMatrix();

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

そして、私のスカイボックスクラス:

public class SkyBox {

Texture tex;

int x, z, y, offSet;

public void bindTex() {
    tex.bind();
}

public SkyBox(int x, int z, int y) {
    this.x = x;
    this.z = z;
    this.y = y;
    this.offSet = 128;
    try {
        tex = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/Blocks/air.png")));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void render() {

    glBegin(GL_QUADS);

    glTexCoord2f(0, 0);
    glVertex3f(x, z, y);
    glTexCoord2f(1, 0);
    glVertex3f(x + offSet, z, y);
    glTexCoord2f(1, 1);
    glVertex3f(x + offSet, z, y + offSet);
    glTexCoord2f(0, 1);
    glVertex3f(x, z, y + offSet);

    glTexCoord2f(1, 0);
    glVertex3f(x, z, y + offSet);
    glTexCoord2f(1, 0);
    glVertex3f(x + offSet, z, y + offSet);
    glTexCoord2f(1, 1);
    glVertex3f(x + offSet, z + offSet, y + offSet);
    glTexCoord2f(0, 1);
    glVertex3f(x, z + offSet, y + offSet);

    glTexCoord2f(0, 0);
    glVertex3f(x + offSet, z, y);
    glTexCoord2f(0, 1);
    glVertex3f(x + offSet, z + offSet, y);
    glTexCoord2f(1, 1);
    glVertex3f(x + offSet, z + offSet, y + offSet);
    glTexCoord2f(0, 1);
    glVertex3f(x + offSet, z, y + offSet);

    glTexCoord2f(0, 0);
    glVertex3f(x, z + offSet, y);
    glTexCoord2f(1, 0);
    glVertex3f(x, z, y);
    glTexCoord2f(1, 1);
    glVertex3f(x, z, y + offSet);
    glTexCoord2f(0, 1);
    glVertex3f(x, z + offSet, y + offSet);

    glTexCoord2f(0, 0);
    glVertex3f(x, z + offSet, y + offSet);
    glTexCoord2f(1, 0);
    glVertex3f(x + offSet, z + offSet, y + offSet);
    glTexCoord2f(1, 1);
    glVertex3f(x + offSet, z + offSet, y);
    glTexCoord2f(0, 1);
    glVertex3f(x, z + offSet, y);

    glTexCoord2f(0, 0);
    glVertex3f(x, z + offSet, y);
    glTexCoord2f(1, 0);
    glVertex3f(x + offSet, z + offSet, y);
    glTexCoord2f(1, 1);
    glVertex3f(x + offSet, z, y);
    glTexCoord2f(0, 1);
    glVertex3f(x, z, y);

    glEnd();
}

では、なぜすべてが台無しになっているのでしょうか。

4

2 に答える 2

2

アクティブなマトリックスのプッシュとポップは、マトリックスを格納または取得するだけです。テクスチャの状態やその他の属性など、その他の状態には影響しません。

古い OpenGL API には一部のレンダリング状態をプッシュおよびポップする機能がありましたが (「 」を参照glPushAttrib())、これは最近のバージョンから削除されました。

そのため、現在のプログラミング モデル (および他のほとんどすべてのレンダリング API) で期待されている状態管理を自分で行うことをお勧めします。また、一般的な固定関数レンダリング パイプラインなど、ここで依存している他の非推奨関数の使用を停止することもお勧めします。

于 2013-03-24T19:49:21.517 に答える
0

OpenGL はステート マシンです。つまり、適切な使用法は次のようになります。

render() {
    setTexture(textId_1)
    glPushMatrix();
        // set transformations related to this object
        drawObject_1()
    glPopMatrix();

    setTexture(textId_2)
    glPushMatrix();
        // set transformations related to this object
        drawObject_2()
    glPopMatrix();
}

テクスチャを設定すると (読み込み時に)、すべてのオブジェクトがそれを使用するテクスチャになります。同じことがマトリックス、マテリアルなどにも当てはまります。もちろん、固定パイプライン (OpenGL 1.5) について話しているときです。最新の OpenGL (3.+) では、さらにいくつかのオプションがあります。

glPushMatrix/glPopMatrixマトリックス スタックにのみ使用されます。マトリックス ボットの状態を保存できます。テクスチャ、マテリアルなどには影響しません。

于 2013-03-24T19:51:29.350 に答える