Initial (largely complete) gamma correct rendering implementation.

meow-7.2.2
Geenz 2013-01-11 06:37:21 -05:00
parent e8f6734d67
commit eda11a25a4
20 changed files with 152 additions and 29 deletions

View File

@ -498,9 +498,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>61ead113e6479452e6b690c84b4e9d30</string>
<string>481a87c5a964a4fa33b7411036d4c71d</string>
<key>url</key>
<string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2</string>
<string>file:///Users/geenz/Devel/3p-fmod/fmod-3.75-darwin-20120315.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -1062,9 +1062,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>a5b2dff0d97b643227a58473e5c57906</string>
<string>691008f5ec3cec2d7fc9d8814036d25b</string>
<key>url</key>
<string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/256978/arch/Darwin/installer/kdu-7.0.0-darwin-20120515.tar.bz2</string>
<string>file:///Users/geenz/Devel/kakadu/lib/Mac-x86-32-gcc/kdu.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -1343,6 +1343,58 @@
<key>version</key>
<string>0.2</string>
</map>
<key>llphysicsextensions_tpv</key>
<map>
<key>license</key>
<string>TEMPORARY</string>
<key>license_file</key>
<string>LICENSES/llphysicsextensions.txt</string>
<key>name</key>
<string>llphysicsextensions_tpv</string>
<key>platforms</key>
<map>
<key>darwin</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>51313d6a13b946b1b8dd14412057344c</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///Users/geenz/Devel/llphysicsextensions_tpv-0.3-darwin-20121227.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
</map>
<key>linux</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>3fba5443cb0b869005591b143fa48a42</string>
<key>url</key>
<string>file:///build/llPhysicsExtensions/llphysicsextensions_tpv-0.3-linux-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
</map>
<key>windows</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>1444bf3b1305a5e6909123d691991d4b</string>
<key>url</key>
<string>file:///c:/static/llphysicsextensions_tpv-0.3-windows-20120814.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
</map>
</map>
<key>version</key>
<string>0.3</string>
</map>
<key>llqtwebkit</key>
<map>
<key>license</key>

View File

@ -31,6 +31,7 @@
#include "v4color.h"
#include "llsd.h"
#include "llmaterialid.h"
#include "llmaterial.h"
// These bits are used while unpacking TEM messages to tell which aspects of
// the texture entry changed.
@ -197,6 +198,7 @@ protected:
U8 mMediaFlags; // replace with web page, movie, etc.
F32 mGlow;
LLMaterialID mMaterialID;
LLMaterialPtr mMaterial;
// Note the media data is not sent via the same message structure as the rest of the TE
LLMediaEntry* mMediaEntry; // The media data for the face

View File

@ -1121,6 +1121,9 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("lightMap");
mReservedUniforms.push_back("bloomMap");
mReservedUniforms.push_back("projectionMap");
mReservedUniforms.push_back("global_gamma");
mReservedUniforms.push_back("texture_gamma");
llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);

View File

@ -164,6 +164,10 @@ public:
DEFERRED_LIGHT,
DEFERRED_BLOOM,
DEFERRED_PROJECTION,
GLOBAL_GAMMA,
TEXTURE_GAMMA,
END_RESERVED_UNIFORMS
} eGLSLReservedUniforms;

View File

@ -59,6 +59,7 @@ void main()
vec4 pos = vec4(vary_position, 1.0);
vec4 diff= diffuseLookup(vary_texcoord0.xy);
diff.rgb = pow(diff.rgb, vec3(2.2));
vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a);
vec4 color = diff * col;

View File

@ -43,6 +43,7 @@ void main()
float shadow = 1.0;
vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
color.rgb = pow(color.rgb, vec3(2.2));
color.rgb = fullbrightAtmosTransport(color.rgb);

View File

@ -108,6 +108,7 @@ void main()
if (spec.a > 0.0)
{
float sa = dot(normalize(lv-normalize(pos)),norm);
spec.rgb += pow(1 - dot(-normalize(pos), norm), 2) * da * 3;
if (sa > 0.0)
{
sa = texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0);

View File

@ -37,6 +37,7 @@ uniform mat4 inv_proj;
uniform vec2 screen_res;
uniform float max_cof;
uniform float res_scale;
uniform float global_gamma;
VARYING vec2 vary_fragcoord;
@ -123,6 +124,6 @@ void main()
diff /= w;
}
diff.rgb = pow(diff.rgb, vec3(1.0/global_gamma));
frag_color = diff;
}

View File

@ -35,12 +35,13 @@ uniform sampler2DRect diffuseRect;
uniform sampler2D bloomMap;
uniform vec2 screen_res;
uniform float global_gamma;
VARYING vec2 vary_fragcoord;
void main()
{
vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
diff.rgb = pow(diff.rgb, vec3(1.0/global_gamma));
vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
frag_color = diff + bloom;
}

