2017-02-22 15 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 = vec3(0.0、2.0を参照することができ、有効な です、3.0)。

P = O + T * dirを

Imはまた、レイトレーシングを学びます。 shadertoyアカウントを共有しても構いません。あなたはそのようなコメントを残します。 私はあなたの進歩に従うことができ、一緒に学びます。ここ

shadertoy(Iいくつかのコードをクリーンアップでしたが、我々は良いチームです)

+0

これは、より多くのチャットのような答えよりも見えています。 –

+0

ここに私の最初の答え。あなたが例としてそれを取る答えを待っている。ありがとう。 – Nabr

+0

Drat !!私はそれがこの単純だったことを見て疲れていたように見えます。どうもありがとう !うん、交換するのが楽しいです。シャドートーイの私のニックネームはMuskaです。 – Mathias

関連する問題