[c#][DirectX] DrawIndexedPrimitives() qui ne fonctionne pas

DrawIndexedPrimitives() qui ne fonctionne pas [c#][DirectX] - C#/.NET managed - Programmation

Marsh Posté le 08-03-2006 à 18:18:19    

Bonjour à tous, je démarre dans le c# + direct3D, j'ai récupéré un exemple (CustomUi) du SDK directx de février 2006, qui utilise des référence à l'assembly directX version 2.0.0.0 (je ne sais pas si cette information a de l'importance, mais j'ai rencontré de méchantes différences avec les exemples qui utilisaient les anciennes versions)
 
voilà donc mon problème : je cherche à dessiner.... une BOITE ! oui. et ça ne fonctionne pas. non. :pfff: D'où drame.
 
Pour arriver à ce non-resultat, j'utilise la technique de l'IndexedBuffer, qui ne pose aucun soucis (pas d'erreur d'execution ni de compilation en tout cas)
puis, lors de l'affichage, avec la fonction DrawIndexedPrimitive... aucune erreur, à part que la forme qui devrait être affichée ne l'est pas.
 
voici donc ma classe censée formaliser une boite... (vous noterez la différence de la nouvelle syntaxe à utiliser pour les graphicbuffers... Enfin je dis "à utiliser", je veux dire que cette syntaxe passe au compilateur alors que l'ancienne, non:jap: )

Code :
  1. public class WookBox
  2.     {
  3.         private float[] size = new float[3];
  4.         private VertexBuffer vertices = null;
  5.         private IndexBuffer indices = null;
  6.         public WookBox(Device device,float sx, float sy, float sz) {
  7.             size[0] = sx; size[1] = sy; size[2] = sz;
  8.             vertices = new VertexBuffer(device, 8 * PositionColored.StrideSize, 0, PositionColored.Format, Pool.Default, new EventHandler(OnVertexBufferCreated));
  9.             indices = new IndexBuffer(device, 36 *sizeof(int), 0, Pool.Default, false, new EventHandler(OnIndexBufferCreated));
  10.             device.DeviceLost += new EventHandler(OnLostDevice);
  11.             device.DeviceReset += new EventHandler(OnResetDevice);
  12.             return;
  13.            
  14.         }
  15.        
  16.         private void OnVertexBufferCreated(Object sender, EventArgs e) {
  17.             VertexBuffer buf = (VertexBuffer)sender;
  18.             //System.Drawing.Color c = System.Drawing.Color.Orange;
  19.             int c = System.Drawing.Color.Orange.ToArgb();
  20.             PositionColored[] verts = new PositionColored[8];
  21.            
  22.             int i = 0;
  23.             verts[i++]= new PositionColored(0.0f       , 0.0f      , 0.0f      , c);
  24.             verts[i++]= new PositionColored(size[0]    , 0.0f      , 0.0f      , c);
  25.             verts[i++]= new PositionColored(size[0]    , 0.0f      , size[2]   , c);
  26.             verts[i++]= new PositionColored(0.0f       , 0.0f      , size[2]   , c);
  27.             verts[i++]= new PositionColored(0.0f       , size[1]   , 0.0f      , c);
  28.             verts[i++]= new PositionColored(size[0]    , size[1]   , 0.0f      , c);
  29.             verts[i++]= new PositionColored(size[0]    , size[1]   , size[2]   , c);
  30.             verts[i++]= new PositionColored(0.0f       , size[1]   , size[2]   , c);
  31.             GraphicsBuffer gb = buf.Lock<PositionColored>(0, 0, LockFlags.None);
  32.             gb.GetBuffer<PositionColored>().Write(verts);
  33.             buf.Unlock();
  34.             gb.Dispose();
  35.         }
  36.  
  37.         private void OnIndexBufferCreated(Object sender, EventArgs e)
  38.         {
  39.             IndexBuffer buf = (IndexBuffer)sender;
  40.             short[] arr = new short[36];
  41.             int i = 0;
  42.             arr[i++] = 0; arr[i++] = 3; arr[i++] = 2;
  43.             arr[i++] = 0; arr[i++] = 2; arr[i++] = 1;
  44.             arr[i++] = 3; arr[i++] = 7; arr[i++] = 6;
  45.             arr[i++] = 3; arr[i++] = 6; arr[i++] = 2;
  46.             arr[i++] = 3; arr[i++] = 0; arr[i++] = 4;
  47.             arr[i++] = 3; arr[i++] = 4; arr[i++] = 7;
  48.             arr[i++] = 7; arr[i++] = 4; arr[i++] = 5;
  49.             arr[i++] = 7; arr[i++] = 5; arr[i++] = 6;
  50.             arr[i++] = 6; arr[i++] = 5; arr[i++] = 1;
  51.             arr[i++] = 6; arr[i++] = 1; arr[i++] = 2;
  52.             arr[i++] = 4; arr[i++] = 0; arr[i++] = 1;
  53.             arr[i++] = 4; arr[i++] = 1; arr[i++] = 5;
  54.             GraphicsBuffer gb = buf.Lock<short>(0, 0, LockFlags.None);
  55.             gb.GetBuffer<short>().Write(arr);
  56.             buf.Unlock();
  57.             gb.Dispose();
  58.         }
  59.         /// <summary>Occurs after the device has been reset</summary>
  60.         private void OnResetDevice(object sender, EventArgs e)
  61.         {
  62.             Device device = sender as Device;
  63.             if (indices != null) indices.Dispose();
  64.             if (vertices != null) vertices.Dispose();
  65.             vertices = new VertexBuffer(device, 8 * PositionColored.StrideSize, 0, PositionColored.Format, Pool.Default, new EventHandler(OnVertexBufferCreated));
  66.             indices = new IndexBuffer(device, 36 * sizeof(int), 0, Pool.Default, false, new EventHandler(OnIndexBufferCreated));
  67.         }
  68.         /// <summary>Occurs before the device is going to be reset</summary>
  69.         private void OnLostDevice(object sender, EventArgs e)
  70.         {
  71.             if (indices != null) indices.Dispose();
  72.             if (vertices != null) vertices.Dispose();
  73.             indices = null;
  74.             vertices = null;
  75.         }
  76.         public void Render(Device device) {
  77.             //if (device == null || vertices == null || indices == null) return
  78.            
  79.             device.SetStreamSource(0, vertices, 0);
  80.             device.Indices = indices;
  81.             device.ColorFill =
  82.             device.VertexFormat = PositionColored.Format;
  83.             device.DrawIndexedPrimitives(
  84.               PrimitiveType.TriangleList,   // Type de primitives qu'on dessine
  85.               0,                            // Sommet de base
  86.               0,                            // Indice de sommet minimum
  87.               3,                            // Nombre de sommets utilisés
  88.               0,                            // Indice de départ
  89.               12);                          // Nombre de primitives
  90.         }
  91.     }


 
Ainsi que la fonction d'affichage de l'exemple
 

Code :
  1. public void OnFrameRender(Device device, double appTime, float elapsedTime)
  2.         {
  3.             bool beginSceneCalled = false;
  4.             // Clear the render target and the zbuffer  
  5.             device.Clear(ClearFlags.ZBuffer | ClearFlags.Target, 0x002D32AA, 1.0f, 0);
  6.            
  7.             try
  8.             {
  9.                 device.BeginScene();
  10.                 beginSceneCalled = true;
  11.                 device.Transform.View = camera.WorldMatrix * viewMatrix * camera.ProjectionMatrix;
  12.                 //truck.Render(device);
  13.                 WookBox wookbox = new WookBox(device, 5.0f, 2.0f, 3.0f);
  14.                 wookbox.Render(device);
  15.                
  16.                 device.Transform.World = Matrix.Translation(0.0f, 0.0f, -5.0f);
  17.                 Mesh mybox = Mesh.Box(device, 1f, 3f, 5f);
  18.                 mybox.DrawSubset(0);
  19.                
  20.                 //foreach (Palette p in palettes) p.Render(device);
  21.                
  22.                 // Update the effect's variables.  Instead of using strings, it would  
  23.                 // be more efficient to cache a handle to the parameter by calling  
  24.                 // Effect.GetParameter
  25.                 effect.SetValue("worldViewProjection", camera.WorldMatrix * viewMatrix * camera.ProjectionMatrix);
  26.                 effect.SetValue("worldMatrix", camera.WorldMatrix);
  27.                 effect.Technique = "RenderScene";
  28.                
  29.                
  30.                 // Render the mesh
  31.                 int passes = effect.Begin(0);
  32.                 Mesh localMesh = mesh.LocalMesh;
  33.                 for (int pass = 0; pass < passes; pass++)
  34.                 {
  35.                     effect.BeginPass(0);
  36.                     for(int i = 0; i < mesh.NumberMaterials; i++)
  37.                     {
  38.                         effect.SetValue("sceneTexture", mesh.GetTexture(i));
  39.                         effect.CommitChanges();
  40.                         localMesh.DrawSubset(i);
  41.                     }
  42.                     effect.EndPass();
  43.                 }
  44.                 effect.End();
  45.                
  46.            
  47.                 // Show frame rate
  48.                 RenderText();
  49.                 // Show UI
  50.                 hud.OnRender(elapsedTime);
  51.                 sampleUi.OnRender(elapsedTime);
  52.             }
  53.             finally
  54.             {
  55.                 if (beginSceneCalled) device.EndScene();
  56.             }


 
 
 
voilà, c'est tout ce que je vois pour l'instant.... si vous avez une idée, merci.

Reply

Marsh Posté le 08-03-2006 à 18:18:19   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed