1

私は自分のコードでこの奇妙なバグに直面していて、何も描画できません...

void render(void) {
    glClear(GL_COLOR_BUFFER_BIT);

    glLineWidth(4.0);
    glPointSize(4.0);
    glColor3i(0, 1, 1);
    glBegin(GL_POINTS);
        glVertex2i(0, 0);
        glVertex2i(2, 2);
        glVertex2i(3, 3);
    glEnd();
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    int Largura, Altura;

    //width
    Largura = (abs(Plano::MinX) * Plano::EspacoPix) + (abs(Plano::MaxX) * Plano::EspacoPix);
    //height
    Altura  = (abs(Plano::MinY) * Plano::EspacoPix) + (abs(Plano::MaxY) * Plano::EspacoPix);
    // these are cartesian coordinates,
    // at class Plano: enum Dimension {MinY=-50, MaxY=50, MinX=-50, MaxX=50, EspacoPix=5};

    glutInit(&argc, argv);
    glutInitWindowPosition(-1, -1);
    glutInitWindowSize(Largura, Altura);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glClearColor(1, 1, 1, 1);
    glutCreateWindow("Graphix");
    glMatrixMode(GL_PROJECTION);
    //glEnable(GL_POINT_SMOOTH);
    //glEnable(GL_LINE_SMOOTH);
    gluOrtho2D(Plano::MinX, Plano::MaxX, Plano::MinY, Plano::MaxY); // left, right, bottom, top

    glutDisplayFunc(render);
    glutIdleFunc(render);


    std::cout << "[Dbg] Dimensions:  Height=" << Altura << "px Width=" << Largura << "px " << std::endl;
    std::cout << "[Dbg] Ortho: Left=" << Plano::MinX << ", Right=" << Plano::MaxX << ", Bottom=" << Plano::MinY << ", Top=" << Plano::MaxY << std::endl;
    //glGet with argument GL_COLOR_CLEAR_VALUE
    float cores[4] = {-1, -1, -1, -1}; // defaults
    glGetFloatv(GL_COLOR_CLEAR_VALUE, cores);
    std::cout << "[Dbg] Color Buffer: R=" << cores[0] << " G=" << cores[1] << " B=" << cores[2] << " A=" << cores[3] << std::endl;


    glutMainLoop();
    return(0);
}

私が得るのは黒い画面だけで、カラーバッファは1、1、1、1になりますが、実際には0、0、0、0です...間違っていても画面の中央にある場合は修正してくださいgluOrtho2D呼び出しのため、x = 0、y = 0ですよね?右?:)

4

2 に答える 2

5

OpenGLコンテキストはまだ作成されていないため、glClearColorはglutCreateWindowの後に呼び出す必要があります。

また、古いOpenGLプログラミング手法を学習していることにも注意してください。

glColor、glBegin、glEnd、glVertex *、glColor * glMatrixMode、gluOrtho2D、glu*はすべて非推奨の関数になりました。

一部の人々は彼らが学ぶのが簡単かもしれないと思います、しかし私はそれがそれほど多くはないと思います、そしてそれはあなたが学ばなくてはならないすべてのものです。

glBegin()とglEnd()を使用すると、オブジェクトを一度に1頂点ずつ描画できますが、これは非常に低速です。

新しい方法では、座標をフロートの配列に入れ、それをグラフィックカードに送信して一度に描画します。OpenGL 1.1(1997年にリリース)がVertexアレイをサポートして以来、古いものをすべてとして使用する理由はありません(ただし、現在は非推奨であり、代わりに機能が類似していて、 1.5(2005年にリリース)からOpenGLに含まれています。

初心者にとって難しくない新しいチュートリアルについては、 http: //www.opengl-tutorial.org/を参照することをお勧めします。

また、ここでの私の返信:https ://gamedev.stackexchange.com/questions/32876/good-resources-for-learning-modern-opengl-3-0-or-later/32917#32917

于 2012-07-26T04:00:23.623 に答える
0

これまでOpenGL2のコーディングはあまり行っていませんが、glBeginを呼び出す前にglLoadIdentity()を呼び出す必要があり、glMatrixModeの前にglLoadIdentity()を呼び出す必要があると思います。

于 2012-07-26T03:16:15.630 に答える