同时从SDL和OpenGL渲染

时间:2010-12-18 20:33:08

标签: c++ c opengl sdl

嘿所有,我是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三角形。

提前感谢任何可以帮助我的人。非常感谢。

4 个答案:

答案 0 :(得分:4)

有一个关于OpenGL的简单规则:它与其他人不能很好地协作。你的情况是,双缓冲交换(由SDL_GL_SwapBuffers启动)将以某种方式替换窗口中的所有内容,而不是由OpenGL呈现。

使用OpenGL绘制所有内容。

答案 1 :(得分:0)

使用SDL_FillRect在一行上填充后台缓冲区,然后使用glClear在下一行清除它。您是否尝试过交换操作的顺序?

不是我不同意接受的答案;一般来说,尝试将软件渲染方法与OpenGL混合在一起最多会产生混淆,但在这种情况下你可能会很幸运。

至于纹理四边形,你应该可以从NeHe lesson 6开始。人们抱怨NeHe,但这是一个合理的入门指南。只是不要将它用作良好编码或高效的现代OpenGL使用的示例。从这里开始,稍后再转向更复杂的东西。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您的SDL_FillRect未显示为红色,因为您之后使用GL_COLOR_BUFFER_BIT调用glClear