片段着色器 - 球体光线追踪 - 没有任何显示

问题描述:

我想要做一个简单的光线追踪器来使用片段着色器来显示阴影球体。片段着色器 - 球体光线追踪 - 没有任何显示

我做了当前的代码,至少显示一个圆,但是这不显示任何东西。我假设的数学是正确的,因为它是一个简单的二次公式:

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(我做了一些代码清理,我们是一支优秀的球队)

+0

这看起来更像是一个比答案聊天。 –

+0

我的第一个答案在这里。等待你回答,以此为例。谢谢。 – Nabr

+0

Drat!看起来我很累,看到这很简单。非常感谢 !是的,这将是一个愉快的交换,我在檀香的绰号是穆斯卡。 – Mathias