ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4421437
Jetzt (Chat):
4 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
DirectX API
Re: assimp: Problem mit PixelShader
Normal
AutorThema
ponx Offline
ZFX'ler


Registriert seit:
04.05.2008

Hamburg
assimp: Problem mit PixelShaderNach oben.
Hallo die Herren !
Ich bin dabei, den Rendercode aus dem Assimp-Viewer (revision von vor 3 Monaten) irgendwie in mein DirectX-Spiel reinzubasteln. (Sagt mir jetzt nicht, dass mittlerweile der Viewer-Code fertig umgestrickt wurde, sodass das leichter von der Hand geht, ich hab's nämlich fast geschafft ! ) Jedenfalls hab ich den HLSL-Code aus der Shader.cpp in eine externe .fx Datei geschrieben, damit ich leichter kapiere, was da vonstatten geht, und damit ich auch debuggen kann. Letztendlich wird in meinem Fall nur folgende Technique benutzt:

Code:
technique MaterialFXSpecular_D1
{
    pass p0
    {
        CullMode=none;
#ifdef AV_OPACITY_TEXTURE
        AlphaBlendEnable=TRUE;SrcBlend = srcalpha;
        DestBlend = invsrcalpha;
#else
#ifdef AV_OPACITY
        AlphaBlendEnable=TRUE;SrcBlend = srcalpha;
        DestBlend = invsrcalpha;
#endif 
#endif
        PixelShader = compile ps_3_0 MaterialPShaderSpecular_D1();
        VertexShader = compile vs_3_0 MaterialVShader_D1();
    }
};


Ich krieg auch keine compile errors, und der Vertex Shader MaterialVShader_D1 funktioniert auch. Allerdings wird im Spiel dann das Modell nur weiß gerendert, deshalb hab ich mal mit PIX geguckt, und festgestellt, dass bei PixelShader nur "(none)" steht. Jetzt frag ich mich, an welcher Stelle da was schief laufen kann - setzt man nicht erst den Effect und danach die Technique, jeweils als Einheit ? Bin in Sachen Shadern noch grün hinter den Ohren und bin für jeden Tipp dankbar !

viele Grüße,
andy / ponx
22.02.2009, 14:25:55 Uhr
ponx Offline
ZFX'ler


Registriert seit:
04.05.2008

Hamburg
Re: assimp: Problem mit PixelShaderNach oben.
entschuldigt Leute, bin mittlerweile nicht mehr so sicher, dass diese Technique überhaupt richtig gesetzt ist. Ich meld mich wieder wenn ich kapier was hier passiert. :/

Entschuldigung nochmal

Knoten im Kopp:
ponx
22.02.2009, 15:55:21 Uhr
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: assimp: Problem mit PixelShaderNach oben.
Kein Problem

Zitat:

Sagt mir jetzt nicht, dass mittlerweile der Viewer-Code fertig umgestrickt wurde, sodass das leichter von der Hand geht, ich hab's nämlich fast geschafft

Ich kann dich beruhigen, ist immer noch der alte. Kein sein dass ich ein paar Details korrigiert habe, aber am Chaos hat sich nichts geändert Ich kann dir übrigens nur raten aus Performancegründen das CCW-Culling für Assimp-Modelle auch zu aktivieren .. etwa

Code:
CullMode=ccw;


Im Viewer ist es deaktiviert weil Assimp softwareseitig keine wirkliche Möglichkeit hat die Faceorder wirklich 100% sicher zu garantieren. Wenn es aber bei den von dir verwendeten Modellen funktioniert, kannst du so die Renderingperformance gehörig erhöhen ...

Gruß,
Alex
22.02.2009, 16:42:32 Uhr
ponx Offline
ZFX'ler


Registriert seit:
04.05.2008

Hamburg
Re: assimp: Problem mit PixelShaderNach oben.
vielen Dank, Alex !
Das ursprüngliche Problem besteht zwar noch, aber mittlerweile rendert er mir doch glatt die Texturen richtig, solang ich als Shader-Source den String aus der Shader.cpp benutze, und nicht meine exportierte .fx Datei. Ich lass es jetzt gut sein, aber wurmen tut's mich schon... wüsste gerne, was da schief läuft, dass er den PixelShader nicht wollte.
Das mit dem Culling werd ich gleich ausprobieren, sobald ich wieder denken kann Als nächstes wollte ich mir auch noch angucken, wie das mit den Lichtquellen geregelt ist. Sobald mehr als eine da ist, wird beim Assimp-Viewer der shader gewechselt, richtig ? Kann man das nicht irgendwie dynamisch machen, oder sind mehr als 4 Lichtquellen sowieso utopisch, wegen zu hoher Last ?

grüße,
andy
22.02.2009, 18:23:43 Uhr
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: assimp: Problem mit PixelShaderNach oben.
Hi,

Du hast da erfolgreich deinen Finger auf das meiner Meinung nach mühsamste Problem der ganzen Rumshaderei gelegt ... der Umgang mit mehreren Lichtquellen. Es ist entweder ein Performance- oder ein kombinatorisches Problem.

Variante a)


  • Modell ohne Beleuchtung rendern
  • Für jede Lichtquelle das Modell nochmal rendern und additiv/multiplikativ auf das bereits vorhandene Bild im Framebuffer 'draufblenden'.
  • Alle Vertices müssen doppelt oder sogar dreifach transformiert werden, Alpha blending ist teuer: ziemlich performanceschädlich das ganze also.


