10
votes

Voulant écrire un Raytracer, coincé sur quelle bibliothèque d'algèbre à utiliser (C ++)

J'ai voulu écrire mon propre Raytracer en temps réel multithread en C ++, mais je ne veux pas mettre en œuvre tout le vecteur et la logique matricielle qui l'accompagne. Je pensais que je ferais des recherches pour trouver une bonne bibliothèque pour cela, mais je n'ai pas eu beaucoup de succès ...

Il est important que la mise en œuvre soit rapide et que, de préférence, cela vient avec une licence amicale. J'ai lu que boost a une algèbre de base, mais je n'ai rien trouvé sur la qualité de sa vitesse.

Pour le reste, Google m'a donné Armadillo , qui prétend être très rapide et se compare à certaines autres bibliothèques que je n'ai pas entendues.
Ensuite, j'ai eu seldon , qui prétend également être efficace et pratique, bien que je ne puissiez pas savoir où ils sont exactement sur la balance.
Enfin, j'ai lu sur Eigen , que j'ai également vu mentionné ici sur Stackoverflow lors de la recherche ici.

Dans la conférence CG de mon université, ils utilisent HLSL pour l'algèbre (les étudiants mettent en œuvre / optimiser les parties du rayonneur), qui me permettait de penser si je pouvais ou non utiliser GLSL pour cela. Encore une fois, je n'ai aucune idée de l'option la plus efficace ou de ce que le consensus général est sur les bibliothèques d'algèbre. J'espérais que cela pourrait m'aider ici, afin que je puisse commencer avec un véritable développement :)

PS: J'ai essayé de lier à des sites, mais je n'ai pas encore assez de représentant


1 commentaires

Je recommanderais vivement ompf.org ( omf.org ) Leurs forums sont remplis de certains des rayonneurs les plus rapides existants. Et beaucoup d'entre eux incluent des informations détaillées sur la façon dont ils fonctionnent.


5 Réponses :


12
votes

Je recommanderais de rédiger vos propres routines. Lorsque j'ai écrit mon Raytracer, j'ai constaté que la majeure partie de l'algèbre utilisait la même petite collection de méthodes. Fondamentalement, tout ce dont vous avez besoin est une classe de vecteur qui prend en charge l'addition, la soustraction, etc. et à partir de là, tout ce dont vous avez vraiment besoin est DOT et CROSS.

Et pour être honnête à l'aide de GLSL ne va pas vous donner beaucoup plus que de toute façon (ils ne soutiennent que les mathématiques de vecteur, de la croix et de vecteur, tout le reste doit être codé à la main). Je recommanderais également du prototypage en C ++ puis de passer à Cuda après. Il est assez difficile de déboguer un code GPU afin que vous puissiez le faire fonctionner dans la CPU, puis le recodez un peu à travailler à Cuda.

En réalité, les rayonneurs sont assez simples. Cela les rend vite difficile. Ce sont les structures d'accélération qui vont prendre la majeure partie de votre temps et d'optimisation. Au moins cela m'a fait pour moi.


5 commentaires

Avez-vous écrit vos propres routines d'intersection Ray-Object, ou existe-t-il une bibliothèque peut gérer cela?


C'est exactement le type de réponse que je cherchais, merci!


J'ai écrit le mien. Et ce n'est pas difficile. J'ai commencé avec une force brute, Triangle seulement Raytracer. J'ai écrit un exportateur de Blender qui exporterait tout objet comme liste de triangles. Ensuite, V1 de la Raytracer doit uniquement faire une intersection Ray-> Triangle. Après cela, j'ai mis en œuvre un arbre BVH. Fondamentalement, vous prenez des groupes de triangles et vous les enveloppez en cubes. Les cubes sont enveloppés dans plus de cubes. De là, vous faites simplement un test d'intersection Ray-> Cube et continuez à marcher sur l'arbre jusqu'à ce que vous ayez frappé un triangle.


Dans la version finale, l'arborescence a été créée dans la CPU, puis aplatit dans un bloc de mémoire qui a été introduit dans le GPU (via Cuda) où la détection de collision a été réalisée.


Ceci est long après l'opération, mais de nouvelles choses se produisent: le en.wikipedia.org/wiki/openrlleight La bibliothèque fait la majeure partie de l'accélération structurant (et fournit les types de base dont vous auriez besoin) - considérez que cela ressemble à OpenGL, en ce que vous n'avez pas besoin (ou que vous souhaitez) avoir à mettre en place des lignes de remplissage de poly et de Bresenham. Laissez simplement la bibliothèque gérer les bits laids pendant que vous vous concentrez sur le contenu



0
votes

Pour mes projets, j'ai utilisé GLM , peut-être cela vous conviendrait également.

Notez que les bibliothèques telles que boost :: ublas ou seldon ne vous conviennent probablement pas, car ils sont orientés blasés (et je suppose que vous 'Re la recherche d'une bonne bibliothèque algébrique linéaire conduite 3D).

Aussi, la bibliothèque dxmath DirectX est plutôt bonne, bien que parfois difficile à utiliser, en raison de son style C-compatible.


0 commentaires

0
votes

Vous pouvez consulter le code source pour Povray


1 commentaires

Povray n'est pas exactement un exemple brillant d'une base de code C ++, n'est-ce pas?



2
votes

Vous devez regarder http://ompf.org/forum/

Ce forum traite de rayonnage en temps réel, principalement en C ++. Il vous donnera des pointeurs et des échantillons source.

La plupart du temps, comme chaque cycle compte, les gens ne s'appuient pas sur des libs de mathématiques de vecteur externes: les optimisations dépendent du compilateur que vous utilisez, de l'affranchissement, de l'utilisation de SSE (ou de garantie) ou non, etc.


0 commentaires

1
votes

Je recommande "ILMBASE" qui fait partie du package OpenExR . C'est bien écrit C ++, développé par ILM et largement utilisé par les personnes qui écrivent et utilisent des logiciels graphiques professionnels.


0 commentaires