我有一个动画太阳系的程序。该计划吸引太阳和一些轨道行星。我喜欢在背景中放置一个星云像素图,但我不知道该怎么做。我试过的似乎不起作用。这是我尝试过的。
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(); }
答案 0 :(得分:3)
绘制全屏四边形:
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);
答案 1 :(得分:0)
我建议您在场景中添加一个天空盒,这样您将获得一个令人满意的效果,该效果将随相机的移动而变化。
您可以在互联网上找到许多Skybox纹理,这是一个关于如何在Skybox中渲染场景的非常整洁的教程:https://learnopengl.com/Advanced-OpenGL/Cubemaps
如果您仍然想绘制静态星云图片,则在禁用zbuffer上的渲染的同时先渲染要在其上应用星云纹理的四边形,这应该可以解决您的问题。这样,您的场景将呈现在背景之上。