J'aimerais explorer la rastérisation basée sur un logiciel en temps réel. Je sais que tout va vers le GPU ces jours-ci, mais il y a quelques jeux où il est toujours judicieux d'utiliser un logiciel de rendu.
Par exemple: Voxeltron
Voxatron est un jeu de tir d'arène qui se déroule dans un monde fait de voxels (petits cubes, en quelque sorte). Tout dans le jeu est affiché dans un affichage virtuel de voxel 128x128x64, y compris les menus et l'inventaire des joueurs. Si vous regardez de près, vous pouvez parfois voir l'inventaire (score / vie / munitions) projeter une ombre sur certains des objets au sol.
Je travaille depuis longtemps sur des outils de rendu et de modélisation de voxels, dans le but ultime de créer un grand jeu d'aventure d'exploration. Il y a environ six mois, cela a fusionné avec le travail que je faisais sur les tireurs d'arène pour Conflux, et c'est le résultat.
C'est un jeu assez simple dans l'âme - principalement Robotron situé dans un monde destructible en 3D avec des créatures loufoques. Je ne sais pas à quel point les implications de la destructibilité seront importantes pour le gameplay, mais il est certainement amusant de faire sauter des morceaux de mur. J'ai également ajouté un capteur expérimental de construction de murs que vous pouvez utiliser pour construire des barrières pour vous cacher des monstres effrayants.
Le jeu se déroule dans un petit ensemble d'arènes. Certains d'entre eux disposent de salles avec des pièces d'action, quelque part entre Knightlore et Smash TV. C'est une partie de la conception originale basée sur l'aventure qui se faufile et une excuse pour créer des environnements thématiques.
Fonctionnalités:
- Rendu logiciel personnalisé avec des ombres douces.
- Synthétiseur de son et de musique intégré (également utilisé pour créer la musique de la bande-annonce).
- Lecture et enregistrement après le match.
Réponses:
Je vais supposer que vous connaissez déjà une algèbre linéaire de base, le genre impliqué dans: les projections 3D, la configuration de la caméra, la transformation des sommets en position mondiale, etc. Si vous ne le faites pas, il y a beaucoup de bons endroits pour apprendre. En voici deux que j'aime:
Architecture du moteur de jeu
Rendu en temps réel
Une fois que vous savez comment représenter et gérer les objets 3D, vous êtes prêt à regarder comment les dessiner à l'écran. En règle générale, cela se fait avec une technique de tramage de triangle de ligne de balayage. C'est en fait un concept assez simple. Vous dessinez une ligne d'un triangle à la fois tout en interpolant les coordonnées de couleur et de texture uv. Ce processus se poursuit pour tous les triangles à l'écran. Vous pouvez même implémenter un tampon de profondeur pour gérer le rendu dans le désordre.
Ceci est traité plus en détail dans ces articles:
Tutoriel - Introduction au rendu logiciel: rastérisation triangulaire
École de rendu logiciel: Partie I
Et juste pour le plaisir, consultez l'article suivant:
Examen du code source de Quake 2 3/4 (logiciel de rendu)
la source
C'est un sujet assez large. Cependant, il y a deux parties de base: la théorie réelle de la transformation graphique et du pipeline de rastérisation, et les bits d'implémentation réels qui vous permettent d'exploser les pixels à l'écran comme vous le souhaitez. En plus de cela, il y a aussi l'optimisation (en particulier du dernier bit).
La première partie est heureusement la même que la théorie utilisée pour le pipeline graphique exposée par le matériel et les API modernes. Si vous le savez déjà, vous êtes prêt. Si vous ne le faites pas, je recommande un bon livre. Celui-ci est assez bon.
Il y a beaucoup d'options pour la deuxième partie. Ils dépendent fortement de votre choix de système d'exploitation et de chaîne d'outils. Si vous utilisez C ou C ++, sous Windows, vous pouvez simplement tracer des pixels directement sur une image bitmap GDI (
SetPixel
est simple, mais douloureusement, inutile et lent -CreateDIBSection
vous donne un morceau d'octets bruts que vous pouvez manipuler à un rythme beaucoup plus rapide).Vous pouvez également acquérir une surface DirectDraw et y écrire, ou écrire dans une texture Direct3D ou OpenGL. Dans ces derniers cas, vous utiliserez toujours du matériel, mais tant que vous effectuez vous-même toute la composition de l'image finale sur le processeur et que vous utilisez les API matérielles pour copier les résultats sur l'écran, cela compte toujours. Sur les PC modernes, vous ne pouvez pas accéder à la VRAM brute ou à quoi que ce soit directement de toute façon.
Si vous souhaitez en savoir plus, vous devriez probablement créer des questions plus spécifiques. Moi ou d'autres, je serais heureux d'y répondre.
la source
D'accord, je vais aborder cette question à partir des bases; quoi que ce soit au-delà de cela est trop large pour un simple AQ; vous devez acheter un livre sur le sujet.
La différence la plus fondamentale entre le rendu dans un logiciel et l'utilisation d'un GPU se résume au tracé des pixels. Autrement dit, lorsque vous effectuez un rendu logiciel, vous êtes en fin de compte responsable du traçage de chaque fichu pixel, alors qu'avec un GPU, le traçage des pixels est largement automatisé par le matériel et vous "massez" simplement le pipeline de pixels à l'aide de shaders.
Par exemple, pensez à ce que vous devez faire en tant que programmeur pour afficher un triangle 3D à l'écran. Avec un GPU, vous dites à peu près au matériel quelles sont les coordonnées X, Y, Z des sommets, puis la carte vidéo remplit tous les pixels de l'écran qui composent l'image d'un triangle. Vous pouvez utiliser un shader pour dire au GPU de changer la couleur de chaque pixel en fonction d'une texture ou de quelque chose, mais finalement, cela revient au GPU de remplir automatiquement tous les pixels pour vous.
Pour le rendu logiciel, vous devez calculer les pixels de l'écran à remplir, puis effectuer le blitting pour réellement remplir ces pixels. C'est-à-dire que vous feriez le calcul matriciel pour passer de l'espace de coordonnées de la scène 3D à l'espace de vue, puis projeter des points de l'espace de vue sur l'écran, etc.
la source