У меня есть программа для оживления Солнечной системы.Программа рисует солнце и несколько вращающихся планет.Мне нравится размещать растровое изображение туманности на заднем плане, но я не знаю, как это сделать.То, что я пробовал, похоже, не работает.Вот что я попробовал.
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();
}