Articles of 浮点

统一,定位与整数,而不是浮动

我将transform.position四舍五入到每帧结尾的最接近的整数,所以它从来都不是十进制数。 我想知道是否有办法使统一存储在整数的位置,而不是浮动,以防止浮点精度问题。

点周围的点旋转,准确性问题

我学习OpenGL ES 2.0。 但是我认为这更像是一个C ++问题,而不是OpenGL。 我被困在下面的旋转问题:众所周知,旋转变换可以应用这些方程(为了简单起见,假设我们旋转(0,0)): x'=x*cos(theta)-y*sin(theta) y'=x*sin(theta)+y*cos(theta) 但是,似乎当我多次执行此旋转操作时,发生准确性问题。 我猜这个问题的核心是cos()函数和浮点限制的不确定结果。 因此,我看到我的旋转物体越来越小。 顺便说一下我正在使用C ++。 1.)您怎么看:这个问题是否真的与准确度问题有关? 2.)如果是这样,我该如何处理? 谢谢。

计算帧独立运动的问题

我正在使用SDL在C ++中开发一个Breakout风格的游戏。 到目前为止的问题是,球没有特别的原因减速和加速。 放缓通常会持续几秒钟。 编辑:当全屏运行时,我注意到球运动似乎也有点生涩。 这使我相信时机应该更加细化。 但是与此同时,不应该有必要有μs精度… 这里是我的代码来计算球的运动: double deltaMovement = tick * speed; rect.x += static_cast<int> ( deltaMovement * dirX ); rect.y += stnecessearyatic_cast<int> ( deltaMovement * dirY ); 我试图改变它来帮助防止浮动截断,但是这会影响速度,使得球只能水平或垂直移动(这在上面的代码中是不会发生的)。 double movementX = ( deltaMovement * dirX ); double movementY = ( deltaMovement * dirY ); movementX += ( movementX > 0.0f )? 0.5f: […]

XNA浮点值不作为参数

通过微软XNA框架,我可以通过改变它的整数值来改变有色纹理的颜色,例如: Int x = 255; if(true) { x–; tint = new Color(x, 255, 255); } Draw(texture, Vector2.Zero, tint); 如果x是一个浮点数,那么精灵的外观将不会改变,直到x值变为零。 随着整数的变化,随着时间的推移,贴图会逐渐消失。 为什么是这样? :S

WebGL的半浮动equivelant?

我试图find一个half float的目的是做一个片段着色器的math,而不是尝试有一个半浮动纹理。 在WebGL中是否有相当于half float数据types? 我知道你可以创建一个lowp浮点数,但是是相同的,还是不一定?

在碰撞检测和解决scheme中处理浮点精度错误

