Lights: Make possible for gpu drivers to unroll loop.

GPU doesn't like indirect addressing and thus it's better to have unrolled loop. This is only possible for loop with a static iteration count.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14830 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj 2013-12-29 18:37:45 +00:00
parent 4c725ac8f4
commit a2d1a86bac
3 changed files with 13 additions and 3 deletions

View File

@ -3,7 +3,6 @@ uniform sampler2D ntex;
uniform vec4 center[16];
uniform vec4 col[16];
uniform float energy[16];
uniform int lightcount;
uniform float spec;
uniform vec2 screen;
uniform mat4 invproj;
@ -19,7 +18,7 @@ void main() {
vec3 diffuse = vec3(0.), specular = vec3(0.);
for (int i = 0; i < lightcount; ++i) {
for (int i = 0; i < 16; ++i) {
vec4 pseudocenter = viewm * vec4(center[i].xyz, 1.0);
pseudocenter /= pseudocenter.w;
vec3 light_pos = pseudocenter.xyz;

View File

@ -364,7 +364,6 @@ void PointLightProvider::OnSetConstants(IMaterialRendererServices *srv, int)
srv->setVertexShaderConstant("col[0]", m_color.data(), m_color.size());
srv->setVertexShaderConstant("center[0]", m_pos.data(), m_pos.size());
srv->setVertexShaderConstant("viewm", m_view.pointer(), 16);
srv->setVertexShaderConstant("lightcount", &lightcount, 1);
if (!firstdone)
{

View File

@ -760,6 +760,18 @@ void IrrDriver::renderLights(const core::aabbox3df& cambox,
break;
}
}
// Fill lights
for (; lightnum < MAXLIGHT; lightnum++) {
accumulatedLightPos.push_back(0.);
accumulatedLightPos.push_back(0.);
accumulatedLightPos.push_back(0.);
accumulatedLightPos.push_back(0.);
accumulatedLightColor.push_back(0.);
accumulatedLightColor.push_back(0.);
accumulatedLightColor.push_back(0.);
accumulatedLightColor.push_back(0.);
accumulatedLightEnergy.push_back(0.);
}
LightNode::renderLightSet(accumulatedLightPos, accumulatedLightColor, accumulatedLightEnergy);
// Handle SSAO
SMaterial m_material;