SDL + OpenGL应用程序:空白屏幕
我花了三天的时间尝试使用SDL + OpenGL创建一个小应用程序。该应用程序本身运行良好 - 除了它从不输出任何图形;只是一个黑屏。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);
}
更新:我有一个可行的版本,但它改变正交透视。我不知道为什么这个工程和其他没有,但以供将来参考,这里是可用的版本:
#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;
}
在第一个代码块,改变你的glColor3b()
呼叫glColor3ub()
。或者传入127而不是255。
OMIGOSH!而已!万分感谢,先生,你是一个天才。 :) – Lococo 2010-05-17 22:04:58
试试你SDL_SetVideoMode()
调用之前设置一些GL attributes:
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)))
非常感谢提示。我修改了我的问题,以便发布可用的版本。 SDL_OPENGL绝对是一个问题。在工作版本中,如果我将SDL_HWSURFACE | SDL_DOUBLEBUF放回原处,它将再次变黑。但在原始代码中用SDL_OPENGL替换它们并没有帮助。此外,工作代码在没有SDL_GL_SetAttribute()调用的情况下工作正常,尽管进行这些调用可能是一个好主意。 – Lococo 2010-05-17 19:33:00
您可能已经尝试过了,但以防万一您没有:'glOrtho(0,sx,0,sy,-1.0,1.0);'。 (OpenGL的y轴通常从下到上) – kloffy 2010-05-17 16:45:26
SDL 1.2或1.3? – genpfault 2010-05-17 18:19:53
@kloffy,感谢您的建议,但不幸的是,这并没有改变任何内容。 – Lococo 2010-05-17 19:20:32