代码之家  ›  专栏  ›  技术社区  ›  Andrew Garrison

如何使用glshorts表示法线或纹理坐标?

  •  2
  • Andrew Garrison  · 技术社区  · 16 年前

    很多关于提高iphone游戏性能的建议都是围绕着减少向gpu发送数据而提出的。最明显的建议是尽可能使用glshort而不是glfloat,例如对于顶点、法线或纹理坐标。

    当使用glshort作为法线坐标或纹理坐标时,有什么特殊之处?使用glshort时是否可以表示0.5的glfloat纹理坐标?如果是,你怎么做?会不会是shrt_max/2?也就是说,使用glshort纹理坐标时,glfloat的0到1的范围是否映射到0到shrt_max?

    那么法线呢?我总是使用glfloat创建法线,并将其规格化为单位长度。当使用glshort作为normal时,是否向gpu发送非规范化向量?如果是,什么时候以及如何规范化?用所有分量除以shrt_max?

    3 回复  |  直到 13 年前
        1
  •  2
  •   Jon-Eric    16 年前

    法线

    如果你 glEnable( GL_NORMALIZE ) 然后你可以提交法线作为 GL_BYTE (或短)。以字节形式提交的正常值 0xFF 0xCC 0x33 由GPU标准化为(0.77,0.62,0.15)。

    请注意,有一个小的性能惩罚来自 GL_NORMALIZE 因为GPU必须使每个正常值正常化。

    另一个警告 GLH正规化 就是你不能用非标准化的法线来做照明的把戏。

    编辑:我说的“诡计”是指调整源数据中法线的长度(不是1.0),使顶点变亮或变暗。

    纹理坐标

    据我所知,整数(字节或短)对纹理坐标的用处较小。没有简单的调用指示opengl“规范化”纹理坐标。0表示0.0,1表示1.0,255表示255.0(用于平铺)。无法指定介于两者之间的小数。

    但是,不要忘记纹理矩阵。您可以使用它将整数转换为有用的纹理坐标。(我没有试过。)

        2
  •  4
  •   Bahbar    16 年前

    这个 OpenGL ES 1.1 规范指出,使用整数类型时,法线会自动返回到[-1:1]或[0:1]范围。 (公式一览表见规范表2.7)

    (for shorts)   n_x = (2c +1)/(2^16 − 1)
    

    所以你不需要依赖gl_normalize来获得法线(并且可以使用你想要的任何技巧)。

    但是纹理坐标 按比例缩放(超出[0:1]范围的值完全有效…)。如果你想应用这样的缩放,你最好的选择是使用纹理坐标矩阵,这要付出相当大的代价。

    glMatrixMode(GL_TEXTURE);
    glLoadMatrix(matrix_that_does_conversion_based_on_type);
    
        3
  •  3
  •   Toby Drew    13 年前

    我已经成功地使用glshorts作为纹理坐标,在创建vbo时将它们乘以1000,然后除以1000再用于着色器。当然,您必须权衡额外的计算和设备上的内存增益。

    当你在google上搜索如何使用glshort来提高性能时,这一点非常高,但对于在这样一个老线程上发布的帖子,我深表歉意。