4

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

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

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

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

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

4

2 回答 2

1

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

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

然后用 data_as_float 调用 glBufferData。

于 2012-12-09T09:03:26.500 回答
0

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

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

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

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

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

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

于 2012-12-15T14:48:11.107 回答