1

私はopenglを学んでいて、(1つの変数から)50個のテクスチャを描画したいです。これは私がしていることです:更新メソッドで:

public void update(){
    while(!Display.isCloseRequested()){
        input();
        for(int x = 0; x< 100; x++){
            block = new GrassBlock(x*32,10);
            block.draw();
        }
        Display.update();   
        Display.sync(60);
    }
}

これは私がopenGLを初期化する方法です:

    private void initGL(){
    glEnable(GL_TEXTURE_2D);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glViewport(0, 0,640 , 480);
    glMatrixMode(GL_MODELVIEW);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,640 , 480, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
}

これはGrassBlockの描画方法です:

@Override
public void draw() {
    grass.bind();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(100, 100);
    glTexCoord2f(1, 0);
    glVertex2f(100+grass.getTextureWidth(),100);
    glTexCoord2f(1,1);
    glVertex2f(100+grass.getTextureWidth(),100+grass.getTextureHeight());
    glTexCoord2f(0,1);
    glVertex2f(100,100+grass.getTextureHeight());
    glEnd();
}

また、ブロックの作成はループするので update メソッドに入れられないことはわかっていますが、1 つの変数から複数のテクスチャを描画できることをどのように解決すればよいでしょうか?

今では1つしか取得できず、常にちらつきます。

4

1 に答える 1

2

深度バッファをクリアするのを忘れた可能性があります

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                            ^^^^^^^^^^^^^^^^^^^^^

また、すべてのコードは、initGL実際には再描画関数の先頭に属しています。ビューポートの寸法は、グラフィックス システムからウィンドウのサイズを要求することによって取得する必要があります。

glViewport(0, 0,640 , 480);
glMatrixMode(GL_MODELVIEW); <<<<<<<<
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

そこにあるモデルビュー マトリックスへの切り替えは、直後にプロジェクションに戻るため、何もしません。

描画関数の開始時にすべての行列を同一性にリセットし、既知の状態を開始することをお勧めします。

于 2012-07-07T10:26:17.007 に答える