merge up to integration repo

meow-7.2.2
Oz Linden 2013-07-08 12:06:28 -04:00
commit c2817b0d53
20 changed files with 359 additions and 260 deletions

View File

@ -61,6 +61,7 @@ VARYING vec3 vary_directional;
VARYING vec3 vary_fragcoord;
VARYING vec3 vary_position;
VARYING vec3 vary_pointlight_col;
VARYING vec3 vary_pointlight_col_linear;
VARYING vec2 vary_texcoord0;
VARYING vec3 vary_norm;
@ -135,6 +136,26 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc)
}
#endif
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
void main()
{
@ -208,6 +229,7 @@ void main()
{
shadow = 1.0;
}
#endif
#ifdef USE_INDEXED_TEX
@ -217,7 +239,7 @@ void main()
#endif
vec4 gamma_diff = diff;
diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f));
diff.rgb = srgb_to_linear(diff.rgb);
#ifdef USE_VERTEX_COLOR
float vertex_color_alpha = vertex_color.a;
@ -243,9 +265,8 @@ void main()
color.rgb = scaleSoftClip(color.rgb);
color.rgb = pow(color.rgb, vec3(2.2));
color.rgb = srgb_to_linear(color.rgb);
col = vec4(0,0,0,0);
#define LIGHT_LOOP(i) col.rgb += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, normal, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z);
@ -257,9 +278,9 @@ void main()
LIGHT_LOOP(6)
LIGHT_LOOP(7)
color.rgb += diff.rgb * pow(vary_pointlight_col, vec3(2.2)) * col.rgb;
color.rgb += diff.rgb * vary_pointlight_col_linear * col.rgb;
color.rgb = pow(color.rgb, vec3(1.0/2.2));
color.rgb = linear_to_srgb(color.rgb);
frag_color = color;
}

View File

@ -68,6 +68,7 @@ VARYING vec3 vary_directional;
VARYING vec3 vary_fragcoord;
VARYING vec3 vary_position;
VARYING vec3 vary_pointlight_col;
VARYING vec3 vary_pointlight_col_linear;
#ifdef USE_VERTEX_COLOR
VARYING vec4 vertex_color;
@ -86,6 +87,16 @@ uniform vec3 light_diffuse[8];
uniform vec3 sun_dir;
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
@ -178,10 +189,8 @@ void main()
vec3 diff = diffuse_color.rgb;
vary_pointlight_col = diff;
vary_pointlight_col_linear = srgb_to_linear(diff);
col.rgb = vec3(0,0,0);

View File

