2017-02-22 92 views
0

我想要做一個簡單的光線追蹤器來使用片段着色器來顯示陰影球體。片段着色器 - 球體光線追蹤 - 沒有任何顯示

我做了當前的代碼,至少顯示一個圓,但是這不顯示任何東西。我假設的數學是正確的,因爲它是一個簡單的二次公式:

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

我有一個很難得到爲什麼這是不工作...

任何想法?

回答

0

,這不是一個很好的答案:)

您的相交測試是有效的 我已經改變了原點由負轉正,我可以看到一個球體

r.orig = VEC 3(0.0,2.0 ,3.0);

P = o + t * dir

我也在學習光線跟蹤。如果你不介意分享你的shadertoy帳戶。你留下評論,就像那樣。 我可以按照你的進展,我們一起學習。

這裏是shadertoy(我做了一些代碼清理,我們是一支優秀的球隊)

+0

這看起來更像是一個比答案聊天。 –

+0

我的第一個答案在這裏。等待你回答,以此爲例。謝謝。 – Nabr

+0

Drat!看起來我很累,看到這很簡單。非常感謝 !是的,這將是一個愉快的交換,我在檀香的綽號是穆斯卡。 – Mathias