SDL + OpenGL应用程序:空白屏幕

Loc*_*oco 4 c opengl sdl mingw

我花了最近三天尝试使用SDL + OpenGL创建一个小应用程序.应用程序本身运行良好 - 除了它从不输出任何图形; 只是一个黑屏.

我把它压缩成一个最小的C文件,我希望有人可以给我一些指导.我的想法已经不多了.

我正在使用Windows Vista,MinGW和MSYS.提前感谢任何建议!

#include <SDL/SDL.h>
#include <SDL_opengl.h>

size_t sx=600, sy=600, bpp=32;

void render(void) {
    glEnable(GL_DEPTH_TEST);                                // enable depth testing

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);                   // clear to black
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // clear color/depth buffer
    glLoadIdentity();                                       // reset modelview matrix

    glColor3b(255, 0, 0);                                   // red
    glLineWidth(3.0);                                       // line width=3
    glRecti(10, 10, sx-10, sy-10);                          // draw rectangle

    glFlush();
    SDL_GL_SwapBuffers();
}

int input(void) {
    SDL_Event event;
    while (SDL_PollEvent(&event))
        if (event.type == SDL_QUIT || (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE)) return 0;
    return 1;
}

int main(int argc, char *argv[]) {
    SDL_Surface* surf;

    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) return 0;
    if (!(surf = SDL_SetVideoMode(sx, sy, bpp, SDL_HWSURFACE|SDL_DOUBLEBUF))) return 0;

    glViewport(0, 0, sx, sy);           // reset the viewport to new dimensions
    glMatrixMode(GL_PROJECTION);        // set projection matrix to be current
    glLoadIdentity();                   // reset projection matrix
    glOrtho(0, sx, sy, 0, -1.0, 1.0);   // create ortho view
    glMatrixMode(GL_MODELVIEW);         // set modelview matrix
    glLoadIdentity();                   // reset modelview matrix

    for (;;) {
        if (!input()) break;
        render();
        SDL_Delay(10);
    }

    SDL_FreeSurface(surf);
    SDL_Quit();
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

更新:我有一个有效的版本,但它改变了正交观点.我不确定为什么这样做而另一个没有,但是为了将来参考,这里有一个有效的版本:

#include <SDL/SDL.h>
#include <SDL_opengl.h>

size_t sx=600, sy=600, bpp=32;

void render(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();                                       // set location in front of camera
    glTranslated(0, 0, -10);

    glBegin(GL_QUADS);                                      // draw a square
        glColor3d(1, 0, 0);
        glVertex3d(-2,  2,  0);
        glVertex3d( 2,  2,  0);
        glVertex3d( 2, -2,  0);
        glVertex3d(-2, -2,  0);
    glEnd();

    glFlush();
    SDL_GL_SwapBuffers();
}

int input(void) {
    SDL_Event event;
    while (SDL_PollEvent(&event))
        if (event.type == SDL_QUIT || (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE)) return 0;
    return 1;
}

int main(int argc, char *argv[]) {
    SDL_Surface *surf;

    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) return 0;
    if (!(surf = SDL_SetVideoMode(sx, sy, bpp, SDL_OPENGL))) return 0;

    glViewport(0, 0, sx, sy);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, (float)sx / (float)sy, 1.0, 100.0);
    glMatrixMode(GL_MODELVIEW);

    glClearColor(0, 0, 0, 1);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);

    for (;;) {
        if (!input()) break;
        render();
        SDL_Delay(10);
    }

    SDL_FreeSurface(surf);
    SDL_Quit();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gen*_*ult 10

在第一个代码块中,将您的glColor3b()呼叫更改为glColor3ub().或者传递127而不是255.

  • OMIGOSH!而已!万分感谢,先生,你是个天才.:) (2认同)