2010-05-17 5 views
4

Я провел последние три дня, пытаясь создать небольшое приложение, используя SDL + OpenGL. Само приложение работает отлично - за исключением того, что он никогда не выводит никакой графики; просто черный экран.SDL + OpenGL app: пустой экран

Я сократил его до минимального файла 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); 
} 

UPDATE: У меня есть версия, которая работает, но она меняет орфографическую перспективу. Я не знаю, почему это работает, а другой нет, но в будущем, вот версия, которая работает:

#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; 
} 
+0

Возможно, вы уже это пробовали, но на всякий случай у вас нет: 'glOrtho (0, sx, 0, sy, -1.0, 1.0);'. (OpenGL y-axis обычно идет снизу вверх.) – kloffy

+0

SDL 1.2 или 1.3? – genpfault

+0

@kloffy, спасибо за это предложение, но, к сожалению, это ничего не изменило. – Lococo

ответ

10

в первом блоке кода, измените glColor3b() вызов glColor3ub(). Или перейдите в 127 вместо 255.

+2

OMIGOSH! Это оно! Спасибо, миллион, сэр, вы гений. :) – Lococo

4

Попробуйте установить некоторые GL attributes до вашего SDL_SetVideoMode() вызова:

SDL_GL_SetAttribute(SDL_GL_RED_SIZE,  5); 
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); 
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); 
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 5); 
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 

Также , проходят в SDL_OPENGL вместо SDL_HWSURFACE | SDL_DOUBLEBUF:

if (!(surf = SDL_SetVideoMode(sx, sy, bpp, SDL_OPENGL))) 
+1

Большое спасибо за советы. Я изменил свой вопрос, чтобы опубликовать версию, которая работает. SDL_OPENGL определенно был проблемой. В рабочей версии, если я верну SDL_HWSURFACE | SDL_DOUBLEBUF, он снова станет черным. Но замена их SDL_OPENGL в исходном коде не помогает. Кроме того, рабочий код работает отлично без вызовов SDL_GL_SetAttribute(), хотя, вероятно, это хорошая идея для этих вызовов. – Lococo

Смежные вопросы