Мой OpenGL Cubemap использует 6 копий одной и той же текстуры вместо 6 разных текстур - PullRequest
0 голосов
/ 18 сентября 2010

Я новичок в 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 Ответ

4 голосов
/ 18 сентября 2010

(Прошло довольно много времени с тех пор, как я занимался графическим программированием, поэтому я могу быть совершенно не в себе.)

glCopyTexImage2D копирует из текущего GL_READ_BUFFER, который не изменяется вашими вызовами gluLookAt.Я не думаю, что этот подход сработает;вы отправляете кучу команд рисования, копируете пиксели в текстуру, используете gluLookAt для изменения вида и ожидаете, что все предыдущие команды рисования все еще будут зависать.Вам нужно будет повторить весь рисунок для каждой перспективы и скопировать в одну текстуру после каждой.Затем, чтобы реально использовать вашу карту куба, вам нужно перерисовать всю сцену снова , а затем нарисовать сферу с картой куба.

Вы также рисуете на экран,или как там это называется (буфер цвета по умолчанию?), а затем копировать его в текстуру.Это хорошо для простой программы, но вы действительно хотите рендерить непосредственно на ваши текстуры и только рисовать конечный результат.(Особенно, когда они совершенно разных размеров.)

...