#1 09.04.2005 12:58:43

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Texturlayer

Vor ca. einem Jahr hatte ich im DelphiDX.de-Forum mal die Frage gestellt wie man ohne Pixelshader, nur mit Multitexturing, mehrere Texturlayer (jeweils eine Alphamap und eine Textur) übereinander rendert.
Hat etwas gedauert, aber es geht! :p

Hier die Lösung:

Ihr braucht eine Grafikkarte mit folgenden Fähigkeiten:
D3DPMISCCAPS_TSSARGTEMP = yes
D3DTEXOPCAPS_MULTIPLYADD = yes
MaxTextureBlendStages >= 8
MaxSimultaneousTextures >= 7

Bei mir scheitert es leider an letzterem, meine Radeon7500  kann nur 3.... :down:

Falls eure Karte das aber kann, könnt ihr problemlos drei Ebenen, eine Detailmap und auch noch Licht in einem Single Pass per Mutlitexturing  zusammen rendern:

Der Alphawert muss in den Farbwerten sein, nicht etwa im Alpha!
Die Alphamaps müssen so aussehen, dass alle drei Maps zusammen addiert exakt weiß sind (also 255, 255, 255)

Code: delphi

// Alphamap 1
gdx3ddev->settexturestagestate(0, d3dtss_colorarg1, d3dta_texture);
gdx3ddev->settexturestagestate(0, d3dtss_resultarg, d3dta_current);
gdx3ddev->settexturestagestate(0, d3dtss_colorop,   d3dtop_selectarg1);

// Texturlayer 1
gdx3ddev->settexturestagestate(1, d3dtss_colorarg1, d3dta_current);
gdx3ddev->settexturestagestate(1, d3dtss_colorarg2, d3dta_texture);
gdx3ddev->settexturestagestate(1, d3dtss_resultarg, d3dta_temp);
gdx3ddev->settexturestagestate(1, d3dtss_colorop,   d3dtop_modulate);

// Alphamap 2
gdx3ddev->settexturestagestate(2, d3dtss_colorarg1, d3dta_texture);
gdx3ddev->settexturestagestate(2, d3dtss_resultarg, d3dta_current);
gdx3ddev->settexturestagestate(2, d3dtss_colorop,   d3dtop_selectarg1);

// Texturlayer 2
gdx3ddev->settexturestagestate(3, d3dtss_colorarg1, d3dta_temp);
gdx3ddev->settexturestagestate(3, d3dtss_colorarg2, d3dta_current);
gdx3ddev->settexturestagestate(3, d3dtss_colorarg0, d3dta_texture);
gdx3ddev->settexturestagestate(3, d3dtss_resultarg, d3dta_temp);
gdx3ddev->settexturestagestate(3, d3dtss_colorop,   d3dtop_multiplyadd);

// Alphamap 3
gdx3ddev->settexturestagestate(4, d3dtss_colorarg1, d3dta_texture);
gdx3ddev->settexturestagestate(4, d3dtss_resultarg, d3dta_current);
gdx3ddev->settexturestagestate(4, d3dtss_colorop,   d3dtop_selectarg1);

// Texturlayer 3
gdx3ddev->settexturestagestate(5, d3dtss_colorarg1, d3dta_temp);
gdx3ddev->settexturestagestate(5, d3dtss_colorarg2, d3dta_current);
gdx3ddev->settexturestagestate(5, d3dtss_colorarg0, d3dta_texture);
gdx3ddev->settexturestagestate(5, d3dtss_resultarg, d3dta_current);
gdx3ddev->settexturestagestate(5, d3dtss_colorop,   d3dtop_multiplyadd);

// Detailmap
gdx3ddev->settexturestagestate(6, d3dtss_colorarg1, d3dta_current);
gdx3ddev->settexturestagestate(6, d3dtss_colorarg2, d3dta_texture);
gdx3ddev->settexturestagestate(6, d3dtss_colorop,   d3dtop_modulate);

// Diffuse (Licht)
gdx3ddev->settexturestagestate(7, d3dtss_colorarg1, d3dta_current);
gdx3ddev->settexturestagestate(7, d3dtss_colorarg2, d3dta_diffuse);
gdx3ddev->settexturestagestate(7, d3dtss_colorop,   d3dtop_modulate); 



Schade das das bei mir leider nicht funtkioniert, aber vielleicht bei jemand anderes.... smile

Coolcat


My software never has bugs. It just develops random features.

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson