代码之家  ›  专栏  ›  技术社区  ›  jakeva

OpenGL Cubemap纹理尺寸

  •  0
  • jakeva  · 技术社区  · 14 年前

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

    void loadcubemaptextures()。{
    
    glgentextures(1,&cubemap);
    glbindtexture(gl_texture_cube_map,cube map);
    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_模型视图);
    
    //生成立方体贴图纹理
    对于(int i=0;i<6;i++){
    
    glclear(gl_color_buffer_bit_gl_depth_buffer_bit);
    glloadIdentity();
    //查看转换
    GluLookat(位置[0],位置[1],位置[2],
    视图\u pos[i][0]、视图\u pos[i][1]、视图\u pos[i][2],
    顶部[I][0],顶部[I][1],顶部[I][2]);
    
    glmatrixmode(gl_投影);
    glloadIdentity();
    GluPerspective(90.0,1.0,cubemapradius+1200.0);
    glmatrixmode(gl_模型视图);
    
    RelDead();
    
    glcopytextimage2d(gl_纹理_立方体_映射_正_x+i,0,gl_rgb,0,0,256,256,0);
    }
    < /代码> <经过整个周末的挣扎,我终于在OpenGL中找到了一个反映其环境的球体。看起来差不多不错。问题是,某些功能不一致。除了红皮书中的一个两页的部分和一些零散的、大部分未完成的论坛主题之外,我找不到关于OpenGL球体映射主题的太多信息。不确定是否有必要,但我在加载纹理的地方包含了我的代码。经过反复试验,我发现对称尺寸的freom 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 回复  |  直到 14 年前
        1
  •  1
  •   Bahbar    14 年前

    你的墙没有足够的特征来让它们的方向和位置清晰,但我敢打赌这就是问题所在。

    你的价值观 view_pos top 是这些的定义。在那些看起来可疑的事情中:

    • 雪机底部的黑色部分来自捕捉到前视图的那张脸。它应该在顶部(即它要么翻转,要么旋转180)。
    • 同样地,从视图的后面(在球体的中心)来的黑色看起来是由四分之一圆旋转的(黑色在左侧而不是在顶部)。
    • 地图球体的反射看起来很奇怪。它缺乏确切地弄清楚这是什么的决心。

    无论如何,要修复它,您可以确保您的值是正确的多维数据集映射定义所期望的值(如检查所有规范所示),或者在添加足够的几何图形以确定每个面的方向之后,只需进行一系列的尝试和错误。

        2
  •  0
  •   jakeva    14 年前

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