Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 26. srpen 2009, 08:23:21 Předmět: Optimalizace HLSL |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. srpen 2009, 01:36:31 Předmět: |
|
|
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 |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 27. srpen 2009, 07:06:57 Předmět: |
|
|
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 |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 27. srpen 2009, 20:42:42 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. srpen 2009, 21:07:33 Předmět: |
|
|
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 |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 27. srpen 2009, 21:34:02 Předmět: |
|
|
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 |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 28. srpen 2009, 07:53:03 Předmět: |
|
|
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 |
|
 |
Manox

Založen: 30. 07. 2007 Příspěvky: 140 Bydliště: Brno
|
Zaslal: 28. srpen 2009, 08:34:51 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 28. srpen 2009, 16:10:47 Předmět: |
|
|
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 |
|
 |
JohnyDog

Založen: 17. 08. 2007 Příspěvky: 66
|
Zaslal: 28. srpen 2009, 16:41:21 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 28. srpen 2009, 16:44:37 Předmět: |
|
|
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 |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 31. srpen 2009, 11:16:04 Předmět: |
|
|
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 |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 31. srpen 2009, 11:19:07 Předmět: |
|
|
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 |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 31. srpen 2009, 11:49:29 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 31. srpen 2009, 14:21:31 Předmět: |
|
|
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 |
|
 |
|