View File

@ -77,6 +77,11 @@ vec3 vary_AtmosAttenuation;
uniform mat4 inv_proj;
uniform vec2 screen_res;
vec3 samplesRGB(vec3 color)
{
return pow(color, vec3(2.2));
}
vec4 getPosition_d(vec2 pos_screen, float depth)
{
vec2 sc = pos_screen.xy*2.0;
@ -101,22 +106,21 @@ vec3 getPositionEye()
}
vec3 getSunlitColor()
{
return vary_SunlitColor;
return samplesRGB(vary_SunlitColor) * 4.4;
}
vec3 getAmblitColor()
{
return vary_AmblitColor;
return samplesRGB((vary_AmblitColor)) * 2.2;
}
vec3 getAdditiveColor()
{
return vary_AdditiveColor;
return samplesRGB(vary_AdditiveColor) * 2.2;
}
vec3 getAtmosAttenuation()
{
return vary_AtmosAttenuation;
}
void setPositionEye(vec3 v)
{
vary_PositionEye = v;
@ -310,7 +314,7 @@ void main()
//add environmentmap
vec3 env_vec = env_mat * refnormpersp;
col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,
col = mix(col.rgb, samplesRGB(textureCube(environmentMap, env_vec).rgb) * 2.2,
max(spec.a-diffuse.a*2.0, 0.0));
}

View File

@ -37,6 +37,8 @@ vec3 fullbrightScaleSoftClip(vec3 light);
VARYING vec4 vertex_color;
VARYING vec2 vary_texcoord0;
uniform float texture_gamma;
void fullbright_lighting()
{
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
@ -45,7 +47,7 @@ void fullbright_lighting()
{
discard;
}
color.rgb = pow(color.rgb, vec3(texture_gamma));
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);

View File

@ -149,6 +149,7 @@ void main()
}
vec4 diff = diffuseLookup(vary_texcoord0.xy);
diff.rgb = pow(diff.rgb, vec3(2.2));
vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a);
vec4 color = diff * col;

View File

@ -79,6 +79,11 @@ vec3 vary_AmblitColor;
vec3 vary_AdditiveColor;
vec3 vary_AtmosAttenuation;
vec3 samplesRGB(vec3 color)
{
return pow(color, vec3(2.2));
}
vec4 getPosition_d(vec2 pos_screen, float depth)
{
vec2 sc = pos_screen.xy*2.0;
@ -103,15 +108,15 @@ vec3 getPositionEye()
}
vec3 getSunlitColor()
{
return vary_SunlitColor;
return samplesRGB(vary_SunlitColor) * 4.4;
}
vec3 getAmblitColor()
{
return vary_AmblitColor;
return samplesRGB(vary_AmblitColor) * 2.2;
}
vec3 getAdditiveColor()
{
return vary_AdditiveColor;
return samplesRGB(vary_AdditiveColor) * 2.2;
}
vec3 getAtmosAttenuation()
{
@ -318,7 +323,7 @@ void main()
//add environmentmap
vec3 env_vec = env_mat * refnormpersp;
col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,
col = mix(col.rgb, samplesRGB(textureCube(environmentMap, env_vec).rgb) * 2.2,
max(spec.a-diffuse.a*2.0, 0.0));
}

View File

@ -27,7 +27,7 @@
VARYING vec3 vary_SunlitColor;
VARYING vec3 vary_AdditiveColor;
VARYING vec3 vary_AtmosAttenuation;
uniform float global_gamma;
vec3 getSunlitColor()
{
return vec3(0,0,0);
@ -38,7 +38,7 @@ vec3 getAmblitColor()
}
vec3 getAdditiveColor()
{
return vary_AdditiveColor;
return pow(vary_AdditiveColor, vec3(global_gamma)) * global_gamma;
}
vec3 getAtmosAttenuation()
{

View File

@ -33,18 +33,20 @@ vec3 sunlit_color;
vec3 amblit_color;
vec3 position_eye;
uniform float global_gamma;
vec3 getSunlitColor()
{
return sunlit_color;
return pow(sunlit_color, vec3(global_gamma)) * global_gamma;
}
vec3 getAmblitColor()
{
return amblit_color;
return pow(amblit_color, vec3(global_gamma)) * global_gamma;
}
vec3 getAdditiveColor()
{
return additive_color;
return pow(additive_color, vec3(global_gamma)) * global_gamma;
}
vec3 getAtmosAttenuation()
{

View File

@ -240,6 +240,12 @@ void LLDrawPoolAlpha::render(S32 pass)
{
fullbright_shader->bind();
fullbright_shader->setMinimumAlpha(0.33f);
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
{
fullbright_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
} else {
fullbright_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
}
}
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
//LLGLSLShader::bindNoShader();
@ -423,6 +429,17 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
if (use_shaders)
{
target_shader = fullbright_shader;
if (LLPipeline::sRenderDeferred)
{
if (params.mFace->getViewerObject()->isHUDAttachment())
{
target_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0);
} else {
target_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2);
}
} else {
target_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0);
}
}
else
{

View File

@ -1051,6 +1051,7 @@ void render_hud_attachments()
if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices())
{
LLPipeline::sRenderingHUDs = TRUE;
LLCamera hud_cam = *LLViewerCamera::getInstance();
LLVector3 origin = hud_cam.getOrigin();
hud_cam.setOrigin(-1.f,0,0);
@ -1124,6 +1125,7 @@ void render_hud_attachments()
gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI);
}
LLPipeline::sUseOcclusion = use_occlusion;
LLPipeline::sRenderingHUDs = FALSE;
}
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();