@ -0,0 +1,90 @@
/**
* @file fullbrightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2007, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#extension GL_ARB_texture_rectangle : enable
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
#else
#define frag_color gl_FragColor
#endif
#if !HAS_DIFFUSE_LOOKUP
uniform sampler2D diffuseMap;
#endif
VARYING vec4 vertex_color;
VARYING vec2 vary_texcoord0;
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
uniform float minimum_alpha;
void main()
{
#if HAS_DIFFUSE_LOOKUP
vec4 color = diffuseLookup(vary_texcoord0.xy);
#else
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
#endif
if (color.a < minimum_alpha)
{
discard;
}
color.rgb = srgb_to_linear(color.rgb);
color.rgb *= vertex_color.rgb;
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);
color.rgb = linear_to_srgb(color.rgb);
frag_color.rgb = color.rgb;
frag_color.a = color.a;
}

View File

@ -41,23 +41,43 @@ VARYING vec2 vary_texcoord0;
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
void main()
{
#if HAS_DIFFUSE_LOOKUP
vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
vec4 color = diffuseLookup(vary_texcoord0.xy);
#else
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy)*vertex_color;
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
#endif
color.rgb = pow(color.rgb,vec3(2.2f,2.2f,2.2f));
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = srgb_to_linear(color.rgb);
color.rgb *= vertex_color.rgb;
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);
color.rgb = pow(color.rgb, vec3(1.0/2.2));
color.rgb = linear_to_srgb(color.rgb);
frag_color = color;
frag_color.rgb = color.rgb;
frag_color.a = color.a;
}

View File

@ -30,6 +30,28 @@
uniform float emissive_brightness;
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
#ifdef DEFINE_GL_FRAGCOLOR
@ -459,7 +481,7 @@ void main()
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
vec3 old_diffcol = diffcol.rgb;
diffcol.rgb = pow(diffcol.rgb, vec3(2.2));
diffcol.rgb = srgb_to_linear(diffcol.rgb);
#endif
#if HAS_SPECULAR_MAP
@ -648,7 +670,7 @@ void main()
col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a);
//convert to linear space before adding local lights
col = pow(col, vec3(2.2));
col = srgb_to_linear(col);
vec3 npos = normalize(-pos.xyz);
@ -665,7 +687,7 @@ void main()
//convert to gamma space for display on screen
col.rgb = pow(col.rgb, vec3(1.0/2.2));
col.rgb = linear_to_srgb(col.rgb);
frag_color.rgb = col.rgb;
glare = min(glare, 1.0);

View File

@ -99,6 +99,7 @@ void main()
norm = normalize(norm);
vec4 spec = texture2DRect(specularRect, frag.xy);
vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
float noise = texture2D(noiseMap, frag.xy/128.0).b;
vec3 out_col = vec3(0,0,0);
vec3 npos = normalize(-pos);
@ -157,6 +158,7 @@ void main()
}
}
frag_color.rgb = out_col;
frag_color.a = 0.0;
}

View File

@ -84,15 +84,30 @@ vec3 decode_normal (vec2 enc)
return n;
}
vec4 correctWithGamma(vec4 col)
vec3 srgb_to_linear(vec3 cs)
{
return vec4(pow(col.rgb, vec3(2.2)), col.a);
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
ret = correctWithGamma(ret);
ret.rgb = srgb_to_linear(ret.rgb);
vec2 dist = tc-vec2(0.5);
@ -108,7 +123,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
ret = correctWithGamma(ret);
ret.rgb = srgb_to_linear(ret.rgb);
vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
@ -126,7 +141,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
{
vec4 ret = texture2DLod(projectionMap, tc, lod);
ret = correctWithGamma(ret);
ret.rgb = srgb_to_linear(ret.rgb);
vec2 dist = tc-vec2(0.5);

View File

@ -38,9 +38,20 @@ VARYING vec2 vary_fragcoord;
uniform float texture_gamma;
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
void main()
{
vec4 diff = texture2DRect(diffuseRect, vary_fragcoord);
frag_color = pow(diff, vec4(texture_gamma, texture_gamma, texture_gamma, 1.0f));
diff.rgb = linear_to_srgb(diff.rgb);
frag_color = diff;
}

View File

@ -78,6 +78,28 @@ vec3 vary_AtmosAttenuation;
uniform mat4 inv_proj;
uniform vec2 screen_res;
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
vec3 decode_normal (vec2 enc)
{
vec2 fenc = enc*4-2;
@ -313,7 +335,7 @@ void main()
vec4 diffuse = texture2DRect(diffuseRect, tc);
//convert to gamma space
diffuse.rgb = pow(diffuse.rgb, vec3(1.0/2.2));
diffuse.rgb = linear_to_srgb(diffuse.rgb);
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
vec3 col;
@ -369,7 +391,7 @@ void main()
col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a);
}
col = pow(col, vec3(2.2));
col = srgb_to_linear(col);
//col = vec3(1,0,1);
//col.g = envIntensity;

View File

@ -82,9 +82,29 @@ vec3 decode_normal (vec2 enc)
return n;
}
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
vec4 correctWithGamma(vec4 col)
{
return vec4(pow(col.rgb, vec3(2.2)), col.a);
return vec4(srgb_to_linear(col.rgb), col.a);
}
vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)

View File

@ -85,7 +85,7 @@ void main()
pos.w = 1.0;
pos = modelview_matrix*pos;
calcAtmospherics(view.xyz);
calcAtmospherics(pos.xyz);
//pass wave parameters to pixel shader
vec2 bigWave = (v.xy) * vec2(0.04,0.04) + d1 * time * 0.055;

View File

@ -1,224 +0,0 @@
/**
* @file alphaV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2007, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
uniform mat3 normal_matrix;
uniform mat4 texture_matrix0;
uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;
uniform mat4 modelview_projection_matrix;
ATTRIBUTE vec3 position;
#ifdef USE_INDEXED_TEX
void passTextureIndex();
#endif
ATTRIBUTE vec3 normal;
#ifdef USE_VERTEX_COLOR
ATTRIBUTE vec4 diffuse_color;
#endif
ATTRIBUTE vec2 texcoord0;
#ifdef HAS_SKIN
mat4 getObjectSkinnedTransform();
#else
#ifdef IS_AVATAR_SKIN
mat4 getSkinnedTransform();
#endif
#endif
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
vec3 calcDirectionalLight(vec3 n, vec3 l);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
VARYING vec3 vary_ambient;
VARYING vec3 vary_directional;
VARYING vec3 vary_fragcoord;
VARYING vec3 vary_position;
VARYING vec3 vary_pointlight_col;
#ifdef USE_VERTEX_COLOR
VARYING vec4 vertex_color;
#endif
VARYING vec2 vary_texcoord0;
VARYING vec3 vary_norm;
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
uniform vec4 light_position[8];
uniform vec3 light_direction[8];
uniform vec3 light_attenuation[8];
uniform vec3 light_diffuse[8];
uniform vec3 sun_dir;
vec3 calcDirectionalLight(vec3 n, vec3 l)
{
float a = max(dot(n,l),0.0);
return vec3(a,a,a);
}
vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
lv = normalize(lv);
//distance attenuation
float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
float spot = max(dot(-ln, lv), is_pointlight);
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
da *= max(dot(n, lv), 0.0);
}
return vec3(da,da,da);
}
void main()
{
vec4 pos;
vec3 norm;
//transform vertex
#ifdef HAS_SKIN
mat4 trans = getObjectSkinnedTransform();
trans = modelview_matrix * trans;
pos = trans * vec4(position.xyz, 1.0);
norm = position.xyz + normal.xyz;
norm = normalize((trans * vec4(norm, 1.0)).xyz - pos.xyz);
vec4 frag_pos = projection_matrix * pos;
gl_Position = frag_pos;
#else
#ifdef IS_AVATAR_SKIN
mat4 trans = getSkinnedTransform();
vec4 pos_in = vec4(position.xyz, 1.0);
pos.x = dot(trans[0], pos_in);
pos.y = dot(trans[1], pos_in);
pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
norm.x = dot(trans[0].xyz, normal);
norm.y = dot(trans[1].xyz, normal);
norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
vec4 frag_pos = projection_matrix * pos;
gl_Position = frag_pos;
#else
norm = normalize(normal_matrix * normal);
vec4 vert = vec4(position.xyz, 1.0);
pos = (modelview_matrix * vert);
gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
#endif
#endif
#ifdef USE_INDEXED_TEX
passTextureIndex();
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
#else
vary_texcoord0 = texcoord0;
#endif
vary_norm = norm;
float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
#ifndef USE_VERTEX_COLOR
vec4 diffuse_color = vec4(1,1,1,1);
#endif
//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
vec3 dff = pow(diffuse_color.rgb, vec3(2.2f,2.2f,2.2f));
vary_pointlight_col = dff;
col.rgb = vec3(0,0,0);
// Add windlight lights
col.rgb = atmosAmbient(col.rgb);
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
ambient *= 0.5;
ambient *= ambient;
ambient = (1.0-ambient);
col.rgb *= ambient;
vary_directional.rgb = atmosAffectDirectionalLight(1.0f);
vary_ambient = col.rgb*dff;
col.rgb = col.rgb*dff;
#ifdef USE_VERTEX_COLOR
vertex_color = col;
#endif
#ifdef HAS_SKIN
vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
#else
#ifdef IS_AVATAR_SKIN
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
#else
pos = modelview_projection_matrix * vert;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
#endif
#endif
}

View File

@ -85,9 +85,19 @@ vec3 decode_normal (vec2 enc)
return n;
}
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec4 correctWithGamma(vec4 col)
{
return vec4(pow(col.rgb, vec3(2.2)), col.a);
return vec4(srgb_to_linear(col.rgb), col.a);
}

View File

@ -78,6 +78,26 @@ vec3 vary_AtmosAttenuation;
uniform mat4 inv_proj;
uniform vec2 screen_res;
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec3 linear_to_srgb(vec3 cl)
{
/*{ 0.0, 0 <= cl
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1*/
return 1.055 * pow(cl, vec3(0.41666)) - 0.055;
}
vec2 encode_normal(vec3 n)
{
float f = sqrt(8 * n.z + 8);
@ -326,7 +346,7 @@ void main()
vec4 diffuse = texture2DRect(diffuseRect, tc);
//convert to gamma space
diffuse.rgb = pow(diffuse.rgb, vec3(1.0/2.2));
diffuse.rgb = linear_to_srgb(diffuse.rgb);
vec3 col;
float bloom = 0.0;
@ -392,7 +412,7 @@ void main()
col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a);
}
col = pow(col, vec3(2.2));
col = srgb_to_linear(col);
//col = vec3(1,0,1);
//col.g = envIntensity;

View File

@ -85,9 +85,19 @@ vec3 decode_normal (vec2 enc)
return n;
}
vec3 srgb_to_linear(vec3 cs)
{
/* { cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045*/
return pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));
}
vec4 correctWithGamma(vec4 col)
{
return vec4(pow(col.rgb, vec3(2.2)), col.a);
return vec4(srgb_to_linear(col.rgb), col.a);
}
vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)

View File

@ -527,6 +527,8 @@ void LLDrawable::makeStatic(BOOL warning_enabled)
}
updatePartition();
}
llassert(isAvatar() || isRoot() || mParent->isStatic());
}
// Returns "distance" between target destination and resulting xfrom

View File

@ -625,14 +625,16 @@ S32 LLDrawPoolFullbright::getNumPasses()
void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass)
{
gObjectFullbrightAlphaMaskProgram.bind();
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
{
gObjectFullbrightAlphaMaskProgram.bind();
gObjectFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
}
else
{
gObjectFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
gDeferredFullbrightAlphaMaskProgram.bind();
gDeferredFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
}
}
@ -646,7 +648,14 @@ void LLDrawPoolFullbrightAlphaMask::renderPostDeferred(S32 pass)
void LLDrawPoolFullbrightAlphaMask::endPostDeferredPass(S32 pass)
{
gObjectFullbrightAlphaMaskProgram.unbind();
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
{
gObjectFullbrightAlphaMaskProgram.unbind();
}
else
{
gDeferredFullbrightAlphaMaskProgram.unbind();
}
LLRenderPass::endRenderPass(pass);
}

