www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheDirectX-Forum

  1 2 nächste Seite

DerHulk

Gepostet:
30.03.2006 16:08

Partikeleffekte  
Hi,leutz bin gerade dran mich Partikel zu beschäftigen und habe mir da was gebastelt:

Das ist der erste Teil(initialiesierung):

struct D3DVERTEX
{
public Vector3 Position;
public Vector3 Normal;
public float fSize;
public uint dwColor;
public static VertexFormats FVF = VertexFormats.Position | VertexFormats.Normal |VertexFormats.PointSize |VertexFormats.Diffuse;

}

vb = new VertexBuffer(typeof(D3DVERTEX), 3, mydevices, Usage.None, D3DVERTEX.FVF, Pool.Managed);

float fPointSize = 1.0f,fPointScaleB = 1.0f;

mydevices.SetRenderState(RenderStates.PointSpriteEnable,true);
mydevices.SetRenderState(RenderStates.PointSize,fPointSize);
mydevices.SetRenderState(RenderStates.AlphaBlendEnable,true);

//Array erstellen das an den Buffer gekoppelt ist
D3DVERTEX[] vbData = (D3DVERTEX[]) vb.Lock(0, typeof(D3DVERTEX), LockFlags.None, 3);

//Daten ins Array schreiben
vbData[0].Position = new Vector3(1,1,0);
vbData[0].Normal = new Vector3(2,2,0);
vbData[0].fSize = 0.1f;
vbData[0].dwColor = 0xffffffff;
vbData[1].Position = new Vector3(1,1,0);
vbData[1].Normal = new Vector3(2,2,0);
vbData[1].fSize = 0.11f;
vbData[1].dwColor = 0xffeeeeff;
vbData[2].Position = new Vector3(1,1,0);
vbData[2].Normal = new Vector3(2,2,0);
vbData[2].fSize = 0.12f;
vbData[2].dwColor = 0xffddddff;


jetzt der teil wo ich das zeichnen will:


vb.Unlock();
mydevices.BeginScene();

mydevices.SetStreamSource(0,vb,0,2);
mydevices.VertexFormat = CustomVertex.PositionColored.Format;
mydevices.DrawPrimitives(PrimitiveType.PointList,0,2);

mydevices.EndScene();
mydevices.Present();


ich bekomme immer die Fehlermeldung:

"Der Vorgang ist aufgrund des aktuellen Status des Objekts nicht gültig."

hat evtl. jemand ne ahnung was ich da falsch mache?

mfg und thx derHulk!
Zum Seitenanfang    
 
DerHulk

Gepostet:
30.03.2006 16:26

   
Ok, das problem währe gelöst:
Hatte das vb.Unlock in na Schleife


Jetzt läuft das Programm zwar wieder,
jedoch wird mir nix angezeigt auf dem screen Smilie, warum???
Zum Seitenanfang    
 
Jacke

Gepostet:
31.03.2006 08:58

   
wer soll den nur so schnell antworten ;-) aber gut gemacht

gruß jacke
Zum Seitenanfang    
 
DerHulk

Gepostet:
31.03.2006 09:04

   
Hi, sitze immer noch da vor und komme nicht weiter....,Smilie

habe halt vor Point Sprites zu zeichnen, und habe mich an folgende seite gehalten...
http://www.riaz.de/tutorials/d3d17/d3d17.html, jedoch funzt das immer noch nicht habe schon alles mögliche mit den
VertexFormaten,Buffer ausprobiert und auch mit der Strucktur aber ich bekomm keine einzige Textur angezeigt??

einer von euch einen Hinweis oder ne Implementation von so welchen Point Sprites in C#???


mfg derHulk
Zum Seitenanfang    
 
Jammni

Gepostet:
31.03.2006 10:52

   
Hmm, wirklich Ahnung habe ich leider nicht davon, aber ich kann dir ja mal sagen, was ich evtl. anders gemacht hätte:

Zuerst hätte ich statt D3DVERTEX den Typ CustomVertex.PositionNormalColored genommen, da dieser eigentlich all das enthält, was du ja auch brauchst. Das das Zeichnen dann fehlschlägt, liegt wahrscheinlich daran, dass du das VertextFormat auf mydevices.VertexFormat = CustomVertex.PositionColored.Format; gesetzt hast. In deinem Fall würde aber am ehsten (und praktisch immernoch falsch) CustomVertex.PositionNormalColored zutreffen.
Ich würde dir also erstmal empfehlen, auf diesen Typ umzusteigen. Leider hab ich auch keine Ahnung, für was der Parameter fSize noch bei deinem struct zuständig ist - somit ist also die Umstellung auf das andere Format vielleicht sehr heikel.

