片段着色器 - 球体光线追踪 - 没有任何显示
问题描述:
我想要做一个简单的光线追踪器来使用片段着色器来显示阴影球体。片段着色器 - 球体光线追踪 - 没有任何显示
我做了当前的代码,至少显示一个圆,但是这不显示任何东西。我假设的数学是正确的,因为它是一个简单的二次公式:
struct Sphere
{
vec3 center;
float radius;
};
struct Light
{
vec3 pos;
vec3 color;
float intensity;
};
struct Ray
{
vec3 orig;
vec3 dir;
};
bool quadratic(float a, float b, float c, out float s1, out float s2)
{
float delta = (b*b) - (4.0*a*c);
if(delta < 0.0)
{
return false;
}
if(delta == 0.0)
{
s1 = s2 = (-b/(2.0*a));
return true;
}
else
{
s1 = (-b-sqrt(delta))/(2.0*a);
s2 = (-b+sqrt(delta))/(2.0*a);
return true;
}
}
bool iSphere(Ray r, Sphere s, out float t)
{
vec3 l = r.orig - s.center;
float a = dot(r.dir, r.dir);
float b = 2.0*dot(r.dir,l);
float c = dot(l,l) - (s.radius*s.radius);
float s1, s2;
if(quadratic(a,b,c,s1,s2) == true)
{
t = min(s1,s2);
return true;
}
return false;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
vec2 uv = fragCoord.xy/iResolution.xy;
/////////////////////////////////////////
/////////DECLARE SCENE///////////////////
/////////////////////////////////////////
Sphere s;
s.center = vec3(0.0, 0.0, -3.0);
s.radius = 1.0;
Light l;
l.pos = vec3(0.0, 5.0, -3.0);
l.color = vec3(1.0, 1.0, 1.0);
l.intensity = 2.0;
/////////////////////////////////////////
////////////CAST THE RAY/////////////////
/////////////////////////////////////////
Ray r;
r.orig = vec3(0.0, 2.0, -3.0);
r.dir = vec3(-1.0+2.0*uv, -1.0);
/////////////////////////////////////////
////////////COMPUTE INTERSECTION/////////
/////////////////////////////////////////
float t;
if(iSphere(r,s,t) == true)
{
fragColor = vec4(1,0,0,1);
}
else
{
fragColor = vec4(1,1,0,1);
}
}
我有一个很难得到为什么这是不工作...
任何想法?
答
,这不是一个很好的答案:)
您的相交测试是有效的 我已经改变了原点由负转正,我可以看到一个球体
r.orig = VEC 3(0.0,2.0 ,3.0);
P = o + t * dir
我也在学习光线跟踪。如果你不介意分享你的shadertoy帐户。你留下评论,就像那样。 我可以按照你的进展,我们一起学习。
这里是shadertoy(我做了一些代码清理,我们是一支优秀的球队)
这看起来更像是一个比答案聊天。 –
我的第一个答案在这里。等待你回答,以此为例。谢谢。 – Nabr
Drat!看起来我很累,看到这很简单。非常感谢 !是的,这将是一个愉快的交换,我在檀香的绰号是穆斯卡。 – Mathias