C++ 同时从SDL和OpenGL进行渲染

C++ 同时从SDL和OpenGL进行渲染,c++,c,opengl,sdl,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 *sc

嘿,大家好,我对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;
   }
}
#包括
#包括
int main(int argc,char*argv[])
{
SDL_事件;
浮动θ=0.0f;
SDL_Init(SDL_Init_视频);
SDL_表面*屏幕=SDL_设置视频模式(800、600、32,SDL_OPENGL | SDL_表面| SDL_可调整大小| SDL_全屏);
glViewport(0,080600);
glClearColor(0.0f、0.0f、0.0f、0.0f);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GLU深度试验);
glShadeModel(GL_平滑);
glMatrixMode(GL_投影);
glMatrixMode(GLU模型视图);
int完成;
对于(完成=0;!完成;)
{
SDL_FillRect(屏幕,0,SDL_映射RGB(屏幕->格式,255,0,0));
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glLoadIdentity();
glTranslatef(0.0f,0.0f,0.0f);
glRotatef(θ,0.0f,0.0f,1.0f);
glBegin(GL_三角形);
GL3F(0.83f,0.83f,0.0f);
glVertex2f(0.0f,1.0f);
GL3F(0.83f,0.83f,0.0f);
glVertex2f(0.87f,-0.5f);
GL3F(0.83f,0.83f,0.0f);
glVertex2f(-0.87f,-0.5f);
格伦德();
θ+=10.0f;
SDL_翻转(屏幕);
SDL_GL_SwapBuffers();
SDL_PollEvent(事件和事件);
if(event.key.keysym.sym==SDLK\u ESCAPE)
完成=1;
}
}
我的问题是,我试图渲染的红色背景永远不会渲染,只渲染OpenGL三角形


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

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


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

使用SDL\u FillRect在一行上填充后缓冲区,然后使用glClear在下一行上清除后缓冲区。您是否尝试过交换操作顺序

并不是说我不同意公认的答案;一般来说,试图将软件渲染方法与OpenGL混合在一起最多只能造成混乱,但在这种情况下,您可能会很幸运


至于渲染有纹理的四边形,您应该能够从中计算出来。人们抱怨NeHe,但这是一个合理的入门指南。只是不要把它作为良好编码或高效使用现代OpenGL的例子。从这里开始,然后再移动到更复杂的东西。

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

您的SDL\u FillRect不会显示为红色,因为您在调用glClear时设置了GL\u COLOR\u BUFFER\u位。

我建议仅使用opengl,而不是两者都使用。响应非常差。SDL有一个很棒的输入和声音框架,OpenGL没有。如果我能弄清楚如何让SDL的渲染与OpenGL一起工作,而不是只使用OpenGL进行渲染,这将大大加快我的开发速度。我的意思是只使用OpenGL进行绘图。无论如何,这会更有效率。干杯,伙计,我想是这样的。你手头有没有关于将纹理应用于四边形/三角形等的阅读材料;glGenTextures(1和texID);glBindTexture(GL_纹理_2D);对于(int mipmap_level=0;mipmap_level