Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Programare » Grafică » Problema combinare shadere




Pagina 1 din 1 [ 1 ]

Mesaj Info autor
    Postat la 21 Oct 2009 17:31:06    Subiect: Problema combinare shadere
adimirea info:

adimirea:

Salut

M-ar interesa daca stie cineva cum pot rezolva problema combinarii shaderelor, ca sa zic asa.

Mai precis, sa zicem ca am un shader
E1, n-are importanta ce face.. sa zicem texturare simpla.
E2 = normal mapping
E3 = fog
E4 = iluminare phong [ fara normal map ]
...
En

Problema mea apare atunci cand vreau sa combin aceste shadere. Mai precis, vreau sa am niste flag-uri de randare, care sa imi descrie ce efecte din E1, ... En sunt puse pe geometria pe care o randez la un anume moment de timp.

Se observa usor ca sunt n factorial moduri de a combina aceste shadere
(!) ceea ce prezinta o problema destul de mare.

Sa zicem ca am implementat o scena ceva mai complexa, ce foloseste 300 de shadere, care toate fac normal mapping intr-un anume mod.

La un moment dat ma hotarasc ca nu imi place ca e de exemplu tangent space normal mapping, si vreau sa fac in world space.
De aici, rezulta ca trebuie sa editez de mana cele 300 de shadere.

Sau, vreau sa schimb formula ce calculeaza ceata... Exemple sunt foarte multe pentru aceeasi unica problema ce apare din reduntanta datelor. Si o simpla cautare si inlocuire de text nu merge, trebuie regandite toate shaderele, ceea ce este destul de greoi si obositor.
Exista o reduntanta in shadere foarte mare, care complica lucrurile.

In plus, poate vreau ca dinamic sa dau flag-uri cum am mai zis mai sus, gen DrawCube(EFFECT_NORMAL_MAP|EFFECT_FOG); [ orice combinatie din cele n! ] si sa mearga.
Pentru a asigura asta trebuie sa implementez cele n! shadere. [ lucru aproape imposibil; eu m-am oprit cu abordarea asta intre 4 si 5 factorial, cum era si normal; de exemplu am pornit de la un shader ce facea instancing numit drawInstanced... si dupa ce am mai adaugat efecte el acum a devenit pe nivelul cel mai mare drawInstancedWithLightAndFogAndNormalMapScalingTexture, punct in care m-am cam hotarat ca am o problema...

Am incercat la un moment dat o rezolvare ce presupunea a avea un singur fisier main in fragment shader, si in vertex shader [ poate si geometry shader ] si multe functii.. implementate separat doar daca e necesar de catre un anume efect. Insa, si metoda asta are aceleasi probleme.. in loc sa rescriu shadere, rescriu functii.

Exista vreo metoda de a combina efecte?


Status:
Înregistrat pe:
15 Jul 2009 18:24:27
Vârsta: 27 ani
Mesaje: 5
Locatie: Bucuresti
Programator

 
    Postat la 21 Oct 2009 17:38:21    Subiect: < fara subiect >
nekitu info:

nekitu:

nu prea, poti implementa un ubershader

http://www.gamedev.net/community/forums/topic.asp?topic_id=420784

sau node based shader (si editor), care leaga componente de diverse tipuri, si care poate fi compilat pe orice masina

SpoOoOoock! Life Is Too Short For Cheap Chocolate


Status:
Înregistrat pe:
29 Sep 2006 11:33:12
Vârsta: 32 ani
Mesaje: 1013
Locatie: Brasov
Programator
7thFACTOR Entertainment Studios
 
    Postat la 21 Oct 2009 18:13:01    Subiect: < fara subiect >
Dark info:

Dark:

#ifdef for the win.

Daca-ti izolezi chestiile comune in functii (normal mapping, skinning etc.) nu-i asa de mare dezastrul. Pina la urma nu-i nici o diferenta intre spart codul in functii in C++ si spart codul in functii in HLSL/Cg/GLSL etc. Explozia combinatorica nu are prea mare legatura cu faptul ca trebuie sa-ti pui codul care face height fog intr-o functie, intr-un header.

Problema exploziei combinatorice este una spinoasa si nu prea exista solutie generica. Unii fac pe disc un cache atunci cind compileaza un shader cu o anumita combinatie de flag-uri pentru prima data (Crytek, de exemplu) ca sa nu vina cu 14 miliarde de variante de SkinnedPhong pe DVD. Cache-ul e necesar deoarece compilatul dureaza mult timp.

Altii pur si simplu nu permit artistilor sa faca shadere in nestire, ci au un technical artist care aproba ce shadere si ce combinatii se baga in joc (Epic Games). In felul asta, nu rezulta foarte multe combinatii, si se pot pune pe DVD toate variantele precompilate. Timpul de incarcare scade fericit.

Multi prefera un ubershader, asa cum a zis nekitu (cumva asta e o varianta restrinsa a punctului anterior). Un technical artist sau un programator decide ce flag-uri are ubershader-ul si restul artistilor se descurca cu el. Bunul simt al persoanei in cauza este responsabil cu mentinerea numarului flag-urilor in limite practice, astfel incit sa se poata genera toate combinatiile offline (si intr-un timp decent, nu sa dureze 14 ore sa compilezi jocul dupa ce schimbi o linie intr-un shader).

Shader model 5 vine cu interfete si alte minunatii OOP in HLSL care au menirea de a usura distractia asta, dar nu gasesc ca se ocupa de problema de baza. Indiferent cine expandeaza combinatiile - eu manual cu ifdef-uri sau runtime-ul D3D11 cu interfete - cineva tot o face, si tot dureaza, si tot nu poti sa le bagi pe toate in memorie in acelasi timp (probabil). Interfetele alea doar te scutesc de pastorit macro-uri si de scris cod plictisitor care genereaza combinatii.

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 729
Locatie:
Programator

 

Pagina 1 din 1 [ 1 ]


Server time: 21:10:54 11.02.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2011 Copyright 7thFACTOR Entertainment - All rights reserved