merge changes for latest project integration repo
commit
cdedd9356a
|
|
@ -101,7 +101,7 @@ vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float
|
|||
float dist = d/la;
|
||||
da = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
da *= da;
|
||||
da *= 1.4;
|
||||
da *= 2.0;
|
||||
|
||||
|
||||
// spotlight coefficient.
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe
|
|||
float dist = d/la;
|
||||
float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 1.4;
|
||||
dist_atten *= 2.0;
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
|
|
|
|||
|
|
@ -45,9 +45,8 @@ uniform float sun_wash;
|
|||
|
||||
uniform int light_count;
|
||||
|
||||
#define MAX_LIGHT_COUNT 16
|
||||
uniform vec4 light[MAX_LIGHT_COUNT];
|
||||
uniform vec4 light_col[MAX_LIGHT_COUNT];
|
||||
uniform vec4 light[LIGHT_COUNT];
|
||||
uniform vec4 light_col[LIGHT_COUNT];
|
||||
|
||||
VARYING vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -105,73 +104,59 @@ void main()
|
|||
vec3 npos = normalize(-pos);
|
||||
|
||||
// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
|
||||
for (int i = 0; i < MAX_LIGHT_COUNT; ++i)
|
||||
for (int i = 0; i < LIGHT_COUNT; ++i)
|
||||
{
|
||||
bool light_contrib = (i < light_count);
|
||||
|
||||
vec3 lv = light[i].xyz-pos;
|
||||
float dist = length(lv);
|
||||
dist /= light[i].w;
|
||||
if (dist > 1.0)
|
||||
if (dist <= 1.0)
|
||||
{
|
||||
light_contrib = false;
|
||||
}
|
||||
|
||||
float da = dot(norm, lv);
|
||||
if (da < 0.0)
|
||||
{
|
||||
light_contrib = false;
|
||||
}
|
||||
|
||||
if (light_contrib)
|
||||
{
|
||||
lv = normalize(lv);
|
||||
da = dot(norm, lv);
|
||||
|
||||
float fa = light_col[i].a+1.0;
|
||||
float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 2.0;
|
||||
|
||||
dist_atten *= noise;
|
||||
|
||||
float lit = da * dist_atten;
|
||||
|
||||
vec3 col = light_col[i].rgb*lit*diff;
|
||||
|
||||
//vec3 col = vec3(dist2, light_col[i].a, lit);
|
||||
|
||||
if (spec.a > 0.0)
|
||||
float da = dot(norm, lv);
|
||||
if (da > 0.0)
|
||||
{
|
||||
lit = min(da*6.0, 1.0) * dist_atten;
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv+npos);
|
||||
float nh = dot(norm, h);
|
||||
float nv = dot(norm, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
|
||||
col += lit*scol*light_col[i].rgb*spec.rgb;
|
||||
//col += spec.rgb;
|
||||
}
|
||||
}
|
||||
lv = normalize(lv);
|
||||
da = dot(norm, lv);
|
||||
|
||||
out_col += col;
|
||||
float fa = light_col[i].a+1.0;
|
||||
float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 2.0;
|
||||
|
||||
dist_atten *= noise;
|
||||
|
||||
float lit = da * dist_atten;
|
||||
|
||||
vec3 col = light_col[i].rgb*lit*diff;
|
||||
|
||||
//vec3 col = vec3(dist2, light_col[i].a, lit);
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
lit = min(da*6.0, 1.0) * dist_atten;
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv+npos);
|
||||
float nh = dot(norm, h);
|
||||
float nv = dot(norm, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
|
||||
col += lit*scol*light_col[i].rgb*spec.rgb;
|
||||
//col += spec.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
out_col += col;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dot(out_col, out_col) <= 0.0)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
frag_color.rgb = out_col;
|
||||
frag_color.a = 0.0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -318,6 +318,10 @@ void main()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//not sure why, but this line prevents MATBUG-194
|
||||
col = max(col, vec3(0.0));
|
||||
|
||||
frag_color.rgb = col;
|
||||
frag_color.a = 0.0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -315,7 +315,10 @@ void main()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//not sure why, but this line prevents MATBUG-194
|
||||
col = max(col, vec3(0.0));
|
||||
|
||||
frag_color.rgb = col;
|
||||
frag_color.a = 0.0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -309,8 +309,8 @@ RenderVolumeLODFactor 1 2.0
|
|||
VertexShaderEnable 1 1
|
||||
WindLightUseAtmosShaders 1 1
|
||||
WLSkyDetail 1 128
|
||||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderDeferred 1 1
|
||||
RenderDeferredSSAO 1 1
|
||||
RenderShadowDetail 1 2
|
||||
RenderFSAASamples 1 2
|
||||
|
||||
|
|
|
|||
|
|
@ -817,12 +817,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
|
|||
size.mul(scale);
|
||||
}
|
||||
|
||||
// Catch potential badness from normalization before it happens
|
||||
//
|
||||
llassert(mat_normal.mMatrix[0].isFinite3() && (mat_normal.mMatrix[0].dot3(mat_normal.mMatrix[0]).getF32() > F_APPROXIMATELY_ZERO));
|
||||
llassert(mat_normal.mMatrix[1].isFinite3() && (mat_normal.mMatrix[1].dot3(mat_normal.mMatrix[1]).getF32() > F_APPROXIMATELY_ZERO));
|
||||
llassert(mat_normal.mMatrix[2].isFinite3() && (mat_normal.mMatrix[2].dot3(mat_normal.mMatrix[2]).getF32() > F_APPROXIMATELY_ZERO));
|
||||
|
||||
mat_normal.mMatrix[0].normalize3fast();
|
||||
mat_normal.mMatrix[1].normalize3fast();
|
||||
mat_normal.mMatrix[2].normalize3fast();
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ LLGLSLShader gDeferredTreeShadowProgram;
|
|||
LLGLSLShader gDeferredAvatarProgram;
|
||||
LLGLSLShader gDeferredAvatarAlphaProgram;
|
||||
LLGLSLShader gDeferredLightProgram;
|
||||
LLGLSLShader gDeferredMultiLightProgram;
|
||||
LLGLSLShader gDeferredMultiLightProgram[16];
|
||||
LLGLSLShader gDeferredSpotLightProgram;
|
||||
LLGLSLShader gDeferredMultiSpotLightProgram;
|
||||
LLGLSLShader gDeferredSunProgram;
|
||||
|
|
@ -1112,7 +1112,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredImpostorProgram.unload();
|
||||
gDeferredTerrainProgram.unload();
|
||||
gDeferredLightProgram.unload();
|
||||
gDeferredMultiLightProgram.unload();
|
||||
for (U32 i = 0; i < LL_DEFERRED_MULTI_LIGHT_COUNT; ++i)
|
||||
{
|
||||
gDeferredMultiLightProgram[i].unload();
|
||||
}
|
||||
gDeferredSpotLightProgram.unload();
|
||||
gDeferredMultiSpotLightProgram.unload();
|
||||
gDeferredSunProgram.unload();
|
||||
|
|
@ -1353,15 +1356,18 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
success = gDeferredLightProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
for (U32 i = 0; i < LL_DEFERRED_MULTI_LIGHT_COUNT; i++)
|
||||
{
|
||||
gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader";
|
||||
gDeferredMultiLightProgram.mShaderFiles.clear();
|
||||
gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
|
||||
success = gDeferredMultiLightProgram.createShader(NULL, NULL);
|
||||
if (success)
|
||||
{
|
||||
gDeferredMultiLightProgram[i].mName = llformat("Deferred MultiLight Shader %d", i);
|
||||
gDeferredMultiLightProgram[i].mShaderFiles.clear();
|
||||
gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredMultiLightProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredMultiLightProgram[i].addPermutation("LIGHT_COUNT", llformat("%d", i+1));
|
||||
success = gDeferredMultiLightProgram[i].createShader(NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (success)
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@
|
|||
#include "llshadermgr.h"
|
||||
#include "llmaterial.h"
|
||||
|
||||
#define LL_DEFERRED_MULTI_LIGHT_COUNT 16
|
||||
|
||||
class LLViewerShaderMgr: public LLShaderMgr
|
||||
{
|
||||
public:
|
||||
|
|
@ -341,7 +343,7 @@ extern LLGLSLShader gDeferredTerrainProgram;
|
|||
extern LLGLSLShader gDeferredTreeProgram;
|
||||
extern LLGLSLShader gDeferredTreeShadowProgram;
|
||||
extern LLGLSLShader gDeferredLightProgram;
|
||||
extern LLGLSLShader gDeferredMultiLightProgram;
|
||||
extern LLGLSLShader gDeferredMultiLightProgram[LL_DEFERRED_MULTI_LIGHT_COUNT];
|
||||
extern LLGLSLShader gDeferredSpotLightProgram;
|
||||
extern LLGLSLShader gDeferredMultiSpotLightProgram;
|
||||
extern LLGLSLShader gDeferredSunProgram;
|
||||
|
|
|
|||
|
|
@ -8681,10 +8681,6 @@ void LLPipeline::renderDeferredLighting()
|
|||
vert[2].set(3,1,0);
|
||||
|
||||
{
|
||||
bindDeferredShader(gDeferredMultiLightProgram);
|
||||
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
|
||||
LLGLDepthTest depth(GL_FALSE);
|
||||
|
||||
//full screen blit
|
||||
|
|
@ -8696,7 +8692,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
|
||||
U32 count = 0;
|
||||
|
||||
const U32 max_count = 8;
|
||||
const U32 max_count = LL_DEFERRED_MULTI_LIGHT_COUNT;
|
||||
LLVector4 light[max_count];
|
||||
LLVector4 col[max_count];
|
||||
|
||||
|
|
@ -8719,17 +8715,20 @@ void LLPipeline::renderDeferredLighting()
|
|||
count++;
|
||||
if (count == max_count || fullscreen_lights.empty())
|
||||
{
|
||||
gDeferredMultiLightProgram.uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count);
|
||||
gDeferredMultiLightProgram.uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat*) light);
|
||||
gDeferredMultiLightProgram.uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col);
|
||||
gDeferredMultiLightProgram.uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z);
|
||||
U32 idx = count-1;
|
||||
bindDeferredShader(gDeferredMultiLightProgram[idx]);
|
||||
gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count);
|
||||
gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat*) light);
|
||||
gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col);
|
||||
gDeferredMultiLightProgram[idx].uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z);
|
||||
far_z = 0.f;
|
||||
count = 0;
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
}
|
||||
}
|
||||
|
||||
unbindDeferredShader(gDeferredMultiLightProgram);
|
||||
unbindDeferredShader(gDeferredMultiLightProgram[0]);
|
||||
|
||||
bindDeferredShader(gDeferredMultiSpotLightProgram);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue