具有顶点着色器的定点算术

时间:2012-12-07 18:57:48

标签: c++ algorithm opengl game-engine

如果我使用定点(或描述最小游戏单位的1的整数)来描述我的顶点向量,我如何设置OpenGL /本征变换来使用它?如果我在顶点着色器中执行此操作:

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

进行转换
MatrixXf data_as_float = data_as_int.cast<float>();

然后用data_as_float调用glBufferData。

答案 1 :(得分:0)

好的,经过一些实验,我已经找到了解决方案。

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

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

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

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

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