为了爱一切,我已经在这里待了三个小时。
OpenAL,当我移动监听器时,完全打破了衰减。我不明白为什么。
如果我不更改监听器设置,它可以正常工作。但不幸的是,这不是3D游戏中可行的解决方案。
我已尝试将所有声音制作组件的位置和速度标准化,以及手动设置所有衰减设置。但是,更改侦听器上的任何设置都会始终打破衰减。如果我移动听众,我会听到距离我100个单位的声音,好像它的位置没有效果。
我甚至使用alGet参数来检查值是否正确。他们是。
游戏中的每个单位都是1x1,所以在很多情况下,两个实体相距大约100个单位。
alListener3f(AL_POSITION, pos.x, pos.y, pos.z);
alListener3f(AL_VELOCITY, vel.x, vel.y, vel.z);
alListener(AL_ORIENTATION, system.listener.getOrientationBuffer());
alListenerf(AL_GAIN, system.listener.getMasterGain());
这是负责更改监听器的所有代码。根据指示,主增益为0.5f,声音本身也为0.5。距离模型为AL_LINEAR_DISTANCE_CLAMPED
,参考距离为1f,最大距离为2f。然而,衰减不起作用,放置也没有区别。在LINEAR_DISTANCE_CLAMPED
模式下,距离无论如何都不起作用。如果我把它作为默认模型,当我不移动监听器时,它将至少工作。
方向保留为默认(0, 0, -1f, 0, 1f, 0f)
不,我的声音驱动程序很好,这台电脑是在不到一个月前用最新的部件制造的。
是的,声音是单声道格式。
有人请帮帮我。
答案 0 :(得分:4)
经过一些实验,我终于设法解决了我的问题。
设置低于1f的滚降值似乎可以在设置最大距离后保持声音淡出。您还需要确保正确设置方向以匹配您的坐标系;幸运的是,我的设计已经设计为使用默认设置,但请确保您这样做。这非常重要。
因此,为了确保衰减在参考角度和最大角度下正常工作,执行以下操作:
AL_LINEAR_DISTANCE_CLAMPED
应该是它。
另外,在我的学习期间,我已经看到了一些关于必须标准化坐标的讨论。它实际上并不重要,因为OpenAL不希望你这样做(你可以在第32页底部的documentation找到它)
我希望通过澄清所有这些来帮助别人。祝你自己的工作好运,网络陌生人。