我的OpenGL Cubemap使用6个相同纹理的副本而不是6个不同的纹理

时间:2010-09-17 23:54:09

标签: opengl geometry textures

我是opengl的新手,并且能够自己学到很多东西,但我仍然坚持这个。

我有一个渲染的房间,但我需要一个在中心盘旋的球体,完美地反映其他一切。到目前为止,我已经能够以相当不错的结果将立方体贴图到它,但是6个纹理都是相同的:即我对房间的视图。我正在调用gluLookAt将相机重新定位到球体所在的位置,并查看其周围环境,然后我调用glCopyTexImage2D将其加载到适当的纹理中,但我无法加载6个不同的视角。 ..只有一次,六次。

这是相关的代码,如果你能看透它并帮助我,我会永远爱你:))

 void drawReflectiveSphere(){
  glEnable(GL_TEXTURE_CUBE_MAP);

  float pos[] = {10.0, 1.0, -40.0};
  float x_pos [] = {pos[0] + 1, pos[1], pos[2]};
  float x_neg [] = {pos[0] - 1, pos[1], pos[2]};
  float y_pos [] = {pos[0], pos[1] + 1, pos[2]};
  float y_neg [] = {pos[0], pos[1] - 1, pos[2]};
  float z_pos [] = {pos[0], pos[1], pos[2] + 1};
  float z_neg [] = {pos[0], pos[1], pos[2] - 1};
  float view_pos[][3] = {x_pos[0], x_neg[0], y_pos[0], y_neg[0], z_pos[0], z_neg[0]};

  glGenTextures(1, &cubemap);

  glReadBuffer(GL_BACK);

  //Use different frustum
  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glFrustum(-5.0, 5.0, -5.0, 5.0, 0.0, width + 10.0);

  glMatrixMode(GL_MODELVIEW);
  glViewport(0, 0, 128, 128);

  //Generate cube map textures
  for(int i = 0; i < 6; i++){
    glPushMatrix();  
      gluLookAt(pos[0], pos[1], pos[2],
            view_pos[i][0], view_pos[i][1], view_pos[i][2],
            0.0, -1.0, 0.0);  
      glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 0, 0, 128, 128, 0);
    glPopMatrix();
  }

  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  
  glEnable(GL_TEXTURE_GEN_S);
  glEnable(GL_TEXTURE_GEN_T);
  glEnable(GL_TEXTURE_GEN_R);

  //Restore viewport
  glViewport(0, 0, W, H);

  //Draw cube-mapped sphere
  glPushMatrix();
    glTranslatef(pos[0], pos[1], pos[2]);
    gluSphere(quadratic, 5.0f, 128, 128);
  glPopMatrix();

  //Restore projection matrix
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();

  glDisable(GL_TEXTURE_GEN_S);
  glDisable(GL_TEXTURE_GEN_T);
  glDisable(GL_TEXTURE_GEN_R);
  glDisable(GL_TEXTURE_CUBE_MAP);
}

1 个答案:

答案 0 :(得分:4)

(自从我完成任何图形编程以来已经有一段时间了,所以我可能完全偏离基础。)

glCopyTexImage2D从当前GL_READ_BUFFER复制,不会被gluLookAt调用修改。我不认为这种方法会起作用;您正在发送一堆绘图命令,将像素复制到纹理,使用gluLookAt更改视图并期望所有先前的绘图命令仍然悬空。您将需要为每个透视图重复所有绘图,并在每个透视图之后复制到单个纹理中。然后,要实际使用立方体贴图,您需要重新绘制整个场景,再次,然后使用立方体贴图绘制球体。

您还要绘制到屏幕或其他任何内容(默认颜色缓冲区?),然后将其复制到纹理中。这对于一个简单的程序来说很好,但你真的想直接渲染到你的纹理,并且只绘制最终的结果。 (特别是当它们的尺寸大不相同时。)