View File

@ -33,6 +33,7 @@
#include "llglslshader.h"
#include "lluictrlfactory.h"
#include "llsliderctrl.h"
#include "pipeline.h"
#include <llgl.h>
@ -127,6 +128,13 @@ void LLWLParamSet::update(LLGLSLShader * shader) const
}
}
}
if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender)
{
shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 2.2);
} else {
shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 1.0);
}
}
void LLWLParamSet::set(const std::string& paramName, float x)

View File

@ -377,6 +377,7 @@ BOOL LLPipeline::sRenderDeferred = FALSE;
BOOL LLPipeline::sMemAllocationThrottled = FALSE;
S32 LLPipeline::sVisibleLightCount = 0;
F32 LLPipeline::sMinRenderSize = 0.f;
BOOL LLPipeline::sRenderingHUDs;
static LLCullResult* sCull = NULL;
@ -396,7 +397,7 @@ void validate_framebuffer_object();
bool addDeferredAttachments(LLRenderTarget& target)
{
return target.addColorAttachment(GL_RGBA) && //specular
return target.addColorAttachment(GL_SRGB_ALPHA) && //specular
target.addColorAttachment(GL_RGB10_A2); //normal+z
}
@ -898,11 +899,11 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
BOOL ssao = RenderDeferredSSAO;
//allocate deferred rendering color buffers
if (!mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (!mDeferredScreen.allocate(resX, resY, GL_SRGB8_ALPHA8, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (!addDeferredAttachments(mDeferredScreen)) return false;
if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (!mScreen.allocate(resX, resY, GL_RGBA12, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
if (samples > 0)
{
if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
@ -3602,8 +3603,8 @@ void LLPipeline::postSort(LLCamera& camera)
for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
{
LLSpatialGroup* group = *i;
if (sUseOcclusion &&
group->isOcclusionState(LLSpatialGroup::OCCLUDED) ||
if ((sUseOcclusion &&
group->isOcclusionState(LLSpatialGroup::OCCLUDED)) ||
(RenderAutoHideSurfaceAreaLimit > 0.f &&
group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit*llmax(group->mObjectBoxSize, 10.f)))
{
@ -5034,8 +5035,8 @@ void LLPipeline::renderDebug()
LLSpatialPartition* part = region->getSpatialPartition(i);
if (part)
{
if ( hud_only && (part->mDrawableType == RENDER_TYPE_HUD || part->mDrawableType == RENDER_TYPE_HUD_PARTICLES) ||
!hud_only && hasRenderType(part->mDrawableType) )
if ( (hud_only && (part->mDrawableType == RENDER_TYPE_HUD || part->mDrawableType == RENDER_TYPE_HUD_PARTICLES)) ||
(!hud_only && hasRenderType(part->mDrawableType)) )
{
part->renderDebug();
}
@ -7382,6 +7383,13 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
mScreen.bindTexture(0, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
}
if (!LLViewerCamera::getInstance()->cameraUnderWater())
{
shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 2.2);
} else {
shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 1.0);
}
shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
@ -7423,6 +7431,13 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
{
mScreen.bindTexture(0, channel);
}
if (!LLViewerCamera::getInstance()->cameraUnderWater())
{
shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 2.2);
} else {
shader->uniform1f(LLShaderMgr::GLOBAL_GAMMA, 1.0);
}
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);

View File

@ -554,7 +554,8 @@ public:
static BOOL sRenderDeferred;
static BOOL sMemAllocationThrottled;
static S32 sVisibleLightCount;
static F32 sMinRenderSize;
static F32 sMinRenderSize;
static BOOL sRenderingHUDs;
//screen texture
U32 mScreenWidth;