Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Vertex Grafiken

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor

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]

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

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

  • Autor

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:

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

  • Autor

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.

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

  • Autor

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:

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.