|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 01.12.2007, 11:34 Titel: ID3DXMesh manuell erstellen |
|
|
Hallo !
Hier in diesem Forum gibt es doch so viele Freaks, da weiß doch bestimmt jemand wie ich mit D3DX ein mesh erstellen kann, ohne es zuvor von einer Datei mithilfe von D3DXLoadMeshFromX() zu laden. Mein Wunsch wäre ein Mesh aus einem vertexarray zu erstellen mit dem Vertexformat :
"D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE"
Das vertexarray wird vorher mit errechneten Vertexdaten gefüttert, die je nach argumente jedesmal unterschiedlich ausfallen, daher kann ich das mesh nicht von einer Datei laden.
Leider ward ich aus der msdn Hilfe auch nicht wirklich schlau. Da gibt es soviele D3DXCreateMesh...() Merhoden, dass ich keinen Plan mehr hab was da für mich das richtige ist, außerdem kann ich mit den Argumenten nie so richtig was anfangen. Zumindest weiß ich da nie wie man die Methode mit Verticies füttert.
Kann mir da jemand helfen ? |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 01.12.2007, 16:41 Titel: Re: ID3DXMesh manuell erstellen |
|
|
Otscho hat Folgendes geschrieben: | Hallo !
Hier in diesem Forum gibt es doch so viele Freaks |
Also das nehme ich dir jetzt übel
Ich weiß nicht so genau, was jetzt dein Problem ist. Wenn du das FVF für das Mesh schon gegeben hast, scheint mir D3DXCreateMeshFVF() am angebrachtesten.
Was die Argumente bedeuten steht ziemlich genau in der DirectX-Dokumentation. Ansonsten reicht es meistens, wenn du in google einfach nach der Funktion suchst, da gibts oft Treffer mit konkreten Problemen dazu und/oder Codeausschnitten.[/quote] _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 01.12.2007, 16:48 Titel: |
|
|
Danke für denTipp. Werd mir mal die D3DXCreateMeshFVF() genauer anschauen.
PS.
Sorry falls ich dich beleidigt hab, das mit den Freaks war eigentlich im positivem Sinn gemeint |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.12.2007, 17:19 Titel: |
|
|
Otscho hat Folgendes geschrieben: |
PS.
Sorry falls ich dich beleidigt hab, das mit den Freaks war eigentlich im positivem Sinn gemeint |
TLOP meinte das sicher auch nicht ernst
TLOP hat Folgendes geschrieben: | Ansonsten reicht es meistens, wenn du in google einfach nach der Funktion suchst, da gibts oft Treffer mit konkreten Problemen dazu und/oder Codeausschnitten | Was in dem Sinne auf jeden Fall auch hilfreich hierzu ist:Google Codesearch Da findet man mit der geg. Syntax zum Beispiel sowas
Gruß DXer |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 02.12.2007, 17:05 Titel: |
|
|
Auch wenn ein wahrer/ernster Kern dahinter steckt. Ich finde den Begriff "Freak" ziemlich schlecht besetzt, aber is ja nun auch egal
DirectXer hat Folgendes geschrieben: | Was in dem Sinne auf jeden Fall auch hilfreich hierzu ist:Google Codesearch Da findet man mit der geg. Syntax zum Beispiel sowas |
Cool, danke, das kannte ich noch gar nicht _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 02.12.2007, 17:24 Titel: |
|
|
Ich kenn halt die zwei Bedeutungen:
1. Dass einer nur daheim im Keller vorm PC hockt nie die Sonne gesehen hat und darum ne Brille mit der Stärke 10+ trägt, weshalb er auch keine Freunde hat.
das meinte ich aber nicht sondern:
2. Jemand der wenn er sich wo hinhockt alles auf anhieb zur Perfektion beherscht, und keine Freunde hat, weil jeder der ihn sieht sprachlos vor Begeisterung wegrennt, um es seinen Kumpels zu erzählen.
Oh irgendwie ist dann jeder Typus sehr allein das ist mir vorher nie so richtig klar geworden...
PS. Dieser Beitrag ist bewusst maßlos übertrieben gehalten und hat mit der Wirklichkeit wohl sehr wenig zu tun. Daher möchte ich mich bei allen, die ihn möglicherweiße anstößig finden, entschuldigen. |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 03.12.2007, 15:00 Titel: |
|
|
Zurück zum Thema:
Ich hab das jetzt mal versucht wie auf den Seiten beschrieben.
Als verticies hab ich mal einfach die Eckpunkte von dem Light-Beispiel vom Buch genommen:
CPP: | BOOL CDefaultSphere::CreateSphere(float size) {
FVF_FORMAT = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1;
DWORD m_Color = 0xFFFF0000;
int FaceCount = 1;
int VertexCount = 3 * FaceCount;
// Generating the vertices
VertexTex lpVertices[] = {
{ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFFFF0000, -1.0f, -1.0f },
{ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFF00FF00, 0.0f, 1.0f },
{ 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFF0000FF, 1.0f, -1.0f }
};
// Create the Mesh
D3DXCreateMeshFVF(FaceCount, VertexCount, D3DXMESH_MANAGED, FVF_FORMAT, m_lpD3DDevice , &m_lpMesh);
// Fill the Mesh
BYTE* VertexBufferStart;
m_lpMesh->LockVertexBuffer(0, reinterpret_cast<void**>(&VertexBufferStart));
memcpy(VertexBufferStart, lpVertices, VertexCount * sizeof(VertexTex));
m_lpMesh->UnlockVertexBuffer();
return true;
} |
Nur leider sehe ich dann beim rendern nix:
CPP: | void CDefaultSphere::Render() {
m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
m_lpD3DDevice->SetFVF(FVF_FORMAT);
m_lpD3DDevice->SetTransform(D3DTS_WORLD, &WorldMatrix);
m_lpMesh->DrawSubset(0);
} |
Es kommt auch zu keiner Fehlermeldung oder Absturz.
Das Dreieck ist einfach nicht zu sehen.
Bestimmt hab ich da nur irgendwo einen ganz dummen Fehler gemacht.
Kann mir vieleicht jemand sagen wo ? |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.12.2007, 15:21 Titel: |
|
|
falsche richtung geclipp? CPP: | device->SetRenderState( D3DRS_CULLING, D3DCULL_NONE ); | oder schau mal ob wireframe klappt CPP: | device->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME ); | ansonsten schau mal beim Vertex Buffer, kanns sein dass du den noch irgendwie setzen musst? Oder macht das DrawSubset? Vielleicht brauchst du ein Material?
Das sind so die ersten Anläufe an denen sowas meistens hängt.
Gruß DXer |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 03.12.2007, 15:28 Titel: |
|
|
hm..
Die SetRenderState(...), die du beschrieben hast, bringen leider auch nix. Und dass man unbedingt ein Material braucht kann ich mir net so richtig vorstellen. Da bei dem Light-Beispiel auch kein Material angegeben wurde trotzdem des D3DFVF_TEX1 im FVF steht.
Hm.. irgendwie hab ich das Gefühl, dass ich beim Füllen des Meshes noch was wichtiges vergessen hab. Kann es sein dass man hier auch noch IndexBuffer übergeben muss ?
So wie ich den VertexBuffer ins Mesh reinkopiert hab ?
Ahh die CPP: | D3DXCleanMesh(D3DXCLEAN_SIMPLIFICATION, m_lpMesh, pAdjacency1, &pMeshTemp, pAdjacency2, &pBuffer); | hat mir soeben gesagt, dass das Mesh ungültig sei. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 03.12.2007, 16:35 Titel: |
|
|
Otscho hat Folgendes geschrieben: | Kann es sein dass man hier auch noch IndexBuffer übergeben muss ?
So wie ich den VertexBuffer ins Mesh reinkopiert hab ? |
Das hängt davon ab, wie genau du renderst.
Wenn du beispielsweise DrawIndexedPrimitive anstatt DrawPrimitive verwenden würdest, wäre ein zusätzlicher Indexbuffer tatsächlich nicht verkehrt. Wenn du den gar nicht verwendest, kann ich mir nicht vorstellen, dass das irgendeinen Einfluss hat.
Ach ich sehe gerade, du zeichnest ja das Mesh per DrawSubset()
Ich weiß nicht, wie die Funktion im inneren aussieht, aber da du hier glaube ich keine Möglichkeit hast, irgendwas mit dem Indexbuffer anzugeben, könnte ich mir vorstellen, dass ein D3DXMesh standardmäßig einen Indexbuffer beinhält.
Ansonsten würde ich ein paar mehr Fehlerkontrollen einbauen. Damit kannst du oft sehr schnell potentielle Fehlerquellen ausschließen. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 03.12.2007, 16:54 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Ach ich sehe gerade, du zeichnest ja das Mesh per DrawSubset()
Ich weiß nicht, wie die Funktion im inneren aussieht, aber da du hier glaube ich keine Möglichkeit hast, irgendwas mit dem Indexbuffer anzugeben, könnte ich mir vorstellen, dass ein D3DXMesh standardmäßig einen Indexbuffer beinhält. |
Naja es gäb schon die Möglichkeit etwas in den Indexbuffer zu kopieren:
ID3DXBaseMesh::LockIndexBuffer
Nur hab ich leider keine rechte Ahnung wie ein Indexbuffer aufgebaut ist und was man da rein schreiben muss
Was mir ebenfalls schleierhaft ist, ist wie die Vertex structur aussehen muss damit das mesh was damit anfangen kann. Ich hab mal einfach die Struktur vom Christian genommen:
CPP: | typedef struct _VertexTex{
FLOAT x, y, z; // die untransformierte Position des Vertex
FLOAT nx, ny, nz; // die Normale
DWORD color; // die Farbe des Vertex
FLOAT tu, tv; // Texturkoordinaten
} VertexTex; |
Ist die eventuell für das mesh ungeeignet ? |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 04.12.2007, 13:07 Titel: |
|
|
Das meinte ich ja.
Es gibt eben beim Zeichnen soweit ich weiß keine Option ohne Indexbuffer, weswegen wohl eine Angabe/Befüllung des Indexbuffers Plficht ist.
Was drinsteht, müsstest du eigentlich auch im JLI-Buch finden. Da steht übrigens auch zu den D3DXMeshes, dass sie idR. einen Indexbuffer haben
Der Indexbuffer enthält schlichtweg die Indizes der Vertices.
Für deinen Fall mit dem Dreieck dürfte 0,1,2 genügen (ich weiß im Moment nicht sicher, ob die Indizierung mit 0 anfängt wie wohl üblich). _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 04.12.2007, 13:26 Titel: |
|
|
jop ich hab den Index buffer mal "gefüllt"
CPP: | m_lpMesh->LockIndexBuffer(0, reinterpret_cast<void**>(&IndexBufferStart));
memcpy(IndexBufferStart, IndexBuffer, VertexCount * sizeof(DWORD));
m_lpMesh->UnlockIndexBuffer(); |
mit: CPP: | DWORD IndexBuffer[] = {0,1,2}; |
ich hoffe das ist so richtig. Man sieht immer no nix
Der Christian wird mich jetzt hoffentlich net den Kopfrunter reißen, wenn ich jetzt sage dass ich das Buch verliehern hab |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 04.12.2007, 13:59 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Ansonsten würde ich ein paar mehr Fehlerkontrollen einbauen. Damit kannst du oft sehr schnell potentielle Fehlerquellen ausschließen. |
Hast du das schon gemacht? Sieht nämlich nicht so aus
Sehr viele der Funktionen haben einen Rückgabewert, der Aufschluss geben kann über Erfolg oder nicht Erfolg und ggf. welcher Art der Misserfolg ist.
<edit>
An der Kameraposition/-ausrichtung liegts hoffentlich nicht.
</edit> _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 04.12.2007, 14:58 Titel: |
|
|
Moment...
ich hab die Fehler kontrolle bisher noch unter verschluss gehalten natürlich gibt es die bei mir auch: CPP: | BOOL CDefaultSphere::CreateSphere(float size) {
HRESULT hr;
FVF_FORMAT = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1;
DWORD m_Color = 0xFFFF0000;
int FaceCount = 1;
int VertexCount = 3 * FaceCount;
VertexTex lpVertices[] = {
{ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFFFF0000, -1.0f, -1.0f },
{ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFF00FF00, 0.0f, 1.0f },
{ 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0xFF0000FF, 1.0f, -1.0f }
};
DWORD IndexBuffer[] = {0,1,2};
// Create the Mesh
hr = D3DXCreateMeshFVF(FaceCount, VertexCount, D3DXMESH_MANAGED, FVF_FORMAT, m_lpD3DDevice , &m_lpMesh);
if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::D3DXCreateMeshFVF", hr, 0 );
// Fill the Mesh
BYTE* VertexBufferStart;
hr = m_lpMesh->LockVertexBuffer(0, reinterpret_cast<void**>(&VertexBufferStart));
if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::LockVertexBuffer", hr, 0 );
memcpy(VertexBufferStart, lpVertices, VertexCount * sizeof(VertexTex));
hr = m_lpMesh->UnlockVertexBuffer();
if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::UnlockVertexBuffer", hr, 0 );
BYTE* IndexBufferStart;
hr = m_lpMesh->LockIndexBuffer(0, reinterpret_cast<void**>(&IndexBufferStart));
if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::LockIndexBuffer", hr, 0 );
memcpy(IndexBufferStart, IndexBuffer, VertexCount * sizeof(DWORD));
hr = m_lpMesh->UnlockIndexBuffer();
if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::UnlockIndexBuffer", hr, 0 );
//// Creating a progressive mesh
LPD3DXBUFFER pBuffer = NULL;
LPD3DXMESH pMeshTemp = NULL;
int nNumFaces = m_lpMesh->GetNumFaces();
// Adjazenz Informationen generieren
DWORD *pAdjacency1 = new DWORD[nNumFaces * 3];
DWORD *pAdjacency2 = new DWORD[nNumFaces * 3];
hr = m_lpMesh->GenerateAdjacency(0.0f, pAdjacency1);
if(hr != D3D_OK) m_lpLogBook->Error(L"ID3DXMesh::GenerateAdjacency", hr, 0 );
hr = D3DXCleanMesh(D3DXCLEAN_SIMPLIFICATION, m_lpMesh, pAdjacency1, &pMeshTemp, pAdjacency2, &pBuffer);
if(hr != D3D_OK) m_lpLogBook->Error(L"D3DXCleanMesh", hr, 0 );
hr = D3DXValidMesh(pMeshTemp, pAdjacency2, &pBuffer);
if(hr != D3D_OK) m_lpLogBook->Error(L"D3DXValidMesh", hr, 0 );
// m_lpMesh->Release();
// m_lpMesh = pMeshTemp;
return true;
} |
An der Kameraausrichtung sollte es nicht liegen, da alles andere dargestellt wird und ich wie blöd in jede Richtung Ausschau halte nach einem verlassenen Dreieck
Ausserdem sagt man mir ja auch immer dass das Mesh ungültig sei:
logbook hat Folgendes geschrieben: | Failed D3DXCleanMesh D3DXERR_INVALIDMESH - Invalid mesh
Failed D3DXValidMesh D3DERR_INVALIDCALL - Invalid call |
Kann es sein, dass ich noch was in die AttributeBuffer schreiben muss. Der lässt sich nämlich auch locken. Blos was soll ein AttributeBuffer sein... ?
Mann !! Es kann doch nicht so schwer sein ein mesh zu erstellen.
Bin ich wirklich so blöd ? |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|