From 70c8c146bc3c3df6fd26cb371dc3333dbf12442c Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 15 Sep 2014 12:44:25 -0700 Subject: [PATCH] Fix for specular issue on Nvidia, try passing along material colors. --- interface/resources/shaders/model.vert | 4 ++-- interface/resources/shaders/model_normal_map.vert | 4 ++-- interface/resources/shaders/skin_model.vert | 4 ++-- interface/resources/shaders/skin_model_normal_map.vert | 4 ++-- interface/src/renderer/DeferredLightingEffect.cpp | 10 ++++++++-- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/interface/resources/shaders/model.vert b/interface/resources/shaders/model.vert index 091526fda3..6bcf7fbbe1 100644 --- a/interface/resources/shaders/model.vert +++ b/interface/resources/shaders/model.vert @@ -18,8 +18,8 @@ void main(void) { // transform and store the normal for interpolation normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); - // pass along the vertex color - gl_FrontColor = vec4(gl_Color.rgb, 0.0); + // pass along the diffuse color + gl_FrontColor = gl_FrontMaterial.diffuse; // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; diff --git a/interface/resources/shaders/model_normal_map.vert b/interface/resources/shaders/model_normal_map.vert index e65f2e70c4..937bdcaf33 100644 --- a/interface/resources/shaders/model_normal_map.vert +++ b/interface/resources/shaders/model_normal_map.vert @@ -25,8 +25,8 @@ void main(void) { interpolatedNormal = gl_ModelViewMatrix * vec4(gl_Normal, 0.0); interpolatedTangent = gl_ModelViewMatrix * vec4(tangent, 0.0); - // pass along the vertex color - gl_FrontColor = vec4(gl_Color.rgb, 0.0); + // pass along the diffuse color + gl_FrontColor = gl_FrontMaterial.diffuse; // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; diff --git a/interface/resources/shaders/skin_model.vert b/interface/resources/shaders/skin_model.vert index 5ab1029d2a..072bf3c336 100644 --- a/interface/resources/shaders/skin_model.vert +++ b/interface/resources/shaders/skin_model.vert @@ -34,8 +34,8 @@ void main(void) { normal = normalize(gl_ModelViewMatrix * normal); - // pass along the vertex color - gl_FrontColor = vec4(1.0, 1.0, 1.0, 0.0); + // pass along the diffuse color + gl_FrontColor = gl_FrontMaterial.diffuse; // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; diff --git a/interface/resources/shaders/skin_model_normal_map.vert b/interface/resources/shaders/skin_model_normal_map.vert index a8e33228a2..ac6c77f7cb 100644 --- a/interface/resources/shaders/skin_model_normal_map.vert +++ b/interface/resources/shaders/skin_model_normal_map.vert @@ -42,8 +42,8 @@ void main(void) { interpolatedNormal = gl_ModelViewMatrix * interpolatedNormal; interpolatedTangent = gl_ModelViewMatrix * interpolatedTangent; - // pass along the vertex color - gl_FrontColor = vec4(1.0, 1.0, 1.0, 0.0); + // pass along the diffuse color + gl_FrontColor = gl_FrontMaterial.diffuse; // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; diff --git a/interface/src/renderer/DeferredLightingEffect.cpp b/interface/src/renderer/DeferredLightingEffect.cpp index 559584157a..ec925c18e8 100644 --- a/interface/src/renderer/DeferredLightingEffect.cpp +++ b/interface/src/renderer/DeferredLightingEffect.cpp @@ -28,9 +28,15 @@ void DeferredLightingEffect::init() { void DeferredLightingEffect::prepare() { // clear the normal and specular buffers - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, true, true); + Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, true, false); glClear(GL_COLOR_BUFFER_BIT); - Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false); + Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, false, true); + // clearing to zero alpha for specular causes problems on my Nvidia card; clear to lowest non-zero value instead + const float MAX_SPECULAR_EXPONENT = 128.0f; + glClearColor(0.0f, 0.0f, 0.0f, 1.0f / MAX_SPECULAR_EXPONENT); + glClear(GL_COLOR_BUFFER_BIT); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true, false, false); } void DeferredLightingEffect::render() {