.[ ČeskéHry.cz ].
Optimalizace HLSL
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 26. srpen 2009, 08:23:21    Předmět: Optimalizace HLSL Odpovědět s citátem

Zdravím Vás, potřebuji poradit, hraju si s jedním vzorovým effektem abych lépe pochopil jak správně psát kód do effektů.

Při rozšíření o jedno světlo jsem narazil na tuto chybu:
"Compiled shader code uses too many arithmetic instruction slots (78). Max. allowed by the target (ps_2_0) is 64."

Pravděpodobně jsem překročil počet aritmetických operací v pixerl sharderu. Když jsem hledal na googlu, našel jsem zmíňku o optimalizaci HLSL, kde převáděli vektory na matice a tím smížili počet aritmetických operací. Potřeboval bych od Vás tedy poradit jak by se dal upravit tento effekt abych se dostal do zmiňovaného limitu.


Effekt:
kód:

//**********************************************************************
// Pixel Shaders
//**********************************************************************
float4 PhongMy_2 (XSI_VertexToPixel IN) : COLOR
{
   #define NUM_LIGHTS 4

   float4 LightPos[NUM_LIGHTS] =
   {
      lightpos0,
      lightpos1,
      lightpos2,
      lightpos3
   };

   float4 LightCol[NUM_LIGHTS] =
   {
      lightcol0,
      lightcol1,
      lightcol2,
      lightcol3
   };


   float3 globalpos = IN.texcoord4;   
   float3x3 TangentToWorldSpace;
   
   float3 lightcolor = 0.0f;
   
   //*************************************************
   // sample our textures
   //*************************************************
   float3 normaltex = tex2D(NormalSampler, IN.texcoord0) * 2 - 1;
   float3 ambienttex = tex2D(AmbientSampler, IN.texcoord0);
   float3 albedotex = tex2D(AlbedoSampler, IN.texcoord0);
   
   AmbientColor = AmbientColor * ambienttex;
   DiffuseColor = DiffuseColor * albedotex;
   
   TangentToWorldSpace[0] = IN.texcoord5.xyz;
   TangentToWorldSpace[1] = IN.texcoord6.xyz;   
   TangentToWorldSpace[2] = IN.texcoord7.xyz;
   
   //*************************************************
   // convert normal in world space
   //*************************************************
   float3 normal = normalize(mul(normaltex,TangentToWorldSpace));
   
   //*************************************************
   // eye to vertex   
   //*************************************************
   float3 eyetovert = normalize(sieye.xyz - globalpos);
   
   //*************************************************
   // light up
   //*************************************************
   float3 ts_lightdir;
   float3 ts_hvec;
      
   int loop;
   for(loop = 0; loop < NUM_LIGHTS; loop++)
   {
      // light direction
      ts_lightdir = LightPos[loop].xyz - globalpos;
      
      float lightdistance = length(ts_lightdir);
      ts_lightdir = normalize(ts_lightdir);
   
      // half vector
      ts_hvec = normalize(eyetovert + ts_lightdir);
   
      float3 currentcolor =  LightCol[loop] * (
         (DiffuseColor * clamp(dot(normal, ts_lightdir), 0, 1)) +    // diffuse
         (SpecularColor * LightCol[loop] * pow(clamp(dot(normal, ts_hvec),0,1), SpecularPower)));   // specular
         
      lightcolor += currentcolor;
   }
   
   float4 result =   float4(AmbientColor + lightcolor, 1);   

   return result;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. srpen 2009, 01:36:31    Předmět: Odpovědět s citátem

clamp(x, 0, 1) přepiš na saturate(x). Tato funkce je v DX9 většinou zadarmo (nebere žádnou instrukci).

Pro 4 světla je ale dost problém se vlézt do 64 instrukcí. Sám se tam nevlezu ani s jedním světlem...

Přepni si na vs_3_0 a ps_3_0.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 27. srpen 2009, 07:06:57    Předmět: Odpovědět s citátem

Kde všude je nutné přenastavit že se jedná o VS a PS 3.0? Já jsem to přenastavil jen zde:

kód:

technique Static
{
   pass p0
   {      
      VertexShader = compile vs_3_0 VSStatic();
      PixelShader = compile ps_3_0 PhongMy_2();
   }
}


Ale asi to není vše, protože se mi nějak rozhodí barvy textur, vypadá to jako duha..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 27. srpen 2009, 20:42:42    Předmět: Odpovědět s citátem

Tak když jsem to otestoval na jiné (silnější) grafice, vše funguje správně... Osobně jsem myslel, že pokud nějaká grafika nebude mít VS a PS verze 3_0, tak effekt vůbec nespustí.. Čím je způsobeno že effekt funguje ale chybně?

Dále by mě zajímalo, zda jde nějak se v effektu rozhoudnout zda grafika podporuje jen verzi 2_0 nebo i 3_0?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. srpen 2009, 21:07:33    Předmět: Odpovědět s citátem

Když SM3.0 neumí, tak ano, efekt nepůjde pustit. Proč to nefunguje, nevím, fungovat by to mělo.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 27. srpen 2009, 21:34:02    Předmět: Odpovědět s citátem

Primo v HLSL (co vim) rozhodnout o podporovane verzi vs/ps nejde. Myslim ze si tyhle veci musis nacist v aplikaci z device->GetDeviceCaps. Tahle funkce vyhodi strukturu s informacema o zarizeni mezi nima i VertexShaderVersion a PixelShaderVersion. A podle tech verzi teprve vytvorit effect.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 28. srpen 2009, 07:53:03    Předmět: Odpovědět s citátem

Tak jsem prověřil PC na kterém se effekt fungoval divně (duhové barvy). Grafická karta zde popdoruje VS 3_0 ale PS jen 2_0. Nevím proč se tedy effekt spustí, ale už vím proč je to blbě...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Manox



Založen: 30. 07. 2007
Příspěvky: 140
Bydliště: Brno

PříspěvekZaslal: 28. srpen 2009, 08:34:51    Předmět: Odpovědět s citátem

Jen tak nahodou, nemuze to byt tim, ze to proste nevyhodi vyjimku pri nacteni effectu, nastavi ho na null a pouzije se FFP ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 28. srpen 2009, 16:10:47    Předmět: Odpovědět s citátem

Jo. Je možné, že Juraj nekontroluje všechny chyby. Co je to mimochodem za hw, že podporuje jiný VS a jiný PS?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JohnyDog



Založen: 17. 08. 2007
Příspěvky: 66

PříspěvekZaslal: 28. srpen 2009, 16:41:21    Předmět: Odpovědět s citátem

Eosie napsal:
Co je to mimochodem za hw, že podporuje jiný VS a jiný PS?

Tipoval bych Intel GMA 950 nebo neco podobne zalozeneho bez HW VS.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 28. srpen 2009, 16:44:37    Předmět: Odpovědět s citátem

To by docela odpovídalo, protože moje ATI odmítá fungovat s rozdílnýma verzema. Když chci přepnout na ps_3_0, musím přepnout i vertex shader na vs_3_0, jinak to vrátí error.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 31. srpen 2009, 11:16:04    Předmět: Odpovědět s citátem

JohnyDog napsal:
Eosie napsal:
Co je to mimochodem za hw, že podporuje jiný VS a jiný PS?

Tipoval bych Intel GMA 950 nebo neco podobne zalozeneho bez HW VS.


Ano jedná se o nějakou integrovanou grafickou kartu označenou Intel(R) G33/G31 Express.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 31. srpen 2009, 11:19:07    Předmět: Odpovědět s citátem

Manox napsal:
Jen tak nahodou, nemuze to byt tim, ze to proste nevyhodi vyjimku pri nacteni effectu, nastavi ho na null a pouzije se FFP ?


Jelikož nejsem vlastníkem tohoto "stroje" a zde na mém projektu pracuji pouze vyjímečně, jakmile zde budu mít prostor, prověřím načtení effektu.

ps: co znamená FPP?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 31. srpen 2009, 11:49:29    Předmět: Odpovědět s citátem

FFP - Fixed Function Pipeline, tj. standartni zbusob vykreslovani podporovany primo v HW, bez pouziti shaderu. Jedina moznost vykreslovani na GPU bez podpory shaderu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 31. srpen 2009, 14:21:31    Předmět: Odpovědět s citátem

FFP je způsob vykreslování, který už dlouho není podporovaný v HW, a proto jej musí driver emulovat pomocí shaderů. Těžko říct, který HW naposledy podporoval FFP, asi starodávný Radeon 7500?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna