我有一个动画太阳系的程序.该计划吸引太阳和一些轨道行星.我喜欢在背景中放置一个星云像素图,但我不知道该怎么做.我试过的似乎不起作用.这是我尝试过的.
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();
}
绘制全屏四边形:
glBegin(GL_QUADS);
glVertex2f(1,1);
glVertex2f(1,0);
glVertex2f(0,0);
glVertex2f(0,1);
glEnd();
Run Code Online (Sandbox Code Playgroud)
首先调用它们,然后调用整个场景。并使用这样的着色器程序:
void main(void){
gl_Position = gl_Vertex * 2.0 - 1.0;
gl_TexCoord[0] = gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
还要注意,因为 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6268 次 |
| 最近记录: |