Webgl 片段着色器-球体光线跟踪-不显示任何内容

Webgl 片段着色器-球体光线跟踪-不显示任何内容,webgl,shader,fragment-shader,raytracing,Webgl,Shader,Fragment Shader,Raytracing,我想做一个简单的光线跟踪器,使用片段着色器显示着色球体 我使用当前代码至少显示一个圆,但这不显示任何内容。我假设数学是正确的,因为它是一个简单的二次公式: struct Sphere { vec3 center; float radius; }; struct Light { vec3 pos; vec3 color; float intensity; }; struct Ray { vec3 orig; vec3 dir; };

我想做一个简单的光线跟踪器,使用片段着色器显示着色球体

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

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);
    }    
}
struct-Sphere
{
vec3中心;
浮动半径;
};
结构光
{
vec3位置;
vec3颜色;
漂浮强度;
};
结构射线
{
vec3-orig;
vec3-dir;
};
布尔二次型(浮点a、浮点b、浮点c、输出浮点s1、输出浮点s2)
{
浮动增量=(b*b)-(4.0*a*c);
如果(δ<0.0)
{
返回false;
}
如果(增量==0.0)
{
s1=s2=(-b/(2.0*a));
返回true;
}
其他的
{
s1=(-b-sqrt(δ))/(2.0*a);
s2=(-b+sqrt(δ))/(2.0*a);
返回true;
}
}
bool iSphere(光线r、球体s、外浮点数t)
{
vec3 l=r.原点-s.中心;
浮点a=点(r.dir,r.dir);
浮点数b=2.0*点(r.dir,l);
浮点数c=点(l,l)-(s半径*s半径);
浮球s1、s2;
if(二次型(a,b,c,s1,s2)=真)
{
t=最小值(s1,s2);
返回true;
}
返回false;
}
无效主图像(输出vec4 fragColor,输入vec2 fragCoord)
{
vec2 uv=fragCoord.xy/iResolution.xy;
/////////////////////////////////////////
/////////布景///////////////////
/////////////////////////////////////////
球面s;
s、 中心=vec3(0.0,0.0,-3.0);
s、 半径=1.0;
光l;
l、 pos=vec3(0.0,5.0,-3.0);
l、 颜色=vec3(1.0,1.0,1.0);
l、 强度=2.0;
/////////////////////////////////////////
////////////投射光线/////////////////
/////////////////////////////////////////
雷·r;
r、 orig=vec3(0.0,2.0,-3.0);
r、 dir=vec3(-1.0+2.0*uv,-1.0);
/////////////////////////////////////////
////////////计算交点/////////
/////////////////////////////////////////
浮动t;
如果(iSphere(r,s,t)==真)
{
fragColor=vec4(1,0,0,1);
}
其他的
{
fragColor=vec4(1,1,0,1);
}    
}
我很难理解为什么这不起作用


有什么想法吗?

这不是一个好答案:)

你的交叉测试是有效的 我把原点从负值改为正值,我可以看到一个球体

r、 orig=vec3(0.0,2.0,3.0)

p=o+t*dir

我也在学习光线追踪。如果你不介意分享你的shadertoy账户。你留下评论之类的。 我可以跟踪你的进度,我们一起学习


下面是(我做了一些代码清理,我们是一个很好的团队)

我的第一个答案。等待你的回答,以它为例。谢谢,该死的!!看来我看到这么简单就累了。谢谢!是的,我很高兴能去埃切,我在沙德托的绰号是马斯卡。很高兴能帮上忙,就像我说的,我也在学习。所以这只是一个快速解决方案。在进一步的示例中,例如,如果要计算viewMatrix,必须将球体放置在相机前面。更新了shadertoy。继续!