我正在试验连续的碰撞检测和瓦片地图上的点的响应。 这是我现在的结果: 我通过从当前位置( 红色圆圈 )到目标位置( 绿色圆圈 )拍摄射线( 红色线 ),并使用此algorithm检查其上的所有拼贴。 如果射线击中一个坚实的瓦片,我计算碰撞的确切位置( 黄色圆圈 )和一个新的目标位置取决于光线是否碰到实心瓦片在另一种情况下垂直或水平我可以简单地设置当前位置到目标位置并完成,因为没有发生碰撞。 现在我正在向这个新的目标位置拍摄第二道光线( 蓝线 ),并再次检查它上面的实心瓷砖。 如果碰撞发生,我将当前位置设置为光线点击位置( 青色圆圈 )并完成。 在另一种情况下,我只把当前位置设置到新的目标位置( 青色圆圈 ),因为这次没有发生碰撞。 这里最重要的源代码: void update(float start_x, float start_y, float target_x, float target_y, float *corrected_x, float *corrected_y) { float hit0_x; float hit0_y; LineTraceResult res0 = line_trace(start_x, start_y, target_x, target_y, &hit0_x, &hit0_y); switch (res0) { case LINE_TRACE_NONE: { […]

精确的问题与逼真的行星/地形

最近我一直在做一个现实的缩放行星引擎。 我发现了几个有关如何做的有趣链接,以后会出现什么问题,以及如何解决这些问题。 我采取的方法是我在许多文章中find的方法:使用6个四边形,每个面对一个,然后将立方体变成一个球体。 我的四叉树逻辑似乎正在工作,我试图在一个平坦的地形和一个球体(合理的距离),它运作良好,然后我尝试了更大的距离。 第一个问题是z战斗,使用对数深度缓冲区( http://outerra.blogspot.fr/2009/08/logarithmic-z-buffer.html )修复。 第二个是大数字的浮点精度。 我读了两个主要的方法来解决它。 第一个是使用双打而不是浮动进行操作,并给予相对于相机空间的每个位置。 二是在不同的单位中使用不同的空间(物体空间米,行星空间公里,非盟太阳系空间等)。 虽然第二个被许多人鼓励,我拿了第一个,因为它似乎更容易做到。 无论如何,我打算在未来尝试第二个。 第一种方法在平面地形上工作,因为它很容易计算出相对于相机的位置(centerOfNode – cameraPos)。 我仍然有一个错误是关于高度。 我在GPU上使用3D单工噪声,它使用浮点运算,需要vec3input。 相对较小的距离,世界的地位很好。 距离很远,世界空间位置在离原点很远的地方不起作用,由于缺less精度,模式很奇怪。 当然,它不能用于摄像机空间位置作为input。 我没有find任何关于这个。 上面的第二种方法是明天我会尝试的。 也就是说,用不同的单位定义几个空间,在每个空间中转换位置,并将它们中的每一个用作单纯的噪声函数的input,这将给我几个我可以用来进行缩放的纹理。 我不知道我会怎么做细节,但我认为这是行不通的,因为从低处转换到高处可能会导致浮点错误。 我可以用双精度的单工噪声dynamic地在CPU中创建顶点,但是听起来不太合适…我想尽可能地使用GPU,除非我没有别的select。 我的第二个问题是这次是球形地形。 所以我的步骤来得到这个星球是: 1)从四叉树节点,缩放,旋转和平移单位四元到他在六叉树当前平面的位置 2)使其正常化 3)乘以半径得到海平面的球体 4)增加高度 由于第一步与地球的起源有关,所以即使在视野空间也需要大数(半径)的操作,所以我不知道如何避免这里的精度问题……再次,我可以创建它们在CPU上并将它们发送给GPU,但是这听起来很累,我不想这样做,除非我没有其他合理的select。 我很乐意使用第二个解决scheme(几个空格),如果我有一个如何解决它的想法,但我不知道如何做到这一点…

R32F alpha混合的后备

我正在渲染一个R32F格式的纹理值的聚合,使用alpha混合来完成求和操作。 所有硬件都不支持R32F alpha混合。 当硬件不支持混合时,我有什么样的回退选项来完成添加?

确定性的多人RTS游戏的问题?

我正在开发跨平台的多人RTS游戏,其中不同的客户端和服务器(闪存和C#)都需要保持确定性的同步 。 为了处理浮点不一致,我遇到了这个方法: http ://joshblog.net/2007/01/30/flash-floating-point-number-errors/#comment-49912它基本上截断了非确定性部分: return Math.round(1000 * float) / 1000; 那么我担心的是,每次出现分歧时,还有更多的机会创造更多的浮点错误,实质上会让这种错误变得更糟? 。 所以它发生在我身上,这样的事情如何: function floatSafe(number:Number) : Number {return Math.round(float* 1024) / 1024; } 即只用2的幂分 ? 你怎么看? 。 讽刺用上述方法,我得到了不太准确的结果: trace( floatSafe(3/5) ) // 0.599609375 与其他方法(除以1000)一样,或者只是跟踪原始值,我得到3/5 = 0.6 或者也许这就是3/5实际上,IE 0.6不能真正用浮点数据types表示,并且在不同的平台上会更一致?

关于程序生成,聚类和GPU卸载的浮点确定性

我在空闲时间里已经devise了一个分布式程序生成系统,最近我一直在考虑的一个问题,就更广泛的架构而言,当你不能确保你有一个运行持久世界的同类机器集群。 我的devise的一部分要求任何给定的机器可以根据需要重新生成程序内容,从而允许在任何可用的机器上完成工作,根据需要销毁并重新创建不重要但资源匮乏的内容。 我一直在基本思想上运行,我将使用高精度的32/64位整数来处理大多数事情,而且一般工作正常,但是标准的相干噪声algorithm在计算中都使用浮点值。 我是否需要实现所有这些algorithm的自定义非浮点版本(即使用long)还是有更好的方法? 我是否应该使用定点types来处理这种事情,如果是这样的话,那么如果可能的话,这会如何影响我的select,以便将部分PCG工作卸载到GPU上? 另外,固定点types是否足够快,可以在游戏引擎中大量使用? 我可以忽略浮点精度问题,如果我可以摆脱最高水平的精度? 即,如果我很乐意使用不超过六位小数的结果,这是否保持我在不同的机器和架构安全? 注意:我的引擎纯粹是事物的模拟方面。 当用户玩游戏时,如果渲染不一致,那对我来说并不重要; 重要的是无论集群中的哪台机器都在做这项工作,程序化生成的源数据会一直重新生成。