OpenGL CubeMap纹理尺寸

时间:2010-09-20 17:25:09

标签: opengl rendering textures

alt text在整个周末挣扎之后,我终于有了一个反映OpenGL环境的球体。它几乎看起来不错。问题是,某些功能没有排队。我找不到关于OpenGL球体映射主题的更多信息,在红皮书的两页部分以及一些分散的,大部分未完成的论坛主题之外。不确定它是否必要,但我在加载纹理的地方包含了我的代码。经过反复试验,我发现从0到512的对称尺寸得到最好的结果,但它们仍然不完美(尺寸必须是2的幂,否则它会崩溃)。有没有人知道任何策略来获得更准确排列的纹理?

void loadCubemapTextures(){

  glGenTextures(1, &cubemap);
  glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap);
  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_WRAP_R, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

  glDrawBuffer(GL_AUX1);
  glReadBuffer(GL_AUX1);

  glMatrixMode(GL_MODELVIEW);

  //Generate cube map textures
  for(int i = 0; i < 6; i++){

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();
      //Viewing Transformation
      gluLookAt(pos[0], pos[1], pos[2],
           view_pos[i][0], view_pos[i][1], view_pos[i][2],
         top[i][0], top[i][1], top[i][2]);

      glMatrixMode(GL_PROJECTION);
      glLoadIdentity(); 
      gluPerspective(90.0, 1.0, cubemapRadius + 1, 200.0);
      glMatrixMode(GL_MODELVIEW);

      render();

      glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 0, 0, 256, 256, 0);
  }

2 个答案:

答案 0 :(得分:1)

你的墙壁缺乏足够的功能,使他们的方向和位置清晰,但我敢打赌这是问题。

view_postop中的值是定义它们的值。在看起来可疑的事情中:

  • 光泽底部的黑色来自捕捉前视图的脸部。它应该在顶部(即它可以翻转或旋转180°)。
  • 同样地,来自视图背面(在球体中心)的黑色看起来转了四分之一圆(因为黑色在左边而不是在顶部)。
  • 地图球体的反射看起来很奇怪。它缺乏解决方案来确切地知道这是什么。

无论如何,为了解决这个问题,您可以确保您的值符合正确的立方体贴图定义(如检查所有规范),或者在添加足够的几何图形后执行一系列试验和错误弄清楚每张脸的方向是什么。

答案 1 :(得分:0)

问题与坐标无关,感谢输入。我忘了设置视图矩阵了...在for循环中对gluViewport的简单调用为我修复了它。