Mad_Wookiee | 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. 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 :
- public class WookBox
- {
- private float[] size = new float[3];
- private VertexBuffer vertices = null;
- private IndexBuffer indices = null;
- public WookBox(Device device,float sx, float sy, float sz) {
- size[0] = sx; size[1] = sy; size[2] = sz;
- vertices = new VertexBuffer(device, 8 * PositionColored.StrideSize, 0, PositionColored.Format, Pool.Default, new EventHandler(OnVertexBufferCreated));
- indices = new IndexBuffer(device, 36 *sizeof(int), 0, Pool.Default, false, new EventHandler(OnIndexBufferCreated));
- device.DeviceLost += new EventHandler(OnLostDevice);
- device.DeviceReset += new EventHandler(OnResetDevice);
- return;
-
- }
-
- private void OnVertexBufferCreated(Object sender, EventArgs e) {
- VertexBuffer buf = (VertexBuffer)sender;
- //System.Drawing.Color c = System.Drawing.Color.Orange;
- int c = System.Drawing.Color.Orange.ToArgb();
- PositionColored[] verts = new PositionColored[8];
-
- int i = 0;
- verts[i++]= new PositionColored(0.0f , 0.0f , 0.0f , c);
- verts[i++]= new PositionColored(size[0] , 0.0f , 0.0f , c);
- verts[i++]= new PositionColored(size[0] , 0.0f , size[2] , c);
- verts[i++]= new PositionColored(0.0f , 0.0f , size[2] , c);
- verts[i++]= new PositionColored(0.0f , size[1] , 0.0f , c);
- verts[i++]= new PositionColored(size[0] , size[1] , 0.0f , c);
- verts[i++]= new PositionColored(size[0] , size[1] , size[2] , c);
- verts[i++]= new PositionColored(0.0f , size[1] , size[2] , c);
- GraphicsBuffer gb = buf.Lock<PositionColored>(0, 0, LockFlags.None);
- gb.GetBuffer<PositionColored>().Write(verts);
- buf.Unlock();
- gb.Dispose();
- }
-
- private void OnIndexBufferCreated(Object sender, EventArgs e)
- {
- IndexBuffer buf = (IndexBuffer)sender;
- short[] arr = new short[36];
- int i = 0;
- arr[i++] = 0; arr[i++] = 3; arr[i++] = 2;
- arr[i++] = 0; arr[i++] = 2; arr[i++] = 1;
- arr[i++] = 3; arr[i++] = 7; arr[i++] = 6;
- arr[i++] = 3; arr[i++] = 6; arr[i++] = 2;
- arr[i++] = 3; arr[i++] = 0; arr[i++] = 4;
- arr[i++] = 3; arr[i++] = 4; arr[i++] = 7;
- arr[i++] = 7; arr[i++] = 4; arr[i++] = 5;
- arr[i++] = 7; arr[i++] = 5; arr[i++] = 6;
- arr[i++] = 6; arr[i++] = 5; arr[i++] = 1;
- arr[i++] = 6; arr[i++] = 1; arr[i++] = 2;
- arr[i++] = 4; arr[i++] = 0; arr[i++] = 1;
- arr[i++] = 4; arr[i++] = 1; arr[i++] = 5;
- GraphicsBuffer gb = buf.Lock<short>(0, 0, LockFlags.None);
- gb.GetBuffer<short>().Write(arr);
- buf.Unlock();
- gb.Dispose();
- }
- /// <summary>Occurs after the device has been reset</summary>
- private void OnResetDevice(object sender, EventArgs e)
- {
- Device device = sender as Device;
- if (indices != null) indices.Dispose();
- if (vertices != null) vertices.Dispose();
- vertices = new VertexBuffer(device, 8 * PositionColored.StrideSize, 0, PositionColored.Format, Pool.Default, new EventHandler(OnVertexBufferCreated));
- indices = new IndexBuffer(device, 36 * sizeof(int), 0, Pool.Default, false, new EventHandler(OnIndexBufferCreated));
- }
- /// <summary>Occurs before the device is going to be reset</summary>
- private void OnLostDevice(object sender, EventArgs e)
- {
- if (indices != null) indices.Dispose();
- if (vertices != null) vertices.Dispose();
- indices = null;
- vertices = null;
- }
- public void Render(Device device) {
- //if (device == null || vertices == null || indices == null) return
-
- device.SetStreamSource(0, vertices, 0);
- device.Indices = indices;
- device.ColorFill =
- device.VertexFormat = PositionColored.Format;
- device.DrawIndexedPrimitives(
- PrimitiveType.TriangleList, // Type de primitives qu'on dessine
- 0, // Sommet de base
- 0, // Indice de sommet minimum
- 3, // Nombre de sommets utilisés
- 0, // Indice de départ
- 12); // Nombre de primitives
- }
- }
|
Ainsi que la fonction d'affichage de l'exemple
Code :
- public void OnFrameRender(Device device, double appTime, float elapsedTime)
- {
- bool beginSceneCalled = false;
- // Clear the render target and the zbuffer
- device.Clear(ClearFlags.ZBuffer | ClearFlags.Target, 0x002D32AA, 1.0f, 0);
-
- try
- {
- device.BeginScene();
- beginSceneCalled = true;
- device.Transform.View = camera.WorldMatrix * viewMatrix * camera.ProjectionMatrix;
- //truck.Render(device);
- WookBox wookbox = new WookBox(device, 5.0f, 2.0f, 3.0f);
- wookbox.Render(device);
-
- device.Transform.World = Matrix.Translation(0.0f, 0.0f, -5.0f);
- Mesh mybox = Mesh.Box(device, 1f, 3f, 5f);
- mybox.DrawSubset(0);
-
- //foreach (Palette p in palettes) p.Render(device);
-
- // Update the effect's variables. Instead of using strings, it would
- // be more efficient to cache a handle to the parameter by calling
- // Effect.GetParameter
- effect.SetValue("worldViewProjection", camera.WorldMatrix * viewMatrix * camera.ProjectionMatrix);
- effect.SetValue("worldMatrix", camera.WorldMatrix);
- effect.Technique = "RenderScene";
-
-
- // Render the mesh
- int passes = effect.Begin(0);
- Mesh localMesh = mesh.LocalMesh;
- for (int pass = 0; pass < passes; pass++)
- {
- effect.BeginPass(0);
- for(int i = 0; i < mesh.NumberMaterials; i++)
- {
- effect.SetValue("sceneTexture", mesh.GetTexture(i));
- effect.CommitChanges();
- localMesh.DrawSubset(i);
- }
- effect.EndPass();
- }
- effect.End();
-
-
- // Show frame rate
- RenderText();
- // Show UI
- hud.OnRender(elapsedTime);
- sampleUi.OnRender(elapsedTime);
- }
- finally
- {
- if (beginSceneCalled) device.EndScene();
- }
|
voilà, c'est tout ce que je vois pour l'instant.... si vous avez une idée, merci.
|