如果我使用定点(或描述最小游戏单位的1的整数)来描述我的顶点向量,我如何设置OpenGL /本征变换来使用它?如果我在顶点着色器中执行此操作:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0)
如果我将in_Position作为GL_INT的vec3传入,而当我将矩阵作为GL_FLOAT传递给mat4时,是否会进行正确的转换?是否有性能成本?
是否可以将我的转换矩阵准备好定点?
这是通过2D游戏完成的,我认为这比使用3D更可行。我真的更喜欢准确性,因为当事物离原点很远时,大地图上的位置似乎会降低。我意识到我可能只能将对象位置变为整数,而顶点仍被描述为浮点数。但是,我认为我的碰撞方案可以更好地使用定点顶点。通常性能差异是什么?
答案 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);
camera
是uniform uvec3
,in_Position
是uvec3
位置输入。翻译是作为单独的操作执行的,而视图缩放,旋转和投影是像往常一样用mat4
浮点数(projviewMatrix
)完成的。
必须注意确保使用正确的类型和输入命令(glVertexAttribIPointer
)。 OpenGL似乎非常渴望转换为float而将数据保留为整数类型,因此任何小错误都将导致错误的输入。
在定点中执行projviewMatrix
乘法是不可行的,因为您无法访问乘法的中间64位存储。只有当in_Position
和projviewMatrix
总和使用的位总和接近可用性时,但考虑到渲染的坐标将如此接近原点并且不会获得额外的操作(仍然需要移位后)乘以,GPU将花费与整数一样长的浮点数),没有理由在位置被摄像机居中后执行定点运算。
当然,这忽略了实际操纵整数位置数据的皇家痛苦。我真的不推荐它。