同时从 SDL 和 OpenGL 渲染

Posted

技术标签:

【中文标题】同时从 SDL 和 OpenGL 渲染【英文标题】:Rendering from SDL and OpenGL at the Same Time 【发布时间】:2010-12-18 20:33:08 【问题描述】:

大家好,我是 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 三角形。

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

【问题讨论】:

我建议只使用opengl,不要同时使用。 反应很差。 SDL 有一个很棒的输入和声音框架,而 OpenGL 没有。如果我能弄清楚如何让 SDL 的渲染与 OpenGL 一起工作,而不是只使用 OpenGL 进行渲染,它将大大加快开发速度。 我的意思是只使用 opengl 进行绘图。反正效率会更高。 【参考方案1】:

关于 OpenGL 有一个简单的规则:它不能很好地与其他人一起玩。在您的情况下发生的情况是,双缓冲区交换(由 SDL_GL_SwapBuffers 启动)将以某种方式替换窗口中的所有内容,而不是由 OpenGL 渲染。

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

【讨论】:

干杯伙伴,我想是这样的。您是否碰巧手头有任何关于将纹理应用于四边形/三角形/等的读物? GLuint texID; glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D); for(int mipmap_level=0; mipmap_level 【参考方案2】:

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

并不是我不同意接受的答案;一般来说,尝试将软件渲染方法与 OpenGL 混合使用充其量只会造成混淆,但在这种情况下你可能会很幸运。

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

【讨论】:

【参考方案3】:

如果您使用 C++,SFML 库可能是更好的选择(虽然它有 C 绑定,但还没有尝试过)。它与 OpenGL 配合得很好,并具有与 GL 协同工作的功能。据我了解,SFML函数本身使用GL进行渲染。不过,我确实建议您只使用上面提到的 GL 调用进行渲染。

【讨论】:

【参考方案4】:

您的 SDL_FillRect 未显示为红色,因为您调用 glClear 后设置了 GL_COLOR_BUFFER_BIT

【讨论】:

以上是关于同时从 SDL 和 OpenGL 渲染的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 深度测试不工作 (GLEW/SDL2)

带有 OpenGL 4.4 的 SDL2:三角形未正确渲染

辅助线程中的 OpenGL 渲染

SDL2:如何同时拥有 SDL2 菜单和 OpenGL 上下文?

SDL/OpenGL 结果不一致?

SDL 平台游戏中的 OpenGL 着色器?