我应该在OpenGL ES中使用哪种数据类型作为纹理坐标?

时间:2009-11-20 22:12:56

标签: iphone opengl-es

我注意到OpenGL文档中纹理坐标的默认数据类型是GLfloat,但我看到的经验丰富的iphone开发人员编写的大部分示例代码都使用了GLshort或GLbyte。这是优化吗?

GLfloat vertices[] = {    
  // Upper left
  x1, y2,
  // Lower left
  x1, y1,
  // Lower right
  x2, y1,
  // Upper right
  x2, y2,
};
glTexCoordPointer(2, GL_FLOAT, 0, iconSTs);

VS

GLbyte vertices[] = {    
  // Upper left
  x1, y2,
  // Lower left
  x1, y1,
  // Lower right
  x2, y1,
  // Upper right
  x2, y2,
};
glTexCoordPointer(2, GL_BYTE, 0, iconSTs);

2 个答案:

答案 0 :(得分:3)

我不建议在iPhone上使用字节/短坐标,特别是如果你是初学者。只需使用浮子。它们占用更多空间,但在您需要以最大速度渲染数千个顶点之前无关紧要。此外,您必须更改纹理矩阵以使用整数纹理坐标表示小数值,否则它们将仅指向纹理角(0,1)。这会增加代码的复杂性。

我相信他们自己并不快,至少在iPhone上。由于在单个调用中读取数千个内存带宽所需的内存带宽较小,因此它们可以更快一些。如果你编写第一个引擎,这种优化是不值得做的。除非您是一位经验丰富的引擎编码器并且要将硬件推向极限,否则这将永远不会成为代码中的主要瓶颈,从而带来可忽略的性能优势。

其他一些OGL-ES设备的情况可能会有所不同,因为OpenGL pipline部分在软件中实现,而某些设备缺乏FPU,因此无法快速处理浮动。这就是为什么一些Android游戏试图完全避免浮动类型(2009年)。

答案 1 :(得分:0)

GLFloat与GLByte的关系是顶点所占的大小 在OpenGL中,您可以指定几何的基础数据类型 我没有在iphone上编程,但我很确定他们这样做是为了节省空间(也许是计算时间) Float是4个字节,short是2个字节,byte是...... 1个字节:)
当然,你用较少的位来放松精度。