我正在使用 GLSL 计算着色器编写基于 GPU 的实时光线跟踪渲染器。到目前为止,它运行得非常好,但是当涉及同时具有反射和折射时,我偶然发现了一个看似无法解决的问题。
我的逻辑告诉我,为了在物体(例如玻璃)上进行反射和折射,光线必须一分为二,一条光线从表面反射,另一条光线通过表面折射。这些光线的最终颜色将根据某个函数进行组合,并最终用作光线源自的像素的颜色。我的问题是我不能在着色器代码中分割光线,因为我必须使用递归来做到这一点。根据我的理解,着色器中的函数不能递归,因为由于与旧 GPU 硬件的兼容性问题,所有 GLSL 函数都类似于 C++ 中的内联函数。
是否可以在着色器代码中模拟或伪造递归,或者我什至可以在不使用递归的情况下同时实现反射和折射?我看不出没有递归它是如何发生的,但我可能是错的。
我有一个方法返回输入的阶乘.它适用于整数,但我无法弄清楚如何使它与十进制数一起工作.
这是我目前的方法:
public static double factorial(double d)
{
if (d == 0.0)
{
return 1.0;
}
double abs = Math.abs(d);
double decimal = abs - Math.floor(abs);
double result = 1.0;
for (double i = Math.floor(abs); i > decimal; --i)
{
result *= (i + decimal);
}
if (d < 0.0)
{
result = -result;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个实现,但代码没有显示(我丢失了链接),给出的例子是 5.5! = 5.5 * 4.5 * 3.5 * 2.5 * 1.5*0.5! = 287.885278
所以从这个模式,我只是i在for循环中添加了十进制值result *= (i + decimal) …
因此,我最近刚从LWJGL 2升级到3,并且在获取键盘和鼠标输入时遇到了一些困难。顺便说一下,我正在使用它进行相机的移动和旋转。
我的问题是,如果我使用GLFW回调,则移动似乎非常不稳定且缓慢。这不是一个稳定的速度,只是感觉不对。此外,当我按下一个键(例如w)向前移动时,从GLFW_PRESS到的转换之间大约有半秒的延迟。GLFW_REPEAT这会导致在按下键时相机在前半秒内不会移动。
顺便说一下,我有一个InputHandler类,该类具有用于keyDown,keyPressed,keyReleased等的方法。在一个invoke方法中,我没有所有的键检查。invoke方法将键事件添加到存储键的列表中,以及事件状态枚举,该枚举可以是DOWN,TAPPED,RELEASED,NONE之一。上课很大程度上是基于对这个问题的回答
我花了过去2个小时的时间来寻找解决方案,但没有发现太多。我确实找到了一些使用回调方法的替代方法,例如:
if (glfwGetKey(window, key) == GLFW_PRESS)
Run Code Online (Sandbox Code Playgroud)
和
if (glfwGetKey(windowm key) == GLFW_RELEASE)
Run Code Online (Sandbox Code Playgroud)
但是我找不到一种方法来检测单个按键,即GLFW_REPEAT状态,因为该glfwGetKey方法只能检测GLFW_PRESS和GLFW_RELEASE。
如果有人可以告诉我一种方法来检测单个按键敲击glfwGetKey,或者使GLFW回调更轻松,更流畅,我将不胜感激。
谢谢 :)
java ×2
opengl ×2
c++ ×1
glfw ×1
glsl ×1
lwjgl ×1
math ×1
raytracing ×1
recursion ×1
user-input ×1