同时使用SDL和OpenGL进行渲染

3

大家好,我很新于OpenGL(今天刚开始认真学习它),我正在尝试使用它来为我的SDL游戏增加3D效果。下面是我设置的一个小型测试程序:

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

int main(int argc, char *argv[])
{
   SDL_Event event;
   float theta = 0.0f;

   SDL_Init(SDL_INIT_VIDEO);
   SDL_Surface *screen = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL | SDL_HWSURFACE | SDL_RESIZABLE | SDL_FULLSCREEN);

   glViewport(0, 0, 800, 600);
   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
   glClearDepth(1.0);
   glDepthFunc(GL_LESS);
   glEnable(GL_DEPTH_TEST);
   glShadeModel(GL_SMOOTH);
   glMatrixMode(GL_PROJECTION);
   glMatrixMode(GL_MODELVIEW);

   int done;

   for(done = 0; !done;)
   {

      SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 0, 0));

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      glLoadIdentity();
      glTranslatef(0.0f,0.0f,0.0f);
      glRotatef(theta, 0.0f, 0.0f, 1.0f);
      glBegin(GL_TRIANGLES);
      glColor3f(0.83f, 0.83f, 0.0f);
      glVertex2f(0.0f, 1.0f);
      glColor3f(0.83f, 0.83f, 0.0f);
      glVertex2f(0.87f, -0.5f);
      glColor3f(0.83f, 0.83f, 0.0f);
      glVertex2f(-0.87f, -0.5f);
      glEnd();

      theta += 10.0f;
      SDL_Flip(screen);
      SDL_GL_SwapBuffers();
      SDL_PollEvent(&event);
      if(event.key.keysym.sym == SDLK_ESCAPE)
         done = 1;
   }
}

我的问题是,我尝试渲染的红色背景从未被渲染,只有OpenGL三角形被渲染。

感谢任何能够帮助我的人。非常感激。


3
我建议只使用OpenGL,而不是两者同时使用。 - Newbie
回应非常差。SDL拥有一个OpenGL所没有的出色的输入和声音框架。如果我能够弄清楚如何让SDL的渲染与OpenGL一起工作,而不是仅使用OpenGL进行渲染,那么它将加速我的开发进度。 - Rob S.
5
我建议仅使用OpenGL进行绘图,这样会更加高效。 - Newbie
4个回答

4

OpenGL有一个简单的规则:它与其他程序不兼容。在您的情况下,双缓冲交换(由SDL_GL_SwapBuffers发起)将以某种方式替换窗口中未由OpenGL渲染的所有内容。

只需使用OpenGL绘制所有内容即可。


兄弟,谢谢,我明白了。你有关于如何将纹理应用到四边形/三角形等的阅读材料吗? - Rob S.
GLuint texID; glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D); for(int mipmap_level=0; mipmap_level < levels ; ++mipmap_level){ glTexImage2D(GL_TEXTURE_2D, GL_RGBA, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, texture_data[mipmap_level]); } -- 这是简短的版本。nehe.gamedev.net上有相关教程。或者你可以等几个月,直到我的OpenGL书籍发布为止;-) - datenwolf

0

你可以使用SDL_FillRect在一行中填充后备缓冲区,然后用glClear在下一行中清除它。你尝试过交换操作的顺序吗?

并不是说我不同意被接受的答案;一般来说,尝试混合软件渲染方法和OpenGL最多只会让人产生困惑,但在这种情况下你可能会有所收获。

至于渲染纹理四边形,你应该能够从NeHe lesson 6当中找到方法。虽然人们抱怨NeHe,但它是一个合理的入门指南。只是不要将其作为良好编码或高效现代OpenGL用法的示例。从这里开始,逐步转向更复杂的内容。


0

如果你正在使用C++,SFML库可能是一个更好的选择(虽然它有C绑定,但我没有尝试过)。它与OpenGL很好地配合,并具有与GL协同工作的功能。据我所知,SFML函数本身使用GL进行渲染。虽然,我建议你只使用GL调用进行渲染,如上所述。


0

你的SDL_FillRect不显示为红色,因为之后你调用了带有GL_COLOR_BUFFER_BIT标志的glClear函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接