2012-12-07 64 views
4

如果我使用定点(或用1描述最小游戏单元的整数)来描述我的顶点向量,我如何设置OpenGL/eigen转换来处理它?如果我这样做,我的顶点着色器:使用顶点着色器的定点运算

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

如果我在传递IN_POSITION作为GL_INT的VEC 3,我过去在矩阵作为GL_FLOAT MAT4,将适当的铸造做些什么呢?是否有性能成本?

是否有可能准备我的转换矩阵也是定点的?

这是一个2D游戏,我认为它比3D更可行。我真的更喜欢精确度,因为当事情远离原点时,似乎在大地图上的位置已经退化。我意识到我可以逃脱只有对象位置是一个整数,而顶点仍然被描述为浮动。但是,我认为我的碰撞方案可以更好地处理定点顶点。性能差异通常是什么?

回答

0

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

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

camerauniform uvec3,和in_Positionuvec3位置输入。翻译是作为一个单独的操作来执行的,而视图缩放,旋转和投影是通常使用浮动(projviewMatrix)的mat4完成的。

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

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

当然,这是无视皇室的痛苦,它实际上是操纵整数位置数据。我真的不会推荐它。

1

这将意味着一个int浮点转换,将惩罚你的表现。你应该在CPU上将vec3投影到GPU拷贝时间。如果您使用Matrix对象,将它们存储在CPU,你可以丢掉。

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

然后调用glBufferData与data_as_float。