【问题标题】:OpenGL CubeMap Texture DimensionsOpenGL CubeMap 纹理尺寸
【发布时间】:2010-09-20 17:25:09
【问题描述】:

经过整个周末的努力,我终于在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);
  }

【问题讨论】:

  • 我不知道我是否可以发布一张图片,我知道这会有所帮助...有一个矩形房间,在立方体贴图球体的前面和左侧悬挂着一个地球仪.立方体贴图球体反射环境,但立方体贴图纹理相交处的接缝未正确对齐,因此地球的反射看起来像是被切成两半。
  • 如果需要,使用外部图像存储。但是“事情看起来不对劲”确实需要一张图片。
  • 好的,我发布了一张图片。这很容易,大声笑

标签: opengl rendering textures


【解决方案1】:

您的墙壁缺乏足够的特征来明确它们的方向和位置,但我敢打赌这些就是问题所在。

view_postop 中的值定义了这些值。在看起来可疑的事情中:

  • shere 底部的黑色来自拍摄前视图的脸部。它应该在顶部(即翻转或旋转 180 度)。
  • 同样,来自视图背面(球体中心)的黑色看起来转动了四分之一圆(因为黑色在左侧而不是在顶部)。
  • 地图球体的反射看起来很奇怪。它无法准确地弄清楚这是什么。

无论如何,要修复它,您可以确保您的值符合正确的立方体贴图定义所期望的值(如检查所有规范),或者在添加足够的几何图形后进行大量试验和错误弄清楚每张脸的方向是什么。

【讨论】:

  • 是的,我可以通过简单地否定顶部的值来修复负 z 轴。看起来更好,但是当我惹恼他们时,其他人似乎变得更糟……您是否可以指出我指定预期方向的资源?我的书没有这方面的内容。
  • @JakeVA:描述面以及纹理坐标如何映射到面的规范表:POSITIVE_X [-rz -ry] NEGATIVE_X [+rz -ry] POSITIVE_Y [+rx +rz] NEGATIVE_Y [+rx -rz] POSITIVE_Z [+rx -ry] NEGATIVE_Z [-rx -ry]。 CopyTexture 将源的左下角映射到 0,0 纹理坐标。这就是你的问题的全部。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2016-06-24
    • 2018-04-21
    相关资源
    最近更新 更多