 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.08.2003, 22:00 Titel: Landschaftsrendering |
|
|
Hallo
Alle kennen sicher so geile Landschaften wie bei Morrowind oder die im Realen leben, wo sich verschiedenen Stoffe (Gras, Fels, Sand, Schnee, ...) miteinander vermischen ohne das man eine richtige Grenze des ganzen sehen kann (Gras dann kommt ganuz plötzlich Fels ohne sichtbaren Grund)
Mein Problem ist nun folgendes:
Meine Engine unterstützt das ganze jetzt einigermaßen, ABER da wo sich die Texturen mischen wird alles auf einmal heller (die Farbe in die es sich richtet kann ich angeben). Das heisst ich arbeite mit Alphablending um die Texturen miteinander zu verschmelzen. Das ganze habe ich mal in einen Vertexshader für DX9 reingehauen:
Code: |
texture texture0;
texture texture1;
texture texture2;
texture texture3;
texture texture4;
technique LandscapeBlend
{
pass Pass1
{
AlphaBlendEnable = FALSE;
SrcBlend = ZERO;
DestBlend = SRCCOLOR;
Texture[0] = <texture1>;
ColorOp[0] = BLENDDIFFUSEALPHA;
ColorArg1[0] = Texture;
ColorArg2[0] = Current;
}
pass Pass2
{
AlphaBlendEnable = TRUE;
SrcBlend = ZERO;
DestBlend = SRCCOLOR;
Texture[0] = <texture2>;
ColorOp[0] = BLENDDIFFUSEALPHA;
ColorArg1[0] = Texture;
ColorArg2[0] = Current;
}
pass Pass3
{
AlphaBlendEnable = TRUE;
SrcBlend = ZERO;
DestBlend = SRCCOLOR;
Texture[0] = <texture3>;
ColorOp[0] = BLENDDIFFUSEALPHA;
ColorArg1[0] = Texture;
ColorArg2[0] = Current;
}
pass Pass4
{
AlphaBlendEnable = TRUE;
SrcBlend = ZERO;
DestBlend = SRCCOLOR;
Texture[0] = <texture4>;
ColorOp[0] = BLENDDIFFUSEALPHA;
ColorArg1[0] = Texture;
ColorArg2[0] = Current;
}
pass Pass3
{
AlphaBlendEnable = TRUE;
SrcBlend = ZERO;
DestBlend = SRCCOLOR;
Texture[0] = <texture0>;
ColorOp[0] = BLENDDIFFUSEALPHA;
ColorArg1[0] = Texture;
ColorArg2[0] = Current;
}
}
|
Ich könnte das sicher noch optimieren aber darum geht es hier nicht.
Deshalb wollte ich wissen wie man sowas besser hinbekommen kann.
Hier noch mal der C++ code vom rendering:
Code: |
m_pd3dDevice->SetFVF(D3DFVF_TERRAIN);
m_pd3dDevice->SetIndices( ml_MeshObject->lpIB );
m_pd3dDevice->SetStreamSource( 0, ml_MeshObject->mother->lpVB, 0, sizeof(MLTERRAINVERTEX) );
m_pd3dDevice->SetTransform( D3DTS_WORLD , &li->movement.matrix );
li->pVertexShader->pEffect->SetTechnique( li->pVertexShader->cTechnology );
for(int i=0; i<DFX_MAX_TEXTURESTAGES; i++)
if(li->texture[i])
{
char stdobject[DFX_MAX_NAMELENGTH];
sprintf(stdobject,"texture%d",i);
li->pVertexShader->pEffect->SetTexture( stdobject, li->texture[i] );
}
UINT uPasses;
li->pVertexShader->pEffect->Begin( &uPasses, 0 );
for( UINT uPass = 0; uPass < uPasses; ++uPass )
{
li->pVertexShader->pEffect->Pass( uPass );
m_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
0, ml_MeshObject->mother->vertexcount,
0, ml_MeshObject->dwIndexCount/3 }
li->pVertexShader->pEffect->End();
|
|
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 08.09.2003, 16:23 Titel: |
|
|
Habe die Frage irgendwie jetzt erst gesehen. Ich arbeite auch gerade an sowas. Funktioniert es bei dir mittlerweile? Ich arbeitet an folgender Lösung.:
Angenommen es gibt 3 verschiedene Bodenarten (Grass, Fels, Sand). Es kann vorerst nur zwischen zwei Arten (Grass<->Sand, Grass<->Fels, Fels<->Sand) geblendet werden. Ich hatte eigentlich vor auf die Diffuse Komponente (für Alpha) zu verzichten und stattdessen 8 Bit Alphamaps zu verwenden. Es werden also zuerst z.B. Grass und Alpha und das Ergebnis mit Sand geblendet.
Ich versuche mal in nächster Zeit eine Demo zusammenzustellen.
P.S.: Wozu ist der Pass 3 am Ende? |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.09.2003, 16:46 Titel: |
|
|
Im 3.Pass wird die Basis Textur gerendert damit es keine weissen Flächen gibt (sollte ich mal ändern).
Einigermaßen habe ich es geregelt bekommen das die weissen Flächen nicht so extrem herausragen (lag an den hohen Gammewerten meines Laptops).
Das ganze System funktioniert so:
Die Landschaft ist ein riesiges Fläche (Quad) das unterteilt ist in viele weitere kleinere Quads. Dabei bekommt jeder Vertex einen eigenen Alphawert für jede Textur.
Im Vertexshader wird dann jede Textur mit den Alphawerten verwendet und gerendert. Durch BLENDDIFFUSEALPHA wird dann der Alphawert der Vertexe genutzt um sich mit dem Untergrund zu verbinden. So entsthet ein nahezu perfekter Übergang zwischen jeden einzelnen Texturen.
So wie du es beschrieben hast scheint das bei dir nur zwischen bestimmten Texturen zu klappen, oder ?
Die Alpha und Texturcoordinaten für die Vertexe werden immer seperat in der Renderroutine übergeben (muss ich auch noch optiomieren).
Bis jetzt finde ich das es Morrowind ziemlich nahe kommt.
Ich muss nur noch die Unterstützung für Lichtquellen einbauen damit es perfekt aussieht. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
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
|