Und bei DrawPrimitives solltest du die Anzahl auf drei stellen, schließlich hast du auch drei Punkte definiert ;-)

Und falls du dein flexible vertex format weiter benutzt, solltest du auch bei mydevices.SetStreamSource(0,vb,0,2); die zwei durch sizeof(VertexFormats) oder ähnliches ersetzen (wer weiß, ob es wirklich zwei Byte sind).

Ich hoffe, das hilft dir irgendwie ein bisschen weiter.

MfG,
Jammni
Zum Seitenanfang Homepage   ICQ    
 
DerHulk

Gepostet:
31.03.2006 18:57

   
Also habe mal alles geändert was du gesagt hast, leider ohne erfolg ich bekomm nix gezeichnet!
Wie würde ich denn einfach ein paar bunte Pixel mittel Vb auf den Bildschirm zeichnen??
Das funktioniert nur wenn ich CustomVertex.TransformedColored nehme sonst zeichnet der mir keinen Pixel!

Wie muss ich eigendlich die Strucktur CustomVertex.PositionNormalColored verstehen (also wo für steht das normal)


mfg derHulk!
Zum Seitenanfang    
 
DerHulk

Gepostet:
01.04.2006 00:28

   
So evtl. kann einer damit was anfangen(habe mich am DX Tutorial von Jammni vergriffen/abgeändert) also:
- erstens bekomm ich nur Pixel gezeichnet wenn ich Transformed für die FVF nehme alles andre zeig mir nix an.Smilie
-zweitens Points werden mit der Textur bemalt.Smilie
-drittens die in der Structur beinhalteten Werte Size und Color nehmen keinen einfluss auf das gezeichnete Bild
(größe der Pixel läst sich nur über PointSizeMin regullieren)SmilieSmilie
-also besonders Drittens stört mich nur leider weis ich auch nicht wie ich das ändern kann???
- http://www.zfx.info/DisplayThread.php?MID=140220 hier funktioniert es antscheinend auch einer andren Strucktur!?



using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;


public class VertexBufferForm : Form
{
// Globale Variablen
Device device = null; // Das Rendering-Device
VertexBuffer vertexBuffer = null;
Texture mytexture = null;
private int IntegerZahl =0; //dieser wert ist zum rausfiltern der farbe schwarz!
private uint HexZahl = 0xffffffff;//0xFF000000;

public VertexBufferForm()
{
// Anfangsgröße des Fensters setzen
this.ClientSize = new System.Drawing.Size(300,300);
// Titel des Fensters setzen
this.Text = "DirectX Tutorial - VertexBuffer";
}

public bool InitializeGraphics()
{
try
{
IntegerZahl = (int) HexZahl;
// Die Hardware initialisieren und ein paar Parameter setzen
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed=true;
presentParams.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);

mytexture = TextureLoader.FromFile(device, Application.StartupPath + "\\Particle.bmp",0,0,0,Usage.None,Format.A16B16G16R16,Pool.Default,Filter.Point,Filter.None,IntegerZahl);
CustomVertex.TransformedColored.Format, Pool.Default);
CustomVertex.PositionColored.Format, Pool.Default);
vertexBuffer = new VertexBuffer(typeof(Partikel), 6, device, 0, Partikel.FVF, Pool.Default);
vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer, null);
//uhrzustand
return true;
}
catch (DirectXException)
{
return false;
}
}

public void OnCreateVertexBuffer(object sender, EventArgs e)
{
VertexBuffer vertexBuffer = (VertexBuffer)sender;
GraphicsStream stm = vertexBuffer.Lock(0,0,0);
Partikel[] verts = new Partikel[6];
///+++++++++++++++++FVF aus einer eigenen Strucktur
int test = Color.Green.ToArgb();
verts[0].Position = new Vector3(10,10,0.5f);
verts[0].Size = 0.1f;
verts[0].Color = Color.White.ToArgb();//0xf60000;
verts[1].Position = new Vector3(200,200,0.5f);
verts[1].Color = Color.Red.ToArgb();
verts[1].Size = 0.9f;
verts[2].Position = new Vector3(100,100,500f);

stm.Write(verts);
vertexBuffer.Unlock();
}

private void Render()
{
if (device == null)
return;

// Backbuffer löschen und gleichzeitig die Zeichenfläche blau einfärben
device.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0f, 0);
// Anfang der Szene
device.RenderState.PointSpriteEnable = true;

