Рендеринг из SDL и OpenGL одновременно - PullRequest
3 голосов
/ 18 декабря 2010

Привет всем, я очень новичок в 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 ]

4 голосов
/ 18 декабря 2010

В OpenGL есть одно простое правило: он не очень хорошо сочетается с другими. Что происходит в вашем случае, так это то, что двойной буферный обмен (инициированный SDL_GL_SwapBuffers) каким-то образом заменит все в окне, а не будет отображаться OpenGL.

Просто нарисуйте все, используя OpenGL.

0 голосов
/ 19 декабря 2010

ваш SDL_FillRect не отображается как красный, потому что вы вызываете glClear с установленным впоследствии GL_COLOR_BUFFER_BIT

0 голосов
/ 19 декабря 2010

Если вы используете C ++, библиотека SFML может быть лучшим вариантом (хотя она имеет привязки C, но не пробовала).Он прекрасно работает с OpenGL и имеет функции для совместной работы вместе с GL.Насколько я понял, SFML-функции сами используют GL для рендеринга.Тем не менее, я предлагаю вам делать рендеринг только с GL-вызовами, как отмечено выше.

0 голосов
/ 19 декабря 2010

Вы заполняете задний буфер в одной строке с помощью SDL_FillRect, а затем очищаете его в следующей с помощью glClear.Вы пытались поменять порядок операций?

Не то чтобы я не согласен с принятым ответом;в общем, попытка смешать программные методы рендеринга с OpenGL в лучшем случае является путаницей, но вам может повезти в этом случае.* Не урок 6 .Люди жалуются на NeHe, но это разумное руководство для начала.Только не используйте это как пример хорошего кодирования или эффективного современного использования OpenGL.Начните здесь и перейдите к более сложным вещам позже.

...