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 ... P>
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 Pour le reste, Google m'a donné Dans la conférence CG de mon université, ils utilisent PS: J'ai essayé de lier à des sites, mais je n'ai pas encore assez de représentant p> boost code> a une algèbre de base, mais je n'ai rien trouvé sur la qualité de sa vitesse. P>
Armadillo code>, 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 code>, 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 code>, que j'ai également vu mentionné ici sur Stackoverflow lors de la recherche ici. P>
HLSL CODE> 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 code> 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 :) p>
5 Réponses :
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. p>
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. p>
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. p>
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
Pour mes projets, j'ai utilisé Notez que les bibliothèques telles que Aussi, la bibliothèque GLM code>, peut-être cela vous conviendrait également. P>
boost :: ublas code> ou
seldon code> 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). em> p>
dxmath code> DirectX est plutôt bonne, bien que parfois difficile à utiliser, en raison de son style C-compatible. P>
Vous pouvez consulter le code source pour Povray P>
Povray n'est pas exactement un exemple brillant d'une base de code C ++, n'est-ce pas?
Vous devez regarder http://ompf.org/forum/ P>
Ce forum traite de rayonnage en temps réel, principalement en C ++. Il vous donnera des pointeurs et des échantillons source. P>
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. P >
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. P>
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.