【问题标题】:The best way to texture a cube in openGL在openGL中纹理立方体的最佳方法
【发布时间】:2013-01-08 11:34:10
【问题描述】:

纹理立方体的最佳方式是什么(最低内存、最快速度)?过了一会儿,我找到了这个解决方案:

数据结构:

GLfloat Cube::vertices[] =
 {-0.5f, 0.0f, 0.5f,   0.5f, 0.0f, 0.5f,   0.5f, 1.0f, 0.5f,  -0.5f, 1.0f, 0.5f,
  -0.5f, 1.0f, -0.5f,  0.5f, 1.0f, -0.5f,  0.5f, 0.0f, -0.5f, -0.5f, 0.0f, -0.5f,
  0.5f, 0.0f, 0.5f,   0.5f, 0.0f, -0.5f,  0.5f, 1.0f, -0.5f,  0.5f, 1.0f, 0.5f,
  -0.5f, 0.0f, -0.5f,  -0.5f, 0.0f, 0.5f,  -0.5f, 1.0f, 0.5f, -0.5f, 1.0f, -0.5f
  };

 GLfloat Cube::texcoords[] = { 0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0,
                               0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0,
                               0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0,
                               0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0
                             };

 GLubyte Cube::cubeIndices[24] = {0,1,2,3, 4,5,6,7, 3,2,5,4, 7,6,1,0,
                                  8,9,10,11, 12,13,14,15};

绘制函数:

        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, texture);
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glColor3f(1.0f, 1.0f, 1.0f);

        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glEnableClientState(GL_VERTEX_ARRAY);

        glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
        glVertexPointer(3, GL_FLOAT, 0, vertices);

        glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices);
        glDisableClientState(GL_VERTEX_ARRAY);
        //glDisableClientState(GL_COLOR_ARRAY);
        glDisable(GL_TEXTURE_2D);

如您所见,结果是正确的:

但要获得这个结果,我必须重新定义一些顶点(vertices 数组中有 16 个 3D 点)否则纹理无法在 DrawElement 函数中映射。

有人知道在顶点数组中纹理立方体的更好方法吗?

【问题讨论】:

  • 为什么需要“最快/最低内存”,您是否计划在屏幕上显示十亿个立方体?另外,“重新定义一些顶点”是什么意思?
  • 设置立方体纹理后,fps 会降低(从 60 到 40)。我在“顶点”数组中重新定义了一些顶点,如果您仔细观察,该数组中有 16 个点(3D),但定义一个立方体 8 就足够了。
  • 那你做错了什么,可能不是立方体,8个或16个顶点不会有太大区别。还要考虑每个顶点连接 3 个面并且它们都有不同的 uv 坐标,您需要那些“额外”顶点。我不确定,但你只需要调用 glTexParameteri 一次,当你创建纹理时,如果那在你的循环中,它可能是减速的原因。

标签: opengl textures vertex-array


【解决方案1】:

我在使用 opengl 时遇到了同样的问题。我的研究表明没有其他方法可以做到这一点,因为每个顶点只能有一个与之关联的纹理坐标。

【讨论】:

    【解决方案2】:

    好吧,您可以使用立方体贴图纹理,您的顶点着色器将在其中处理纹理坐标。生成 tex 坐标所需要做的就是在顶点着色器中添加这一行:

    out vec2 texcoords;
    texcoords=normalize(vertex_data.xy)
    

    不需要重新定义顶点,也可以通过使用顶点缓冲对象来提高性能。

    【讨论】:

    • 对我来说使用着色器还为时过早
    • 我不明白你说的“早对我来说”是什么意思..?
    • @PhantomFav:这不是借口。您应该开始使用着色器。着色器不是“高级”的;它们现在是标准
    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多