Gepostet: 19.02.2008 09:30 |
Problem mit Tutorial in msdn |
|
Hallo zusammen,
habe ein Problem beim kompilieren des Tutorials 2: Rendering Vertices im msdn. http://msdn2.microsoft.com/en-us/library...259(VS.85).aspx
In der Render() Methode wird vertexBuffer verwendet, was in CreateDevice deklariert wid. Also bekomme ich beim Kompilieren einen Fehler, dass vertexBuffer nicht bekannt ist. Ersetze ich vertexBuffer durch vb klappt es, aber dann bekommen ich bei device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1); eine invalidCallException. Kann mir jemand helfen, was ich ändern muss?
Danke schön schon mal
Mein Code aus Tutorial 1 und 2 zusammengesetzt:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Text; using System.Windows.Forms; using System.Drawing; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D;
namespace Tutorial2 { public partial class Vertices : Form {
public Vertices() { // Set the initial size of our form this.ClientSize = new System.Drawing.Size(400, 300); // And its caption this.Text = "D3D Tutorial 01: CreateDevice"; }
// Global variables for this project Device device = null; // Rendering device VertexBuffer vb = null;
public bool InitializeGraphics() { try { // Now setup our D3D stuff PresentParameters presentParams = new PresentParameters(); presentParams.Windowed = true; presentParams.SwapEffect = SwapEffect.Discard; device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams); return true; } catch (DirectXException) { return false; } }
public void OnCreateDevice(object sender, EventArgs e) { Device dev = (Device)sender;
// Now create the vertex buffer VertexBuffer vertexBuffer = new VertexBuffer( typeof(CustomVertex.TransformedColored), 3, dev, 0, CustomVertex.TransformedColored.Format, Pool.Default); vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer); this.OnCreateVertexBuffer(vb, null); }
public void OnCreateVertexBuffer(object sender, EventArgs e) { VertexBuffer vb = (VertexBuffer)sender; GraphicsStream stm = vb.Lock(0, 0, 0); CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
verts[0].X=150; verts[0].Y=50; verts[0].Z=0.5f; verts[0].Rhw=1; verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
verts[1].X=250; verts[1].Y=250; verts[1].Z=0.5f; verts[1].Rhw=1; verts[1].Color = System.Drawing.Color.Brown.ToArgb();
verts[2].X=50; verts[2].Y=250; verts[2].Z=0.5f; verts[2].Rhw=1; verts[2].Color = System.Drawing.Color.LightPink.ToArgb();
stm.Write(verts);
vb.Unlock(); }
public void Render() { if (device == null) return; // Clear the back buffer to a blue color (ARGB = 000000ff) device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0); // Begin the scene device.BeginScene();
// New for Tutorial 2 device.SetStreamSource(0, vertexBuffer, 0); device.VertexFormat = CustomVertex.TransformedColored.Format; device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
// End the scene device.EndScene(); device.Present(); } } }
|
Zum Seitenanfang |
|
|
|
Gepostet: 22.02.2008 23:06 |
|
|
Hi,
da brauchst du eigentlich nicht viel machen. Einfach die Deklaration von vertexBuffer in der Methode OnCreateDevice entfernen und statt dessen direkt in die Klasse einfügen.
Das sieht dann ungefähr so aus:
public partial class Vertices : Form { VertexBuffer vertexBuffer = null;
public Vertices() { // Set the initial size of our form this.ClientSize = new System.Drawing.Size(400, 300); // And its caption this.Text = "D3D Tutorial 01: CreateDevice"; }
// ....
public void OnCreateDevice(object sender, EventArgs e) { Device dev = (Device)sender;
// Now create the vertex buffer vertexBuffer = new VertexBuffer( typeof(CustomVertex.TransformedColored), 3, dev, 0, CustomVertex.TransformedColored.Format, Pool.Default); vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer); this.OnCreateVertexBuffer(vb, null); }
// und noch den letzten Rest wieder einfügen... }
Grüße, Jammni |
Zum Seitenanfang |
Homepage
ICQ
|
|
|
Gepostet: 19.03.2008 23:48 |
gleiches Problem |
|
Hallo, ich habe genau das gleiche Problem. Korrigier mich bitte, wenn ich dich falsch verstanden habe, aber du meinst doch, dass man den VertexBuffer global in der Klasse deklarieren soll, oder?
Ist ja auch logisch um ihn in einer anderen Methode dieser Klasse zu verwenden. Bei mir hab ich das so gemacht und habe den gleichen Fehler. Ich hab schon mehrere Tutorials abgeklappert und immer das gleiche. Immer kommt diese InvalidCallException beim Aufrufen von device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1); Woran liegt das? Hab vorher nur mit OpenGl gearbeitet und kenne mich mit DirectX nicht aus.
Bitte helft mir.
|
Zum Seitenanfang |
|
|
|
Gepostet: 20.03.2008 12:05 |
|
|
Ja, zumindest war das das Problem bei Luna. Poste doch einfach mal deinen Quelltext, dann kann ich da auch mal einen Blick drauf werfen. Ansonsten stochere ich auch nur im Nebel herum ;-) |
Zum Seitenanfang |
Homepage
ICQ
|
|
|
Gepostet: 22.03.2008 01:57 |
|
|
Hab den Fehler gefunden!
Ich hatte Device.VertexFormat nicht gesetzt. Jetzt kommt die Exception nicht mehr, aber ich nur die blaue Fläche, von meiner Triangel ist nix zu sehen.
Hier ist mein Code:
using Microsoft.DirectX; using Microsoft.DirectX.Direct3D;
namespace DirectX { public partial class Form1 : Form { Device device; VertexBuffer vertexBuffer; GraphicsStream graphicStream; PresentParameters presentParameters; CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { presentParameters = new PresentParameters(); presentParameters.Windowed = true; presentParameters.SwapEffect = SwapEffect.Discard; device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParameters); }
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { vertexBuffer.Dispose(); graphicStream.Dispose(); device.Dispose(); }
private void timer1_Tick(object sender, EventArgs e) { device.Clear(ClearFlags.Target, Color.Blue, 0.0F, 0); device.BeginScene();
for (int i = 0; i < 3; i++) verts = new CustomVertex.TransformedColored(20 * i, 20 + 20 * (i % 2), 0.5F, 1, Color.Green.ToArgb()); vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored), 3, device, Usage.WriteOnly, CustomVertex.TransformedColored.Format, Pool.Default);
graphicStream = vertexBuffer.Lock(0, 0, 0); graphicStream.Write(verts); vertexBuffer.Unlock();
device.SetStreamSource(0, vertexBuffer, 0); device.VertexFormat = CustomVertex.TransformedColored.Format; device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 1);
device.EndScene(); device.Present(); } } } |
Zum Seitenanfang |
|
|
|
Gepostet: 22.03.2008 21:39 |
|
|
ah, bin dahinter gekommen, hehe.
Es ist wichtig die Vektoren in der richtigen Reihenfolge zu zeichnen, da man sonst die Rückseite sieht, die nicht gerendert wird.
Trotzdem vielen danke für Bemühungen etc. Find das Forum super !!! |
Zum Seitenanfang |
|
|
|
Gepostet: 24.03.2008 21:19 |
|
|
Super dass du dein Problem selbst gelöst hast ;-) Hab' auch noch keine Zeit gehabt, über deinen Quelltext zu fliegen ;-) |
Zum Seitenanfang |
Homepage
ICQ
|
|
|