【问题标题】:Fragment shader - sphere ray tracing - nothing displayed片段着色器 - 球体光线追踪 - 没有显示
【发布时间】:2017-07-12 20:22:39
【问题描述】:

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

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

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);
    }    
}

我很难理解为什么这不起作用...

有什么想法吗?

【问题讨论】:

    标签: webgl shader fragment-shader raytracing


    【解决方案1】:

    这不是一个好的答案:)

    您的交叉点测试有效 我已将原点从负数更改为正数,我可以看到一个球体

    r.orig = vec3(0.0, 2.0, 3.0);

    P=o + t*dir

    我也在学习光线追踪。如果您不介意分享您的 shadertoy 帐户。你发表评论之类的。 我可以跟随你的进步,我们一起学习。

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

    【讨论】:

    • 我在这里的第一个答案。等你回答以它为例。谢谢。
    • 吸!!看起来我很累,看到它这么简单。非常感谢 !是的,很高兴交换,我在shadertoy上的昵称是Muska。
    • 很高兴能提供帮助,正如我所说,我也在学习。所以这只是一个快速修复。在进一步的示例中,例如,如果您要计算 viewMatrix,则必须将球体放在相机前面。更新了着色玩具。继续前进!
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2019-11-29
    • 2018-05-31
    • 2018-11-19
    相关资源
    最近更新 更多