DX9 - Farbverlauf (Texture/Vertices) erstellen und anzeigen
-
Hallo!
Ich bin gerade dabei mit VC2005, C++ und DX9 zu erlernen bzw am experimentieren... Ich muß aber vorab sagen, dass ich meinen Schwerpunkt im Sizecoding setzen will, also 1k und 4k Intros für Win32 Plattform!Ein Screen mit DX9 initialisierung und 2D Text mittels D3DXCreateFont und D3D->DrawText funktioniert schonmal soweit...
Nun möchte ich aber gerne als Hintergrund einen feststehenden fullscreen gradient farbeffekt darstellen, welche zur laufzeit (am besten realtime) berechnet wird und dagestellt wird...
Vom Theoretischen würd ich sagen, dass dieses auf zwei Wege realisert werden könnte.. einmal per Vertices, wo man jedem Eckpunkt eine eigene Farbe zuweist und somit einen automatisch erstellen Gradient bzw Farbverlauf hat...
Die zweite möglichkeit wäre aber wohl auch, den Farbverlauf selber zu berechnen und direkt auf bzw in eine 512x512 Texture zu packen und diese dann darzustellen...
Leider hab ich vom praktischen Teil in diesem Bereich noch keine Erfahrung und weiß weder, wie ich das ganze per Vertices oder per Texture lösen kann... Mich würden als Anfänger gerne mal beide Wege (code) interessieren... per Google bin ich leider noch nicht wirklich fündig geworden

Hier mal ein ein CodeSchnippsel von meinem aktuellen source/projekt: (keine ahung ob das was ich mache und wie ich es mache, so richtig ist, sorry)
LPDIRECT3DTEXTURE9 g_pTexture; //Just a test for creating a simple Xor Textures g_pD3DDevice->CreateTexture( 512, 512, 0, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_pTexture, NULL ); D3DLOCKED_RECT lr; g_pTexture->LockRect(0, &lr, 0, 0); D3DCOLOR* pixel = (D3DCOLOR*)lr.pBits; int texcount = 512*512; while (texcount--) { for(int x = 0; x < 128; x++) { for(int y = 0; y < 128; y++) { int c = x ^ y; // *pixel++ = D3DCOLOR_XRGB(c,c,255,c); } } } g_pTexture->UnlockRect(0); do { g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,128,255), 1.0f, 0 ); g_pD3DDevice->BeginScene(); g_pD3DDevice->SetTexture( 0, g_pTexture ); // End the scene g_pD3DDevice->EndScene(); g_pD3DDevice->Present( NULL, NULL, NULL, NULL ); } while ( !GetAsyncKeyState(VK_ESCAPE) );Wenn die Zeile " *pixel++ = D3DCOLOR_XRGB(c,c,255,c); "aktiv ist, schmiert mir beim ausführen des erstellten executeables jedesmal komplett mein XP ab und ich darf den Rechner neustarten, obwohl kein Compilerfehler angezeigt wird (sehr nervig!)... Bin noch dabei zu verstehen, wie man texturen erstellt und dann entsprechend auch anzeigt ^^
Hier ist mal ein psydocode, der den von mir gewünschten Farbverlauf (siehe Screenshot) erstellt...
for (int x=0; x<512; x++) { for (int y=0; y<512; y++) { PixelDataForTexture = (x,y, RGB( x/3.0, 127, y/2.0) ) } }Schonmal vielen dank im voraus für hilfe!
-
Du allozierst Texturspeicher fuer 512x512 Pixel:
g_pD3DDevice->CreateTexture( 512, 512, 0, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &g_pTexture, NULL );
Und dann schreibst Du 512*512*128*128 Pixel (das sind 16 Gigabyte) rein:
int texcount = 512*512;
while (texcount--)
{
for(int x = 0; x < 128; x++)
{
for(int y = 0; y < 128; y++)
{
int c = x ^ y;
*pixel++ = D3DCOLOR_XRGB(c,c,255,c);
}
}
}Da wuerd' ich auch crashen...
Versuch's mal so:
g_pTexture->LockRect(0, &lr, 0, 0); unsigned char *scanline= (unsigned char*)lr.pBits; for(int y = 0; y < 512; y++) { // 32bit zeiger auf die aktuelle scanline unsigned int *pixel= (unsigned int*)scanline; for(int x = 0; x < 512; x++) { int c = x ^ y; *pixel++ = D3DCOLOR_XRGB(c,c,255,c); } // zeiger zur naechsten scanline scanline+=lr.Pitch; } g_pTexture->UnlockRect(0);Wenn Du Dir die Beispiele und die Dokumentation im DirectX-SDK genau anschaust, wirst Du es sicher selber hinkriegen, ein Polygon zu zeichnen.