2017-02-22 35 views
0

Я бы хотел сделать простой raytracer, чтобы отобразить заштрихованную сферу, используя шейдер фрагмента.Фрагмент-шейдер - трассировка лучей - ничего не отображается

Я сделал текущий код, по крайней мере, для отображения круга, но это ничего не отображает. Я полагаю, математику, чтобы быть правильным, поскольку она является простой квадратичной формулой:

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 = о + т * реж

Im также трассировка лучей обучения. если вы не возражаете поделиться своей учетной записью shadertoy. Вы оставляете комментарий, что-то в этом роде. Я могу следить за вашей прогрессией, и мы учимся вместе.

вот shadertoy (я сделал некоторый код очистки, мы хорошая команда)

+0

Это больше похоже на чат, чем ответ. –

+0

Мой первый ответ здесь. Жду вас ответить, чтобы взять его в качестве примера. Благодарю. – Nabr

+0

Drat !! Похоже, я устал, чтобы увидеть, что все просто. Большое спасибо ! Да, было бы приятно обменяться, Мое прозвище на шадертой - Муска. – Mathias