【问题标题】:How to draw background in openGL如何在openGL中绘制背景
【发布时间】:2011-06-27 17:43:45
【问题描述】:

我有一个动画太阳系的程序。该程序绘制了太阳和一些轨道行星。我喜欢在后台放一个星云像素图,但我不知道怎么做。我尝试过的似乎不起作用。这是我尝试过的。

1) 使用 glDrawPixels 绘制像素图。通过这种方法,我能够绘制像素图,但它覆盖了太阳物体。我试图翻译像素图,但也没有用。

2) 绘制一个 GL_QUADS 作为太阳物体后面的平面。这架飞机是一个微小的平行四边形。

据我所知,这可能是完全错误的方法。 如果有人能指出我正确的方向,我将不胜感激。这是方法#1的代码。

空白 宇宙::createObj() { QPixmap 地图(“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(); } 空白 宇宙::画() { glPushMatrix(); glPushAttrib (GL_COLOR_BUFFER_BIT | GL_LIGHTING_BIT); glCallList (callId); glPopMatrix(); glPopAttrib(); } //////////////////////////// 空白 太阳::createObj() { QPixmap 地图(“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(); } 空白 太阳::画() { 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 闪耀[1] = {128}; glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, color1); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,闪耀); glCallList (callId); glPopMatrix(); glPopAttrib(); }

【问题讨论】:

  • 那么您的第 2 次尝试有什么问题?

标签: opengl


【解决方案1】:

绘制一个全屏四边形:

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);

【讨论】:

  • 只要确保添加对 glOrtho 的调用:
  • 为什么不直接调用 glTexCoord2f 或其他什么,并避免为此使用着色器?
【解决方案2】:

我建议你在你的场景中添加一个天空盒,这样你会得到一个非常令人满意的效果,它会跟随你的相机移动。

您可以在互联网上找到许多天空盒纹理,这里有一个关于如何在天空盒内渲染场景的非常简洁的教程:https://learnopengl.com/Advanced-OpenGL/Cubemaps

如果您仍想继续绘制静态星云图片的想法,则首先渲染应用星云纹理的四边形,同时禁用 zbuffer 上的渲染应该可以解决您的问题。这样,您的场景将呈现在您的背景之上。

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多