Variante b)


  • Für jede Variante einen Shader manuell schreiben (oder vom Präprozessor schreiben lassen ).
  • Viel mehr Verwaltungsaufwand ...


Das Problem wächst auch noch damit dass man ja nicht nur Richtungslichtquellen haben kann ... grade Punktlichter sehen doch ziemlich stimmungsvoll aus An deiner Steolle würde ich mich erstmal hinsetzen und ganz genau herausfinden wieviele Lichtuellen welchen Typs du eigentlich brauchst. Bei überschaubarer Anzahl kannst du theoretisch fortfahren wie im AssimpView-Code und einfach wild Code duplizieren ...

Das hier geht auch (Pixelshader):

Code:
// ambiente, diffuse und glanzkraftfarbe aus texturen und materialfarben
float3 curDiffuse, curAmbient, curSpecular, curEmissive;


// schleife über all richtungs lichter
float3 result(0.f,0.f,0.f);
for (int i = 0; i < NUM_DIR_LIGHTS; ++i) {

   // beleuchtungsintensität berechnen, phong-term, usw ...

   // zu result hinzuaddieren
}

// dasselbe für punktlichter?
// dasselbe für spotlichter?
// dasselbe für teddybären?

// weitermachen ....
result += curEmissive;

// und schließlich result zurückgeben


Beim Compilen des Shaders dann NUM_DIR_LIGHTS als Präprozessorkonstante setzen, der HLSL-Compiler rollt die Schleife dann automatisch aus und du kannst leicht beliebig viele Kombinationen generieren (geht auch mit uniformen Shaderparametern). Schlussendlich wird es natürlich auch noch etwas dadurch erschwert dass du Teile der Daten durch den Vertexshader durchreichen musst (oder alles im Pixelshader machst, was etwas teurer ist). Aber du schaffst das schon

Gruß,
Alex

1 Mal gendert, zuletzt am 23.02.2009, 12:51:05 Uhr von Aramis.
23.02.2009, 12:47:00 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: assimp: Problem mit PixelShaderNach oben.
Zitat von Aramis:
Alle Vertices müssen doppelt oder sogar dreifach transformiert werden, Alpha blending ist teuer: ziemlich performanceschädlich das ganze also.
Alpha Blending kostet so gut wie garnichts … da nach dem ersten Draw eh der Z-Buffer gefüllt ist gibt es in den späteren Passes nicht einmal Overdraw. Genau da liegt dann nämlich auch das eigentliche Problem: Alpha-Blending, falls das Modell welches nutzt, funktioniert schlicht und einfach nicht mehr.

[OT]Wie ich diese Probleme mit statischen Shadern hasse, ein Hoch auf D3D 10.1 [/OT]

Gruß, Ky
23.02.2009, 14:16:11 Uhr
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: assimp: Problem mit PixelShaderNach oben.
Jupp, du hast natürlich Recht, danke für die Korrektur

Gruß,
Alex
23.02.2009, 14:42:06 Uhr
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel