使用顶点着色器的固定点算术
Fixed-point arithmetic with vertex shaders
如果我使用定点(或用1描述最小游戏单位的整数)来描述我的顶点向量,我如何设置OpenGL/特征变换来使用它?如果我在顶点着色器中执行此操作:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0)
如果我将in_Position作为GL_INT的vec3传入,而将矩阵作为GL_FLOAT mat4传入,会进行正确的强制转换吗?有性能成本吗?
有可能把我的变换矩阵也准备成定点的吗?
这是用2D游戏完成的,我认为这比3D游戏更可行。我真的更喜欢准确性,因为当事情远离原点时,大地图上的位置似乎会下降。我意识到,当顶点仍然被描述为浮点时,我可能只需要对象位置是整数就可以了。然而,我认为我的碰撞方案将更好地处理定点顶点。性能差异通常是什么?
这意味着int到float的转换会影响您的性能。您应该在CPU到GPU的复制时间将in_Position强制转换为vec3。如果你使用矩阵对象将它们存储在CPU上,你可以用投射它们
MatrixXf data_as_float = data_as_int.cast<float>();
然后使用data_as_float调用glBufferData。
好的,经过一些实验,我已经确定了一个解决方案。
gl_Position = projviewMatrix * vec4(ivec3(in_Position - camera), 1.0);
camera
是uniform uvec3
,而in_Position
是uvec3
位置输入。平移是作为单独的操作执行的,而视图缩放、旋转和投影是像往常一样使用浮动的mat4
(projviewMatrix
)来完成的。
必须注意确保使用正确的类型和输入命令(glVertexAttribIPointer
)。OpenGL似乎非常渴望转换为浮点型,但将数据保留为整数类型,因此任何小错误都会导致输入错误。
在定点执行projviewMatrix
乘法是不可行的,因为您无法访问用于乘法的中间64位存储。只有当in_Position
和projviewMatrix
使用的比特加起来为32时,它才会接近可用性,但考虑到渲染的坐标将非常接近原点,并且不会获得额外的运算(相乘后仍需要移位,GPU的浮点运算时间与int一样长),没有理由在相机将位置居中后执行定点运算。
当然,这是忽略了实际操作整数位置数据的痛苦。我真的不推荐它。
- 如何循环打印顶点结构
- D3D11-将混合权重和索引传递到顶点着色器
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 如何将一半传递给顶点着色器?
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 使用 OpenGL 4.5 更改所选顶点的颜色
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 创建异构顶点数据数组的可移植方法
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- OpenGL 相机移动程序顶点着色器问题
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- 为什么顶点数组对象会导致错误?
- 从 CGAL 3D 网格生成中获取顶点坐标的 -6.27744e+66:mesh_implicit_sphere示例
- 将顶点位置从顶点传递到片段着色器 - 仅在使用 Nsight 进行调试时有效
- FBX SDK 在预期 3 个顶点时返回 4 个顶点
- 我对 MyGraph 属性顶点名称和边权重有问题