0

次のコードを検討してください。

#include <stdlib.h>
#include <stdarg.h>
#include <GLUT/GLUT.h>
#include <OpenGL/OpenGL.h>

double width=600;
double height=600;

void processMouse(int button, int state, int x, int y)
{
    glColor4f(1.0,0.0,0.0,0.0);
    glBegin(GL_POLYGON);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(1.0, 0.0, 0.0);
    glVertex3f(1.0, 1.0, 0.0);
    glVertex3f(0.0, 1.0, 0.0);
    glEnd();
    glFlush();
}

static void render()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
    glutMouseFunc(processMouse);
}

int main(int argc, char **argv)
{
    glutInit(&argc,argv);                                         
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);   
    glutInitWindowSize(width, height);
    glutCreateWindow("Board");  
    glutDisplayFunc(render);
    glutMainLoop();
}

render 関数が実行され、クリックが実行されるたびに関数 processMouse が開始されます。したがって、マウスをクリックすると、すべてのウィンドウが赤くなり、次の指示が表示されます。

    glColor4f(1.0,0.0,0.0,0.0);
    glBegin(GL_POLYGON);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(1.0, 0.0, 0.0);
    glVertex3f(1.0, 1.0, 0.0);
    glVertex3f(0.0, 1.0, 0.0);
    glEnd();
    glFlush();

しかし、マウスをクリックすると、奇妙な動作に気付きます: ウィンドウの一部のみ、(画面全体ではなく) 左下の部分だけが色付きます。Google Chrome ウィンドウを開くまで、ウィンドウはこの状態のままです。Google Chrome (または別のグラフィカル アプリケーション) を開くと、すべてのウィンドウが赤くなります。なぜこれ?より複雑なプログラムにも問題があります.glVertex命令が無視されることがあるようです.fprintfでプログラムをデバッグしようとすると、すべて問題ないように見え、すべてが期待どおりに進むようです(たとえば、マウス座標を印刷しようとしましたprocessMouse 関数では、それらは問題ありませんでした)、私が描いたものが無視されるという事実を除いて。

編集:このコードを変更しましたが、まだ同じ問題があります:

#include <stdlib.h>
#include <stdarg.h>
#include <GLUT/GLUT.h>
#include <OpenGL/OpenGL.h>

double width=600;
double height=600;
bool down=false;;

// http://elleestcrimi.me/2010/10/06/mouseevents-opengl/


static void render()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
    if(down)
    {
        glColor4f(1.0,0.0,0.0,0.0);
        glBegin(GL_POLYGON);
        glVertex3f(0.0, 0.0, 0.0);
        glVertex3f(1.0, 0.0, 0.0);
        glVertex3f(1.0, 1.0, 0.0);
        glVertex3f(0.0, 1.0, 0.0);
        glEnd();
        glFlush();
    }
}

void processMouse(int button, int state, int x, int y)
{
    if(state==GLUT_DOWN)
    {
        down=true;
        glutPostRedisplay();
    }
}


int main(int argc, char **argv)
{
glutInit(&argc,argv);                                         
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);   
glutInitWindowSize(width, height);
glutCreateWindow("Board"); 
glutMouseFunc(processMouse);
glutDisplayFunc(render);
glutMainLoop();
}

まだ画面の一部だけが赤くなっています。

PS: glutSwapBuffers() を使用して解決しました、ありがとう。

4

1 に答える 1

1

GLUT でダブル バッファリングを使用している場合は、呼び出しglutSwapBuffers()て描画の結果を確認する必要があります。

これを関数の最後に追加すると、render()正常に機能します。

于 2012-04-10T02:06:16.360 に答える