diff options
| author | Rodolfo Osvaldo Bogado <rodolfoosvaldobogado@gmail.com> | 2010-06-12 12:36:33 +0000 |
|---|---|---|
| committer | Rodolfo Osvaldo Bogado <rodolfoosvaldobogado@gmail.com> | 2010-06-12 12:36:33 +0000 |
| commit | ce3c2700e7fd4226905b2ed652aded96d44eebd2 (patch) | |
| tree | 551eda54f77493bd865723fbe196cbcf755ed0c1 /Source/Core/VideoCommon | |
| parent | 7efbc879e544cba7f205b3eeaeff050f46fd9607 (diff) | |
This commit is separate in two parts:
Fix: fix for lighting equations , that must improve lighting in a lot of games ( test smg :) )
experimental speedup: implemented alpha pass using stencil buffer instead of a duplicate shader. i recommend to test this well as i dono if will work the same way in all the systems. i my system it gives a nice 2-5 fps improvement. if it brings problems in any system or game will revert asap.
enjoy
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5653 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon')
| -rw-r--r-- | Source/Core/VideoCommon/Src/VertexShaderGen.cpp | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index afacb65e97..a2a096d0dd 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -270,37 +270,44 @@ const char *GenerateVertexShaderCode(u32 components, bool D3D) else // from color WRITE(p, "lacc.w = "I_MATERIALS".C%d.w;\n", j); } - - if (color.enablelighting && alpha.enablelighting && (color.GetFullLightMask() != alpha.GetFullLightMask() || color.lightparams != alpha.lightparams)) { - - // both have lighting, except not using the same lights - int mask = 0; // holds already computed lights - - if (color.lightparams == alpha.lightparams && (color.GetFullLightMask() & alpha.GetFullLightMask())) { - // if lights are shared, compute those first - mask = color.GetFullLightMask() & alpha.GetFullLightMask(); - for (int i = 0; i < 8; ++i) { - if (mask & (1<<i)) - p = GenerateLightShader(p, i, color, "lacc", 3); - } - } - + + if(color.enablelighting && alpha.enablelighting) + { + // both have lighting, test if they use the same ligths + int mask = 0; + if(color.lightparams == alpha.lightparams) + { + mask = color.GetFullLightMask() & alpha.GetFullLightMask(); + if(mask) + { + for (int i = 0; i < 8; ++i) + { + if (mask & (1<<i)) + p = GenerateLightShader(p, i, color, "lacc", 3); + } + } + } // no shared lights - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < 8; ++i) + { if (!(mask&(1<<i)) && (color.GetFullLightMask() & (1<<i)) ) p = GenerateLightShader(p, i, color, "lacc", 1); if (!(mask&(1<<i)) && (alpha.GetFullLightMask() & (1<<i)) ) p = GenerateLightShader(p, i, alpha, "lacc", 2); } - } - else if (color.enablelighting || alpha.enablelighting) { - // either one is enabled - int coloralpha = (int)color.enablelighting|((int)alpha.enablelighting<<1); - for (int i = 0; i < 8; ++i) { - if (color.GetFullLightMask() & (1<<i) ) - p = GenerateLightShader(p, i, color.enablelighting?color:alpha, "lacc", coloralpha); + } + else if (color.enablelighting || alpha.enablelighting) + { + //ligths are disabled in one channel so proccess only te active + LitChannel workingchannel = color.enablelighting ? color : alpha; + int coloralpha = color.enablelighting ? 1 : 2; + for (int i = 0; i < 8; ++i) + { + if (workingchannel.GetFullLightMask() & (1<<i)) + p = GenerateLightShader(p, i, workingchannel, "lacc", coloralpha); + } - } + } if (color.enablelighting != alpha.enablelighting) { if (color.enablelighting) |