View File

@ -197,6 +197,7 @@ LLGLSLShader gDeferredAttachmentShadowProgram;
LLGLSLShader gDeferredAlphaProgram;
LLGLSLShader gDeferredAvatarEyesProgram;
LLGLSLShader gDeferredFullbrightProgram;
LLGLSLShader gDeferredFullbrightAlphaMaskProgram;
LLGLSLShader gDeferredEmissiveProgram;
LLGLSLShader gDeferredPostProgram;
LLGLSLShader gDeferredCoFProgram;
@ -290,6 +291,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gDeferredAlphaProgram);
mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
mShaderList.push_back(&gDeferredFullbrightProgram);
mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram);
mShaderList.push_back(&gDeferredFullbrightShinyProgram);
mShaderList.push_back(&gDeferredSkinnedFullbrightShinyProgram);
mShaderList.push_back(&gDeferredSkinnedFullbrightProgram);
@ -1130,6 +1132,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.unload();
gDeferredAlphaProgram.unload();
gDeferredFullbrightProgram.unload();
gDeferredFullbrightAlphaMaskProgram.unload();
gDeferredEmissiveProgram.unload();
gDeferredAvatarEyesProgram.unload();
gDeferredPostProgram.unload();
@ -1493,6 +1496,20 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
success = gDeferredFullbrightProgram.createShader(NULL, NULL);
}
if (success)
{
gDeferredFullbrightAlphaMaskProgram.mName = "Deferred Fullbright Alpha Mask Shader";
gDeferredFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
gDeferredFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;
gDeferredFullbrightAlphaMaskProgram.mFeatures.hasTransport = true;
gDeferredFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredFullbrightAlphaMaskProgram.mShaderFiles.clear();
gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredFullbrightAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredFullbrightAlphaMaskProgram.createShader(NULL, NULL);
}
if (success)
{
gDeferredFullbrightShinyProgram.mName = "Deferred FullbrightShiny Shader";

View File

@ -363,6 +363,7 @@ extern LLGLSLShader gDeferredAvatarShadowProgram;
extern LLGLSLShader gDeferredAttachmentShadowProgram;
extern LLGLSLShader gDeferredAlphaProgram;
extern LLGLSLShader gDeferredFullbrightProgram;
extern LLGLSLShader gDeferredFullbrightAlphaMaskProgram;
extern LLGLSLShader gDeferredEmissiveProgram;
extern LLGLSLShader gDeferredAvatarEyesProgram;
extern LLGLSLShader gDeferredAvatarAlphaProgram;

View File

@ -3724,8 +3724,30 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
{
LLFace* face = mDrawable->getFace(face_hit);
bool ignore_alpha = false;
const LLTextureEntry* te = face->getTextureEntry();
if (te)
{
LLMaterial* mat = te->getMaterialParams();
if (mat)
{
U8 mode = mat->getDiffuseAlphaMode();
if (mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE ||
mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE)
{
ignore_alpha = true;
}
}
}
if (face &&
(pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))))
(ignore_alpha ||
pick_transparent ||
!face->getTexture() ||
!face->getTexture()->hasGLTexture() ||
face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))))
{
local_end = p;
if (face_hitp != NULL)