2016-11-16 2 views
1

Comment puis-je calculer les coordonnées d'intersection de l'espace oculaire dans un programme OptiX? Mes recherches ont montré que seules les coordonnées de l'objet et du monde sont fournies, mais je ne peux pas croire qu'il n'y ait aucun moyen d'obtenir les coordonnées de l'espace oculaire.Points d'intersection de l'espace oculaire Nvidia Optix

Répondre

1

Il est possible de faire tourner le point d'intersection par l'orientation de la caméra comme ceci:

__device__ void worldToEye(float3& pointInOut) 
{ 
    const float3 Un = normalize(U); 
    const float3 Vn = normalize(V); 
    const float3 Wn = normalize(W); 

    const float viewMat[3][3] = {{Un.x, Un.y, Un.z}, 
           {Vn.x, Vn.y, Vn.z}, 
           {Wn.x, Wn.y, Wn.z}}; 

    float point[3] = {pointInOut.x, pointInOut.y, pointInOut.z}; 
    float result[3] = {0.0f, 0.0f, 0.0f}; 

    for (int i=0; i<3; ++i) 
    { 
     for (int j=0; j<3; ++j) 
     { 
      result[i] += viewMat[i][j] * point[j]; 
     } 
    } 

    pointInOut.x = result[0]; 
    pointInOut.z = result[1]; 
    pointInOut.y = result[2]; 
} 

Avec le point d'entrée calculée:

float3 hit_point = t_hit * ray.direction; 
worldToEye(hit_point); 
prd.result = hit_point; 
-1

Optix n'a pas coord des yeux. car il est basé sur le lancer de rayon et non sur le tramage. D'abord, vous devriez vous demander ce que l'œil coord. utilisé dans les shaders base sur rastering. Basiclly pour le test de profondeur, l'écrêtage, etc. Mais tout cela n'est pas une chose dans les shaders de ray-tracing. Quand un rayon jette d'un point dans le monde coord avec une certaine direction, les exécutions suivantes sont toutes dans le monde coord. Il n'y a pas d'écrêtage parce que tous les rayons correspondent à des pixels spécifiques. et Il n'y a pas de test de profondeur car tous les rayons sont détectés dans le programme d'intersection, seul le point de contact le plus proche sera transmis au programme de coup fermé. Donc, en conclusion, vous devriez abandonner certains mécanismes ou lignes de tuyaux utilisés dans le shadering basé sur le rastering, et acquérir de nouvelles compétences utilisées dans le shadering basé sur le ray-tracing.

mauvais anglais, mes excuses :)

+0

espace yeux dans RayTracing = (0,0, 0,0, 0,0) centre à la position de la caméra/oeil/capteur. J'ai mis à jour ma réponse avec une fonction plus avancée –

+0

Mes excuses à vous pour mes réponses non-relatives à la question, que j'ai réalisé aujourd'hui. Je pense qu'il est facile de dissimuler une intersection dans l'espace du monde vers «l'espace des yeux», d'ailleurs je ne prétends pas qu'il soit nécessaire d'exister. Il suffit de multiplier ce point avec la matrice inverse de la caméra que vous avez passé à rayon-gen-programme. –