device.BeginScene();
device.RenderState.AlphaBlendEnable = true;
device.VertexFormat = Partikel.FVF;
device.RenderState.PointSpriteEnable = true;
device.RenderState.PointScaleEnable = false ;
device.RenderState.PointSizeMin = 30.0f;
device.RenderState.PointScaleA = 0.00f;
device.RenderState.PointScaleB = 0.00f;
device.RenderState.PointScaleC = 1.00f;
device.RenderState.DestinationBlend=Blend.One;
device.RenderState.SourceBlend= Blend.One;
device.SetStreamSource(0,vertexBuffer,0);
device.SetTexture(0,mytexture);

device.DrawPrimitives(PrimitiveType.PointList, 0, 3);

// Ende der Szene
device.EndScene();
device.Present();
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
this.Render(); // Rendern
}
protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
this.Close(); // Esc wurde gedrückt
}
protected void DisposeGraphics()
{
}

// Einstiegspunkt des Programms
static void Main()
{

using (VertexBufferForm frm = new VertexBufferForm())
{
if (!frm.InitializeGraphics()) // Direct3D initialisieren
{
MessageBox.Show("Konnte Hardware nicht initialisieren.");
return;
}
frm.Show();

// Solange das Fenster noch gültig ist, die Szene rendern und Eingaben verarbeiten
while(frm.Created)
{
frm.Render();
Application.DoEvents();
}
frm.DisposeGraphics();
}
}

private void InitializeComponent()
{
//
// VertexBufferForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Name = "VertexBufferForm";
this.Load += new System.EventHandler(this.VertexBufferForm_Load);

}

private void VertexBufferForm_Load(object sender, System.EventArgs e)
{

}
}
public struct Partikel
{
public Vector3 Position;
public Int32 Color;
public float Size;
public static readonly VertexFormats FVF = VertexFormats.Transformed | VertexFormats.PointSize; //|VertexFormats.None;


evtl. fällt ja einem von euch da was ein??

mfg der hulk
Zum Seitenanfang    
 
DerHulk

Gepostet:
01.04.2006 20:25

   
Hi,Leutz habs naja "geschaft", also die angesprochenden Probleme 2 und 3 konnte ich zwar nicht 100%
lösen aber hier mal meine Lösungsvorschläge:

Also es kommt drauf an wie man halt die Structur aufbaut (Reihenfolge der Variablen!!)

habe jetzt zwei Structuren definiert mit dennen man was erreichen kann:

Hier wird Transformed genutzt die Positions Koordinaten sind gleich der Bildschirmpunkte.
Jedoch kann ich hier der Textur keine Deffuse(Farbwerte)zuteilen??Wenn ich VertexFormats.Diffuse
weg lasse im Format dann wird alles in Orginalfarbe gezeichnet wenn ichs drinn lass wirds rot gezeichnet???
Evtl. kann einer von euch das erklären?!


public struct Partikel
{
public float X,Y,Z;
public Int32 Color;
public float Size;
public static readonly VertexFormats Format = VertexFormats.Transformed| VertexFormats.Diffuse| VertexFormats.PointSize;
}


Ja und die zweite strucktur ist:
Hier wird Position genutzt, die Positions Koordinaten sind gleich der WorldView Koordinaten??!!(bin ich mir nicht sicher)
Hiermit kann man alles nutzen also Size/Position/und auch die Farbwerte!


public struct Partikel
{
public float X,Y,Z;
public float Size;
public Int32 Color;
public static readonly VertexFormats Format = VertexFormats.Position | VertexFormats.PointSize| VertexFormats.Diffuse;
}


Mich nerft das das bei der Transform structur nicht funktioniert!Smilie

mfg DerHulk!
Zum Seitenanfang    
 
Jacke

Gepostet:
02.04.2006 21:48

   
auf dieser seite gibts nen relativ langes beispiel zu texturen:
http://www.miszalok.de/C_3DCis/C3_Cylinder_with_Texture/C3DCisC3_d.pdf

da werden auch farbwerte gesetz...aber ich an ner einfache zuweisung wie variable =System.Drawing.Color.White;
haperts nich oder? also rot könnte der standardwert sein...:-/ sorry ich red wahrscheinlich am prob vorbei...
Zum Seitenanfang    
 
Jammni

Gepostet:
02.04.2006 21:59

   
Also bei bereits transformierten Koordinaten wird Direct3D-Lighting nicht mehr angewandt. Das heißt also, dass du die bereits beleuchtete Farbe selbst mitliefern musst. Laut SDK wird ein VertexFormat a la VertexFormats.Transformed | VertexFormats.Diffuse nicht ausgeschlossen, benutzen kann man es "theoretisch" jedenfalls nicht sinnvoll. Was aber in einem solchen Fall passiert, kann ich dir auch nicht sagen. Falls du also die Beleuchtung doch noch haben willst, musst du VertexFormats.Position (weiterhin) benutzen.
Zum Seitenanfang Homepage   ICQ    
 

  1 2 nächste Seite