2010-09-20 7 views
1

Je commence à transférer mon jeu vers XNA depuis une base de code C/OpenGL. J'arrive maintenant au code de rendu, et je me demande quelles sont les meilleures méthodes pour passer d'un système où vous liez simplement une texture avec un appel, puis produisez des objets de sommets tampons à un ensemble équivalent de méthodes XNA? Je peux voir comment vous passez les données de sommet, mais je ne suis pas exactement sûr de la façon dont vous liez une texture. Faut-il tout faire dans les shaders, ou y a-t-il une procédure simple pour cela dans XNA?OpenGL porté sur XNA

Mon principal code de rendu pour les modèles est la suivante (je présente mes excuses pour les petits noms de variables)

glEnable(GL_TEXTURE_2D); 
glEnable(GL_CULL_FACE); 

glBindTexture(GL_TEXTURE_2D, obj->tx); 

glColor4f(c.r, c.g, c.b, c.a); 

glBindBuffer(GL_ARRAY_BUFFER, obj->iVBO); 
glVertexPointer(3, GL_FLOAT, (sizeof(float) * 3) + (sizeof(float) * 2), 0); 
glTexCoordPointer(2, GL_FLOAT, (sizeof(float) * 3) + (sizeof(float) * 2), (const GLvoid*)(4 * 3)); 
glDrawArrays(GL_TRIANGLES, 0, obj->iSize); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

Répondre

2

De the MSDN documentation here, voici comment vous liez une texture (deux, en fait):

graphics.GraphicsDevice.Textures[0] = firstTexture; 
graphics.GraphicsDevice.Textures[1] = secondTexture; 

Ensuite, vous définissez vos tampons de vertex et d'index (au besoin) sur le périphérique avec la propriété Indices et la méthode SetVertexBuffer() respectivement. Ensuite, vous les dessinez avec l'une des méthodes GraphicsDevice.Draw*(). Si vous ne faites que rendre des modèles, alors vous pouvez regarder dans la classe Model (qui va gérer ce genre de chose pour vous, y compris l'importation de modèles à travers le pipeline de contenu).

En outre, si vous utilisez BasicEffect, il dispose également d'un membre Texture que vous pouvez utiliser pour gérer la texture.

0

Vous liez normalement les textures au périphérique à l'aide de la propriété GraphicsDevice.Textures. L'exemple de code utilise XNA 4.0. Le port de votre code ressemblerait à quelque chose comme:

 GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; 
     GraphicsDevice.Textures[0] = obj.tx; 
     GraphicsDevice.SetVertexBuffer(obj.iVBO); 

     effectColorParameter.SetValue(c.ToVector4()); 
     effect.CurrentTechnique.Passes[0].Apply(); 

     GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, obj.triangleCount); 
     GraphicsDevice.SetVertexBuffer(null); 

Ou si vous voulez utiliser un BasicEffect vous lier la texture directement à l'effet.

 basicEffect.Texture = obj.tx; 
     basicEffect.TextureEnabled = true;