【问题标题】:Fixed-point arithmetic with vertex shaders带顶点着色器的定点算法
【发布时间】:2012-12-07 18:57:48
【问题描述】:

如果我使用定点(或用 1 描述最小游戏单位的整数)来描述我的顶点向量,我该如何设置 OpenGL/特征变换来使用它?如果我在我的顶点着色器中这样做:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0)

如果我将 in_Position 作为 GL_INT 的 vec3 传入,而我将矩阵作为 GL_FLOAT mat4 传入,是否会进行正确的转换?有性能成本吗?

是否可以将我的转换矩阵也准备为定点?

这是通过 2D 游戏完成的,我认为这比 3D 更可行。我真的更喜欢准确性,因为当事情远离原点时,大型地图上的位置似乎会下降。我意识到我可能只将对象位置设为整数而顶点仍被描述为浮点数。但是,我认为我的碰撞方案更适用于定点顶点。性能差异一般是什么?

【问题讨论】:

    标签: c++ algorithm opengl game-engine


    【解决方案1】:

    这将意味着一个 int 到 float 的转换,这将惩罚你的表现。您应该在 CPU 到 GPU 复制时将 in_Position 转换为 vec3。如果您使用 Matrix 对象将它们存储在 CPU 上,您可以使用以下命令进行转换:

    MatrixXf data_as_float = data_as_int.cast<float>();
    

    然后用 data_as_float 调用 glBufferData。

    【讨论】:

      【解决方案2】:

      好的,经过一些实验,我已经确定了一个解决方案。

      gl_Position = projviewMatrix * vec4(ivec3(in_Position - camera), 1.0);
      

      camerauniform uvec3in_Positionuvec3 位置输入。平移是作为单独的操作执行的,而视图缩放、旋转和投影则像往常一样使用 mat4 的浮点数 (projviewMatrix) 完成。

      必须注意确保使用正确的类型和输入命令 (glVertexAttribIPointer)。 OpenGL 似乎非常急于将数据转换为浮点数,但将数据保留为整数类型,因此任何小错误都会导致输入错误。

      在定点中执行projviewMatrix 乘法根本不可行,因为您无法访问用于乘法的中间 64 位存储。只有in_PositionprojviewMatrix 使用的位总和为 32 时才会接近可用性,但考虑到渲染坐标将非常接近原点并且没有获得额外的操作(乘法后仍需要移位,GPU 将浮点数和整数一样长),没有理由在位置被相机居中后执行定点运算。

      当然,这忽略了实际操作整数位置数据的痛苦。我真的不推荐它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-16
        相关资源
        最近更新 更多