Как нарисовать фон в openGL - PullRequest
       0

Как нарисовать фон в openGL

5 голосов
/ 15 февраля 2011

У меня есть программа для оживления Солнечной системы.Программа рисует солнце и несколько вращающихся планет.Мне нравится размещать растровое изображение туманности на заднем плане, но я не знаю, как это сделать.То, что я пробовал, похоже, не работает.Вот что я попробовал.

1) Используйте glDrawPixels для рисования растрового изображения.При таком подходе я смог нарисовать растровое изображение, но оно охватывало солнечные объекты.Я пытался перевести растровое изображение, но это тоже не сработало.

2) Нарисуйте GL_QUADS как плоскость за солнечными объектами.Самолет был в виде крошечного параллелограмма.

Насколько я знаю, это может быть просто неправильным подходом.Я был бы признателен, если бы кто-то указал мне правильное направление.Вот код для метода № 1.

void
universe::createObj()
{
    QPixmap map ("hst_orion_nebula.jpg");

    glTexImage2D (GL_TEXTURE_2D,0, GL_LUMINANCE, map.width(), map.height(), 0,
                  GL_BGRA,GL_UNSIGNED_BYTE, map.convertToImage().bits());

    callId = glGenLists(itemId::next());

    glNewList(callId, GL_COMPILE);

      glDrawPixels (map.width(), map.height(), GL_RGBA,
         GL_UNSIGNED_BYTE, map.convertToImage().bits());

    glEnable (GL_TEXTURE_2D);
    glEndList();
}

void
universe::draw()
{
   glPushMatrix();
   glPushAttrib (GL_COLOR_BUFFER_BIT | GL_LIGHTING_BIT);

   glCallList (callId);

   glPopMatrix();
   glPopAttrib();
}

/////////////////////////////////
void
sun::createObj()
{
    QPixmap map ("sunmap.jpg");

    glGenTextures (10, canvas::_instance->_texture);
    glBindTexture(GL_TEXTURE_2D, canvas::_instance->_texture[0]);

    glTexImage2D(GL_TEXTURE_2D,0, GL_LUMINANCE, map.width(), map.height(), 0,
                  GL_BGRA,GL_UNSIGNED_BYTE, map.convertToImage().bits());

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    callId = glGenLists(itemId::next());

    glNewList(callId, GL_COMPILE);

    GLUquadricObj *sphere_quadric = gluNewQuadric();
    gluQuadricTexture( sphere_quadric, GL_TRUE );
    gluQuadricDrawStyle(sphere_quadric, (GLenum)GLU_SMOOTH);
    gluSphere(sphere_quadric, 25, 36, 36);

    glEnable (GL_TEXTURE_2D);
    glEndList();
}

void
sun::draw()
{
   glEnable( GL_LIGHTING );

   glPushMatrix();

   glPushAttrib (GL_COLOR_BUFFER_BIT | GL_LIGHTING_BIT);

   GLfloat color1[4] = {1, 0.50, .0, 1 };

   glRotated (_xangle, 1, 0, 0);
   glRotated (_yangle, 0, 1, 0);
   glRotated (_zangle, 0, 0, 1);

    glBindTexture(GL_TEXTURE_2D, canvas::_instance->_texture[0]);
   GLfloat shine[1] = {128};
   glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, color1 );
   glMaterialfv( GL_FRONT_AND_BACK, GL_SHININESS, shine );
   glCallList (callId);
   glPopMatrix();
   glPopAttrib();
}



1 Ответ

3 голосов
/ 15 февраля 2011

, чтобы нарисовать полноэкранный квад:

glBegin(GL_QUADS);
  glVertex2f(1,1);
  glVertex2f(1,0);
  glVertex2f(0,0);
  glVertex2f(0,1);
glEnd();

Сначала вызовите их, а затем всю сцену.и используйте шейдерную программу следующим образом:

void main(void){
   gl_Position =  gl_Vertex * 2.0 - 1.0;
   gl_TexCoord[0]  = gl_Vertex;
  }

также будьте осторожны, потому что gl_Vertex официально устарела.Если вам нужно использовать фиксированный конвейер, вот что:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

glBegin( GL_QUADS );

    glTexCoord2f(0,0);
    glVertex2f(-1.0f, -1.0f);
    glTexCoord2f(1,0);
    glVertex2f(1.0f, -1.0f);
    glTexCoord2f(1,1);
    glVertex2f(1.0f, 1.0f);
    glTexCoord2f(0,1);
    glVertex2f(-1.0f, 1.0f);

glEnd();

glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...