2009-11-19 101 views
1

我有一个立方体在OpenGL ES的顶点数组

float vertex_coordinates [] = { 

-12.43796, -12.43796, 12.43796, -12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 
12.43796, 12.43796, 12.43796, 12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 12.43796, 
12.43796, -12.43796, -12.43796, 12.43796, 12.43796, -12.43796, -12.43796, 12.43796, -12.43796, 
-12.43796, 12.43796, -12.43796, -12.43796, -12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 
-12.43796, -12.43796, -12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 12.43796, 12.43796, 
-12.43796, 12.43796, 12.43796, -12.43796, -12.43796, 12.43796, -12.43796, -12.43796, -12.43796, 
12.43796, -12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 12.43796, -12.43796, 
12.43796, 12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 12.43796, -12.43796, 12.43796, 
-12.43796, 12.43796, 12.43796, -12.43796, 12.43796, -12.43796, 12.43796, 12.43796, -12.43796, 
12.43796, 12.43796, -12.43796, 12.43796, 12.43796, 12.43796, -12.43796, 12.43796, 12.43796, 
-12.43796, -12.43796, -12.43796, -12.43796, -12.43796, 12.43796, 12.43796, -12.43796, 12.43796, 
12.43796, -12.43796, 12.43796, 12.43796, -12.43796, -12.43796, -12.43796, -12.43796, -12.43796, 

}; 

的这个顶点数组目前使用GL_SHORT代替GL_FLOAT我使其使用

glVertexPointer(3, GL_FLOAT, 0, vertex__coordinates); 

// texture pointer ... 

// colour pointer 

glDrawArrays(GL_TRIANGLES, 0, size); 

我怎么会去转换顶点数组转换成的值可以精确地呈现相同的 立方体,但是使用GL_SHORT作为glVertexPointer的第二个参数,以便加速 我的代码?

回答

3

在预处理步骤,我们计算出物体的最小和最大值,并以此来最大限度的精度在很短的利用率:

float modelMin[3] = {FLT_MAX, FLT_MAX, FLT_MAX}; //or std::numeric_limits<float> 
float modelMax[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX}; 
for (int i = 0; i < size; ++i) { 
    for (int j = 0; j < 3; ++j) { 
     const float v = vertex_coordinates[i * 3 + j]; 
     modelMin[j] = std::min(modelMin[j], v); 
     modelMax[j] = std::max(modelMax[j], v); 
    } 
} 

short* short_coordinates = new short[size * 3]; 
for (int i = 0; i < size; ++i) { 
    for (int j = 0; j < 3; ++j) { 
     const float src = vertex_coordinates[i * 3 + j]; 
     short& dst = short_coordinats[i * 3 + j]; 
     dst = (short)floorf(((src - modelMin[j])/(modelMax[j] - modelMin[j])) * 65536.0f - 32768.0f + 0.5f); 
    } 
} 

并借鉴当我们做到以下几点:

const float scale[3], bias[3]; 
for (int i = 0; i < 3; ++i) { 
    scale[i] = (modelMax[j] - modelMin[j])/65536.0f; 
    bias[i] = (32768.0f/65536.0f) * (modelMax[j] - modelMin[j]) + modelMin[j]; 
} 

glTranslatef(bias[0], bias[1], bias[2]); 
glScalef(scale[0], scale[1], scale[2]); 
glVertexPointer(3, GL_SHORT, 0, short_coordinates); 
glDrawArrays(GL_TRIANGLES, 0, size); 

/AB

0

代替(+ - )12.43796使用(+ - )1

然后就12.43796

您的模型视图矩阵应用glScalef操作我怀疑然而,这会加速你的代码。它所要做的就是将顶点数组缩小为其原始大小的一半。

+0

谢谢!然而,如果我有多个不同尺寸(例如+ -6)的多个 立方体,我将如何应用此逻辑? – Dimitris 2009-11-19 12:44:38

+2

在iPhone上,减少顶点阵列的尺寸可显着提升性能。从花车转换到短裤本身提升了我的渲染性能30%。 Dimitris,为了将其应用于各种情况,您只需将浮点值标准化为+ -32767即可。找到任何顶点坐标的最大绝对值,并将所有顶点值乘以32767除以该值。然后,您可以调整模型视图或投影矩阵以匹配新的缩放大小。 – 2009-11-19 17:05:26

+0

布拉德的建议可行,但前提是你的模型大致集中在(0,0,0)左右。如果不是,你需要定期的规模和偏见。 – Alan 2009-11-19 19:45:52