0

私は現在 OpenGL を学習しており、SDL2 で使用しています。単純なプログラムを実行しようとすると、黒い画面が表示されます。どんな助けでも大歓迎です。OpenGL 2.1 と vc コンパイラを使用しています。

これが私のコードです

#include <iostream>
#include <SDL.h>
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>

using namespace std;

int main(int argc, char* argv[]) {
    int width, height;

    width = 640;
    height = 480;

    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Window* win;
    win = SDL_CreateWindow("SDL Application", 100, 100, width, height, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);

    SDL_GLContext context;
    context = SDL_GL_CreateContext(win);

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    height = (height <= 0) ? height = height : height = 1;
    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(45.0f, (GLfloat) width / (GLfloat) height, 0.1f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glShadeModel(GL_SMOOTH);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    SDL_GL_SwapWindow(win);

    glColor3f(1.0f, 1.0f, 1.0f);

    glTranslatef(-1.5f, 0.0f, -6.0f);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 0.0f);
    glEnd();

    glTranslatef(3.0f, 0.0f, 0.0f);

    glBegin(GL_QUADS);
        glVertex3f(-1.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 0.0f);
    glEnd();

    SDL_Delay(5000);

    SDL_GL_DeleteContext(context);
    SDL_DestroyWindow(win);

    SDL_Quit(); 
    return 0;
}
4

1 に答える 1

1

それらの順序は間違っています:

SDL_GLContext context;
context = SDL_GL_CreateContext(win);

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

OpenGL コンテキスト属性は、コンテキストを作成する前に設定する必要があります (コンテキスト作成プロセスを制御する状態変数です)。

これは意味がありません: 最初にクリアし、次にスワップし、次に描画し (バック バッファの内容はスワップ後に未定義であるため、未定義のバック バッファに)、次にスワップしません

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

SDL_GL_SwapWindow(win);

glColor3f(1.0f, 1.0f, 1.0f);

/* this translate will move the triangle out
 * of the NDC space i.e. it gets clipped or
 * won't be visible at all. */
glTranslatef(-1.5f, 0.0f, -6.0f);

glBegin(GL_TRIANGLES);
  glVertex3f(0.0f, 1.0f, 0.0f);

これは次のようなものでなければなりません

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);

glBegin(GL_TRIANGLES);
    glVertex3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

glTranslatef(3.0f, 0.0f, 0.0f);

glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();

SDL_GL_SwapWindow(win);
SDL_Delay(5000);

まったく意味を成すために。コードの残りの部分にはまだ多くの問題がありますが、そのように変更すると、少なくとも黒地に白い三角形が表示されるはずです。

于 2013-09-12T01:00:25.677 に答える