2013-01-24 140 views
5

纹理立方体的最佳方式(最低内存,最快速度)是多少?过了一会儿,我必须找到这个解决方案:在openGL中纹理立方体的最佳方式

数据结构:

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); 

正如你所看到的结果是正确的: cube

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

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

+3

为什么你需要“最快/最低的内存”,你计划在屏幕上拥有十亿个立方体吗?另外,你是什么意思“重新定义某个顶点”? –

+0

设置了立方体纹理后,fps下降(从60到40)。我已经重新定义了“顶点”数组中的某个顶点,如果仔细观察,该数组中有16个点(3D),但定义一个立方体8就足够了。 – Luca

+2

你正在做的事情非常错误,它可能不是立方体,8或16个顶点不会有什么不同。还要考虑每个顶点连接3个面,并且它们都具有不同的UV坐标,则需要这些“额外”顶点。我不确定,但是当你创建纹理时,你只需要调用glTexParameteri一次,如果这是你的循环,它可能是减速的原因。 –

回答

1

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

0

那么,你可以使用立方体贴图纹理,其中你的顶点着色器将处理纹理坐标。所有你需要做的产生TEX坐标为加入这一行你的顶点着色器:

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

无需重新顶点,也可以提高使用顶点缓冲对象的性能。

+0

这对我来说早就使用了着色器 – Luca

+0

我不明白你是什么意思“对我来说早”..? – debonair

+0

我是openGl世界的新手,我只是在学习基础 – Luca