www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheDirectX-Forum

Luna

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    
 
Jammni

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    
 
JanisTheFrog

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.

Smilie
Zum Seitenanfang    
 
Jammni

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    
 
JanisTheFrog

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    
 
JanisTheFrog

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    
 
Jammni

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