use*_*526 7 opengl raytracing glsl
我需要进行有限形式的光线追踪.我不需要反思.我只需要改变一个像素的颜色,这取决于它如何通过一个物体和折射.我也只需要测试光线和球体和磁盘之间的交叉点,没有别的.
这是我的着色器中的主要功能:
void main(void)
{
Ray ray;
ray.origin=vec3(0.5,0.5,.75);
ray.direction=vec3(gl_FragCoord.x/width,gl_FragCoord.y/height,-gl_FragCoord.z)-ray.origin;
ray.direction=normalize(ray.direction);
gl_FragColor=trace(ray);
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是关于射线的起源.我如何获得它的位置?现在,我只是摆弄它直到看起来正确,但如果我改变屏幕的宽度或高度,我必须四处玩,直到它看起来正确.
我的第二个问题是关于光线和光盘之间的交叉.我这样做是首先检查光线是否与平面相交,然后检查交叉点是否在光盘的半径范围内.我的代码看起来像这样
float intersectPlane(Ray ray,vec3 point,vec3 normal)
{
return dot(point-ray.origin,normal)/dot(ray.direction,normal);
}
...
det=intersectPlane(ray,bodies[count].position,vec3(0,0,1));
if(det>0)
{
if(distance(det*ray.direction,bodies[count].position)<=bodies[count].radius)
{
return vec4(1.0,0.0,0.0,1.0);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是如果body [count] .radius小于或等于光线原点的z位置,则不显示任何内容.所以
if(det>0)
{
if(distance(det*ray.direction,bodies[count].position)<=.76)
{
return vec4(1.0,0.0,0.0,1.0);
}
}
Run Code Online (Sandbox Code Playgroud)
导致可见磁盘,而使用实际半径导致什么都没有.