簡體   English   中英

我的OpenGL Cubemap使用6個相同紋理的副本,而不是6個不同的紋理

[英]My OpenGL Cubemap is using 6 copies of the same texture instead of 6 different 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);
}

(自從我完成了任何圖形編程以來已經有一段時間了,所以我可能完全不滿意。)

當前GL_READ_BUFFER的glCopyTexImage2D副本,不會通過您的gluLookAt調用進行修改。 我認為這種方法行不通; 您正在發送一堆繪圖命令,將像素復制到紋理,使用gluLookAt更改視圖,並期望所有先前的繪圖命令仍然存在。 您將需要針對每個透視圖重復所有繪圖,並在每個透視圖之后復制到單個紋理中。 然后,要實際使用立方體貼圖,您需要再次重新繪制整個場景,然后使用立方體貼圖繪制球體。

您還需要繪制到屏幕或其任何內容(默認的顏色緩沖區?),然后將其復制到紋理中。 這對於一個簡單的程序來說很好,但是您確實希望直接渲染到紋理,僅繪制最終結果。 (特別是當它們的大小完全不同時。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM