Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi,

ich ´hab mir in der letzten Zeit mal ein paar Direct3D 9 Tutoriols angeschaut,

aber ich verstehe nie wie die Vertexstrukter aufgebaut werden muß

um eine bestimmte Form zu erzielen. Folgende Struktur liefert z.B.

ein Buntes Dreieck:


CUSTOMVERTEX vertices[] =
{
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
};
[/PHP]

Ich dachte erst das jedes Element für einen Punkt des Dreiecks stehen würde, wenn

ich allerdings bestimmte Werte zuweise habe ich aufeinmal 2 Dreicke und wenn

ich ein Element entferne ist es immer noch ein Dreieck:confused:

Ich bin also etwas verwirrt und hoffe das mir das einer von euch erklären kann

Gruß

Guybrush

Geschrieben

Hi Guybrush,

also von D3D hab ich ja nu mal gar keine Ahnung :D

...hab mich aber mal mit OpenGL n bissl beschaeftigt.

Vielleicht erzaehlst auch mal bei welchen Werten dir was passiert ist? :)

....und poste doch bitte auch mal noch etwas mehr Code...denn das was du hier gepostet hast zeichnet allein sicher noch kein Dreieck ;)

Goos

Geschrieben

Also ich hab die Werte nicht mehr im Kopf und ich kanns hier auch leider nicht

ausprobieren weil ich das Direct X 9 SDK hier nicht habe.

Ok hier ist mal der ganze Code::D


#include <windows.h>
#include <d3d9.h>

LRESULT CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM);

HRESULT InitD3D();
HRESULT InitVB();
HRESULT Render();

struct GLOBALS
{
HWND hMainWindow;
IDirect3D9* pD3D;
IDirect3DDevice9* pd3dDevice;
IDirect3DVertexBuffer9* pVB;
}g_={0,0,0,0};

struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // The transformed position for the vertex
DWORD color; // The vertex color
};

APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE,
LPSTR,
int nCmdShow)
{
MSG Msg;
WNDCLASS wc;

memset(&wc,0,sizeof(WNDCLASS));
wc.hCursor = LoadCursor(0,IDC_ARROW);
wc.hInstance = hInstance;
wc.lpfnWndProc = MainProc;
wc.lpszClassName = "D3D Test";

if (!RegisterClass(&wc))
return FALSE;

g_.hMainWindow = CreateWindow("D3D Test","D3D Test",
WS_OVERLAPPEDWINDOW,
300,300,
350,300,
GetDesktopWindow(),0,
hInstance,0);
ShowWindow(g_.hMainWindow,nCmdShow);
UpdateWindow(g_.hMainWindow);

if (InitD3D() != S_OK)
{
MessageBox(g_.hMainWindow,"Fehler","D3D Test",MB_APPLMODAL);
}
InitVB();
while(Msg.message != WM_QUIT)
{
if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else
Render();
}
UnregisterClass("D3D Test",hInstance);
return Msg.wParam;
}

LRESULT CALLBACK MainProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
{
if (g_.pVB != NULL)
g_.pVB->Release();

if (g_.pd3dDevice != NULL)
g_.pd3dDevice->Release();

if (g_.pD3D != NULL)
g_.pD3D->Release();

PostQuitMessage(0);
return 0;
}
default:
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
}

HRESULT InitD3D()
{
D3DPRESENT_PARAMETERS d3dpp;

memset(&d3dpp,0,sizeof(D3DPRESENT_PARAMETERS));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

g_.pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (g_.pD3D == NULL)
{
return E_FAIL;
}

if (g_.pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
g_.hMainWindow,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_.pd3dDevice) != D3D_OK)
{
return E_FAIL;
}
return S_OK;
}

HRESULT InitVB()
{
// Initialize three vertices for rendering a triangle
CUSTOMVERTEX vertices[] =
{
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
};

// Create the vertex buffer. Here we are allocating enough memory
// (from the default pool) to hold all our 3 custom vertices. We also
// specify the FVF, so the vertex buffer knows what data it contains.
if( FAILED( g_.pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0, D3DFVF_XYZRHW|D3DFVF_DIFFUSE,
D3DPOOL_DEFAULT, &g_.pVB, NULL ) ) )
{
return E_FAIL;
}

// Now we fill the vertex buffer. To do this, we need to Lock() the VB to
// gain access to the vertices. This mechanism is required becuase vertex
// buffers may be in device memory.
VOID* pVertices;
if( FAILED( g_.pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices) );
g_.pVB->Unlock();

return S_OK;
}

HRESULT Render()
{
g_.pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);

if( SUCCEEDED( g_.pd3dDevice->BeginScene() ) )
{
g_.pd3dDevice->SetStreamSource( 0, g_.pVB, 0, sizeof(CUSTOMVERTEX) );
g_.pd3dDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE);
g_.pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

g_.pd3dDevice->EndScene();
}

g_.pd3dDevice->Present(NULL,NULL,NULL,NULL );
return S_OK;
}
[/PHP]

Geschrieben

Also fuer die Sache mit Wert löschen und trotzdem Dreieck haette ich wahrscheinlich ne Erklärung, kanns aber hier gerade auch nicht testen.......aber könntest du das heute Abend nochmal ausprobieren, bei welchen Werten du zwei Dreiecke bekommst? (ich bin schon sehr gespannt darauf :D )

Goos

Geschrieben

Schonmal kein schlechter Einfall, denn wer weis, was im dritten Element deines vertices Arrays steht, welches es ansich gar nicht gibt :D

Ach und wenn du das testest und auf deine zwei Dreiecke irgendwie kommst, dann versuch doch bitte auch noch ein D3DPT_TRIANGLESTRIP anstelle vom D3DPT_TRIANGLELIST.

...und nu schau zu, dass`d heim kommst...ich bin neugierig *g*

Goos

Geschrieben

So ich hab gestern noch mal rumprobiert und wenn ich die Struktur so ändere:

CUSTOMVERTEX vertices[] =

{

{ 250.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color

{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },

{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },

};

habe ich 2 Dreiecke.

Wenn ich 1 Element entferne und dann auch 2*sizeof() schreibe, wird nichts

dargestellt (was glaube ich auch verständlich ist), aber wenn ich noch ein

Element hinzufüge und 4*sizeof() schreibe, bekomme ich trotzdem das

selbe Dreieck:confused:

Geschrieben

Moin :)

wie du deine zwei Dreiecke machst is mir noch nicht so recht klar, aber mal sehn.

Original geschrieben von Guybrush Threepwood

Wenn ich 1 Element entferne und dann auch 2*sizeof() schreibe, wird nichts

dargestellt (was glaube ich auch verständlich ist), aber wenn ich noch ein

Element hinzufüge und 4*sizeof() schreibe, bekomme ich trotzdem das

selbe Dreieck:confused:

......also...das ganze is so ->

D3DPT_TRIANGLELIST

Renders the specified vertices as a sequence of isolated triangles. Each group of three vertices defines a separate triangle.

was soviel heisst, wie es ist vollkommen egal, was du in deinem vertices Array drine hast seiens nun 1,2,3,4,5 oder was weiss ich wieviele Punkte.

Es kommt einfach darauf an, wie gross du deinen Vertex Buffer anlegst, was du ja auch mit 2*sizeof() usw. schon unterschiedlich machst. (ok, es ist unguenstig, wenn du mehr Elemente in den Buffer schieben willst, als dein Array enthaelt ;) )

Wenn du nun D3DPT_TRIANGLELIST zeichnest und hast weniger als 3 Vertices im Buffer, dann geht nix, denn zwei Punkte ergeben kein Dreieck. Hast du aber 4 Vertices im Buffer, dann gibt das auch nur das erste Dreieck. Zwei Dreiecke werdens dann logischerweise ab 6 Vertices im Buffer.

Ich hoffe, dass ich mich irgendwie verstaendlich ausgedrueckt hab.

Goos

Geschrieben

Die Idee hatte ich auch schon. Ich hab 6 Elemente in das Array gschrieben und

die entsprechende Größe angegeben, trotzdem hatte ich nur ein Dreieck.

Da mein Dreieck aber auch nicht so ganz einwnadfrei dargestellt wird, probiere

ich es am besten erst nochmal in dem Original Tutorial aus.

Ich schreib dann am Freitag (Mittwoch+Donnerstag=Schule:( )wie`s gelaufen ist.

Geschrieben

Ich hab das gerade mal fix unter OpenGL nachgestellt und da funktioniert das mit nur einem Dreieck und bei 6 vertices dann mit 2 usw. (vielleicht muss man aber auch dazu sagen, dass es nicht ganz gleich geschieht wie in dem Beispiel hier)

Ich muss mir das DX SDK wohl doch mal holen.

...ach und dann zum Testen...du verwendest das Beispiel komplett so wie du es hier gepostet hast, also nix anderes dazu, drumrum oder was weiss ich wie?

Goos

Geschrieben

Hab´s gestern geschafft 4 Dreiecke zu erzeugen, die zusammen ein Viereck bilden

und Farblich ineinanderlaufen.

*ganz stolz sei*

Ich mußte "nur" diese beiden Zeilen löschen:


d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
[/PHP]

und in der Funktion DrawPrimitiv() auch angeben das es mehr wie eine

Struktur ist

:D

Heute Abend versuche ich jetzt die zu rotieren:rolleyes:

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...