我正在尝试开发一个基本的光线追踪器。到目前为止,我已经计算了与平面和blinn-phong明暗处理的交点。我正在处理一个500*500的窗口,我的主要光线生成代码如下
vec3 rayDirection = vec3( gl_FragCoord.x-250.0,gl_FragCoord.y-250.0 , 10.0);
现在我怀疑上面的方法是对还是错。请给我一些见解。
我也有疑问,我们是否需要在OpenGL代码中构造几何,而在GLSL中构造rayTracing。例如,如果我试图光线跟踪一个平面,我需要使用glVertex2f在OpenGL代码中构造平面吗?
发布于 2011-12-20 13:34:19
vec3 rayDirection = vec3( gl_FragCoord.x-250.0,gl_FragCoord.y-250.0,10.0);
现在我怀疑上面的方法是对还是错。请给我一些见解。
预测没有对错之分。您也可以将视口像素映射到方位角和仰角。实际上,你做这件事的方式并不是那么糟糕。我只需要传递一个额外的统一的视口尺寸,而不是硬编码,并对向量进行标准化。从字面上看,Z分量的工作方式类似于焦距。
我也怀疑我们是否需要在OpenGL代码中构造几何,而在
中构造rayTracing。例如,如果我试图光线跟踪一个平面,我需要使用glVertex2f在OpenGL代码中构造平面吗?
光线跟踪作用于包含完整场景的全局描述。然而,OpenGL基元是纯本地的,即仅仅是单个三角形、线或点,并且OpenGL不维护场景数据库。因此,使用常用的OpenGL绘图函数传递的几何体不能进行光线追踪(至少不能以这种方式)。
这是使用GLSL进行光线跟踪的最大障碍:您需要以某种方式实现一种将整个场景作为可自由访问的缓冲区的方式。
发布于 2011-12-27 18:02:58
可以使用光线行进在单个片段着色器中渲染某些类型的复杂场景。这里有一些例子:(使用Chrome或FireFox,需要WebGL)
礼品盒:http://glsl.heroku.com/e#820.2
Torus之旅:http://glsl.heroku.com/e#794.0
圣诞树:http://glsl.heroku.com/e#729.0
莫杜特罗波利斯:http://glsl.heroku.com/e#327.0
让这些东西工作的关键是编写“距离函数”,告诉光线行进器它离物体表面有多远。有关距离函数的详细信息,请参阅:
http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
https://stackoverflow.com/questions/8575221
复制