From 53933fc9c6316462dff39602e14b1462d6485bb0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 12 Sep 2014 17:09:07 -0700 Subject: [PATCH] Working on deferred lighting for models. --- interface/resources/shaders/model.frag | 36 +-- interface/resources/shaders/model.vert | 12 - .../shaders/model_cascaded_shadow_map.frag | 71 ---- .../model_cascaded_shadow_normal_map.frag | 84 ----- ...l_cascaded_shadow_normal_specular_map.frag | 87 ----- .../model_cascaded_shadow_specular_map.frag | 74 ----- .../resources/shaders/model_normal_map.frag | 38 +-- .../resources/shaders/model_normal_map.vert | 11 +- .../shaders/model_normal_specular_map.frag | 39 +-- .../resources/shaders/model_shadow_map.frag | 63 ---- .../shaders/model_shadow_normal_map.frag | 75 ----- .../model_shadow_normal_specular_map.frag | 78 ----- .../shaders/model_shadow_specular_map.frag | 66 ---- .../resources/shaders/model_specular_map.frag | 38 +-- interface/resources/shaders/skin_model.vert | 11 +- .../shaders/skin_model_normal_map.vert | 12 +- interface/src/Application.cpp | 16 +- interface/src/Menu.cpp | 1 - interface/src/Menu.h | 1 - interface/src/avatar/Avatar.cpp | 5 +- interface/src/avatar/Head.cpp | 3 +- interface/src/avatar/MyAvatar.cpp | 5 +- interface/src/renderer/Model.cpp | 305 ++---------------- interface/src/renderer/Model.h | 58 +--- 24 files changed, 68 insertions(+), 1121 deletions(-) delete mode 100644 interface/resources/shaders/model_cascaded_shadow_map.frag delete mode 100644 interface/resources/shaders/model_cascaded_shadow_normal_map.frag delete mode 100644 interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag delete mode 100644 interface/resources/shaders/model_cascaded_shadow_specular_map.frag delete mode 100644 interface/resources/shaders/model_shadow_map.frag delete mode 100644 interface/resources/shaders/model_shadow_normal_map.frag delete mode 100644 interface/resources/shaders/model_shadow_normal_specular_map.frag delete mode 100644 interface/resources/shaders/model_shadow_specular_map.frag diff --git a/interface/resources/shaders/model.frag b/interface/resources/shaders/model.frag index d8e1efab14..70949c48b4 100644 --- a/interface/resources/shaders/model.frag +++ b/interface/resources/shaders/model.frag @@ -11,43 +11,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - // the diffuse texture uniform sampler2D diffuseMap; -// the interpolated position -varying vec4 position; - // the interpolated normal varying vec4 normal; void main(void) { - // add up the local lights - vec4 normalizedNormal = normalize(normal); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(normalizedNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(normalizedNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), - normalizedNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + - vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); + // set the diffuse, normal, specular data + gl_FragData[0] = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].st); + gl_FragData[1] = normalize(normal) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[2] = vec4(gl_FrontMaterial.specular.rgb, gl_FrontMaterial.shininess / 255.0); } diff --git a/interface/resources/shaders/model.vert b/interface/resources/shaders/model.vert index 13eee2fa3d..4e7de7723d 100644 --- a/interface/resources/shaders/model.vert +++ b/interface/resources/shaders/model.vert @@ -11,31 +11,19 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -const int MAX_LOCAL_LIGHTS = 4; - -// the interpolated position -varying vec4 position; - // the interpolated normal varying vec4 normal; void main(void) { - // transform and store the normal for interpolation normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); - // likewise with the position - position = gl_ModelViewMatrix * gl_Vertex; - // pass along the vertex color gl_FrontColor = gl_Color; // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; - // and the shadow texture coordinates - gl_TexCoord[1] = vec4(dot(gl_EyePlaneS[0], position), dot(gl_EyePlaneT[0], position), dot(gl_EyePlaneR[0], position), 1.0); - // use standard pipeline transform gl_Position = ftransform(); } diff --git a/interface/resources/shaders/model_cascaded_shadow_map.frag b/interface/resources/shaders/model_cascaded_shadow_map.frag deleted file mode 100644 index 63500e7e2a..0000000000 --- a/interface/resources/shaders/model_cascaded_shadow_map.frag +++ /dev/null @@ -1,71 +0,0 @@ -#version 120 - -// -// model_cascaded_shadow_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/29/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the distances to the cascade sections -uniform vec3 shadowDistances; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position -varying vec4 position; - -// the interpolated normal -varying vec4 normal; - -void main(void) { - // compute the index of the cascade to use and the corresponding texture coordinates - int shadowIndex = int(dot(step(vec3(position.z), shadowDistances), vec3(1.0, 1.0, 1.0))); - vec3 shadowTexCoord = vec3(dot(gl_EyePlaneS[shadowIndex], position), dot(gl_EyePlaneT[shadowIndex], position), - dot(gl_EyePlaneR[shadowIndex], position)); - - // add up the local lights - vec4 normalizedNormal = normalize(normal); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(normalizedNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(normalizedNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, shadowTexCoord + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), - normalizedNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + - vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); -} diff --git a/interface/resources/shaders/model_cascaded_shadow_normal_map.frag b/interface/resources/shaders/model_cascaded_shadow_normal_map.frag deleted file mode 100644 index 1fef1ef82a..0000000000 --- a/interface/resources/shaders/model_cascaded_shadow_normal_map.frag +++ /dev/null @@ -1,84 +0,0 @@ -#version 120 - -// -// model_cascaded_shadow_normal_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/29/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the normal map texture -uniform sampler2D normalMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the distances to the cascade sections -uniform vec3 shadowDistances; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position -varying vec4 interpolatedPosition; - -// the interpolated normal -varying vec4 interpolatedNormal; - -// the interpolated tangent -varying vec4 interpolatedTangent; - -void main(void) { - vec3 normalizedNormal = normalize(vec3(interpolatedNormal)); - vec3 normalizedTangent = normalize(vec3(interpolatedTangent)); - vec3 normalizedBitangent = normalize(cross(normalizedNormal, normalizedTangent)); - vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) * 2.0 - vec3(1.0, 1.0, 1.0); - - // compute the index of the cascade to use and the corresponding texture coordinates - int shadowIndex = int(dot(step(vec3(interpolatedPosition.z), shadowDistances), vec3(1.0, 1.0, 1.0))); - vec3 shadowTexCoord = vec3(dot(gl_EyePlaneS[shadowIndex], interpolatedPosition), - dot(gl_EyePlaneT[shadowIndex], interpolatedPosition), - dot(gl_EyePlaneR[shadowIndex], interpolatedPosition)); - - // add up the local lights - vec4 viewNormal = vec4(normalizedTangent * localNormal.x + - normalizedBitangent * localNormal.y + normalizedNormal * localNormal.z, 0.0); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(viewNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(viewNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, shadowTexCoord + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - - normalize(vec4(vec3(interpolatedPosition), 0.0))), viewNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + - vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); -} diff --git a/interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag b/interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag deleted file mode 100644 index f0751bcca9..0000000000 --- a/interface/resources/shaders/model_cascaded_shadow_normal_specular_map.frag +++ /dev/null @@ -1,87 +0,0 @@ -#version 120 - -// -// model_cascaded_shadow_normal_specular_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/29/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the normal map texture -uniform sampler2D normalMap; - -// the specular map texture -uniform sampler2D specularMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the distances to the cascade sections -uniform vec3 shadowDistances; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position -varying vec4 interpolatedPosition; - -// the interpolated normal -varying vec4 interpolatedNormal; - -// the interpolated tangent -varying vec4 interpolatedTangent; - -void main(void) { - vec3 normalizedNormal = normalize(vec3(interpolatedNormal)); - vec3 normalizedTangent = normalize(vec3(interpolatedTangent)); - vec3 normalizedBitangent = normalize(cross(normalizedNormal, normalizedTangent)); - vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) * 2.0 - vec3(1.0, 1.0, 1.0); - - // compute the index of the cascade to use and the corresponding texture coordinates - int shadowIndex = int(dot(step(vec3(interpolatedPosition.z), shadowDistances), vec3(1.0, 1.0, 1.0))); - vec3 shadowTexCoord = vec3(dot(gl_EyePlaneS[shadowIndex], interpolatedPosition), - dot(gl_EyePlaneT[shadowIndex], interpolatedPosition), - dot(gl_EyePlaneR[shadowIndex], interpolatedPosition)); - - // add up the local lights - vec4 viewNormal = vec4(normalizedTangent * localNormal.x + - normalizedBitangent * localNormal.y + normalizedNormal * localNormal.z, 0.0); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(viewNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(viewNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, shadowTexCoord + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, shadowTexCoord + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - - normalize(vec4(interpolatedPosition.xyz, 0.0))), viewNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); -} diff --git a/interface/resources/shaders/model_cascaded_shadow_specular_map.frag b/interface/resources/shaders/model_cascaded_shadow_specular_map.frag deleted file mode 100644 index b2881e6c13..0000000000 --- a/interface/resources/shaders/model_cascaded_shadow_specular_map.frag +++ /dev/null @@ -1,74 +0,0 @@ -#version 120 - -// -// model_cascaded_shadow_specular_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/29/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the specular texture -uniform sampler2D specularMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the distances to the cascade sections -uniform vec3 shadowDistances; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position in view space -varying vec4 position; - -// the interpolated normal -varying vec4 normal; - -void main(void) { - // compute the index of the cascade to use and the corresponding texture coordinates - int shadowIndex = int(dot(step(vec3(position.z), shadowDistances), vec3(1.0, 1.0, 1.0))); - vec3 shadowTexCoord = vec3(dot(gl_EyePlaneS[shadowIndex], position), dot(gl_EyePlaneT[shadowIndex], position), - dot(gl_EyePlaneR[shadowIndex], position)); - - // add up the local lights - vec4 normalizedNormal = normalize(normal); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(normalizedNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(normalizedNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), - normalizedNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); -} diff --git a/interface/resources/shaders/model_normal_map.frag b/interface/resources/shaders/model_normal_map.frag index 73d2fc0ef6..5ec3513fb5 100644 --- a/interface/resources/shaders/model_normal_map.frag +++ b/interface/resources/shaders/model_normal_map.frag @@ -11,24 +11,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - // the diffuse texture uniform sampler2D diffuseMap; // the normal map texture uniform sampler2D normalMap; -// the interpolated position -varying vec4 interpolatedPosition; - // the interpolated normal varying vec4 interpolatedNormal; @@ -36,30 +24,16 @@ varying vec4 interpolatedNormal; varying vec4 interpolatedTangent; void main(void) { + // compute the view normal from the various bits vec3 normalizedNormal = normalize(vec3(interpolatedNormal)); vec3 normalizedTangent = normalize(vec3(interpolatedTangent)); vec3 normalizedBitangent = normalize(cross(normalizedNormal, normalizedTangent)); - vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) * 2.0 - vec3(1.0, 1.0, 1.0); - - // add up the local lights + vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) - vec3(0.5, 0.5, 0.5); vec4 viewNormal = vec4(normalizedTangent * localNormal.x + normalizedBitangent * localNormal.y + normalizedNormal * localNormal.z, 0.0); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(viewNormal, localLightDirections[i])); - } - // compute the base color based on OpenGL lighting model - float diffuse = dot(viewNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - - normalize(vec4(vec3(interpolatedPosition), 0.0))), viewNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + - vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); + // set the diffuse, normal, specular data + gl_FragData[0] = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].st); + gl_FragData[1] = viewNormal + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[2] = vec4(gl_FrontMaterial.specular.rgb, gl_FrontMaterial.shininess / 255.0); } diff --git a/interface/resources/shaders/model_normal_map.vert b/interface/resources/shaders/model_normal_map.vert index 2a2f4156f0..add76d5588 100644 --- a/interface/resources/shaders/model_normal_map.vert +++ b/interface/resources/shaders/model_normal_map.vert @@ -14,9 +14,6 @@ // the tangent vector attribute vec3 tangent; -// the interpolated position -varying vec4 interpolatedPosition; - // the interpolated normal varying vec4 interpolatedNormal; @@ -24,9 +21,7 @@ varying vec4 interpolatedNormal; varying vec4 interpolatedTangent; void main(void) { - - // transform and store the position, normal and tangent for interpolation - interpolatedPosition = gl_ModelViewMatrix * gl_Vertex; + // transform and store the normal and tangent for interpolation interpolatedNormal = gl_ModelViewMatrix * vec4(gl_Normal, 0.0); interpolatedTangent = gl_ModelViewMatrix * vec4(tangent, 0.0); @@ -36,10 +31,6 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; - // and the shadow texture coordinates - gl_TexCoord[1] = vec4(dot(gl_EyePlaneS[0], interpolatedPosition), dot(gl_EyePlaneT[0], interpolatedPosition), - dot(gl_EyePlaneR[0], interpolatedPosition), 1.0); - // use standard pipeline transform gl_Position = ftransform(); } diff --git a/interface/resources/shaders/model_normal_specular_map.frag b/interface/resources/shaders/model_normal_specular_map.frag index 5eb804292c..d43d69d1e6 100644 --- a/interface/resources/shaders/model_normal_specular_map.frag +++ b/interface/resources/shaders/model_normal_specular_map.frag @@ -11,15 +11,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - // the diffuse texture uniform sampler2D diffuseMap; @@ -29,9 +20,6 @@ uniform sampler2D normalMap; // the specular map texture uniform sampler2D specularMap; -// the interpolated position -varying vec4 interpolatedPosition; - // the interpolated normal varying vec4 interpolatedNormal; @@ -39,30 +27,17 @@ varying vec4 interpolatedNormal; varying vec4 interpolatedTangent; void main(void) { + // compute the view normal from the various bits vec3 normalizedNormal = normalize(vec3(interpolatedNormal)); vec3 normalizedTangent = normalize(vec3(interpolatedTangent)); vec3 normalizedBitangent = normalize(cross(normalizedNormal, normalizedTangent)); - vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) * 2.0 - vec3(1.0, 1.0, 1.0); - - // add up the local lights + vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) - vec3(0.5, 0.5, 0.5); vec4 viewNormal = vec4(normalizedTangent * localNormal.x + normalizedBitangent * localNormal.y + normalizedNormal * localNormal.z, 0.0); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(viewNormal, localLightDirections[i])); - } - // compute the base color based on OpenGL lighting model - float diffuse = dot(viewNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - - normalize(vec4(interpolatedPosition.xyz, 0.0))), viewNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); + // set the diffuse, normal, specular data + gl_FragData[0] = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].st); + gl_FragData[1] = viewNormal + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[2] = vec4(gl_FrontMaterial.specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, + gl_FrontMaterial.shininess / 255.0); } diff --git a/interface/resources/shaders/model_shadow_map.frag b/interface/resources/shaders/model_shadow_map.frag deleted file mode 100644 index 807a9d162f..0000000000 --- a/interface/resources/shaders/model_shadow_map.frag +++ /dev/null @@ -1,63 +0,0 @@ -#version 120 - -// -// model_shadow_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/23/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position -varying vec4 position; - -// the interpolated normal -varying vec4 normal; - -void main(void) { - // add up the local lights - vec4 normalizedNormal = normalize(normal); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(normalizedNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(normalizedNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), - normalizedNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + - vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); -} diff --git a/interface/resources/shaders/model_shadow_normal_map.frag b/interface/resources/shaders/model_shadow_normal_map.frag deleted file mode 100644 index 454b88dd23..0000000000 --- a/interface/resources/shaders/model_shadow_normal_map.frag +++ /dev/null @@ -1,75 +0,0 @@ -#version 120 - -// -// model_shadow_normal_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/23/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the normal map texture -uniform sampler2D normalMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position -varying vec4 interpolatedPosition; - -// the interpolated normal -varying vec4 interpolatedNormal; - -// the interpolated tangent -varying vec4 interpolatedTangent; - -void main(void) { - vec3 normalizedNormal = normalize(vec3(interpolatedNormal)); - vec3 normalizedTangent = normalize(vec3(interpolatedTangent)); - vec3 normalizedBitangent = normalize(cross(normalizedNormal, normalizedTangent)); - vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) * 2.0 - vec3(1.0, 1.0, 1.0); - - // add up the local lights - vec4 viewNormal = vec4(normalizedTangent * localNormal.x + - normalizedBitangent * localNormal.y + normalizedNormal * localNormal.z, 0.0); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(viewNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(viewNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - - normalize(vec4(vec3(interpolatedPosition), 0.0))), viewNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + - vec4(pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular.rgb, 0.0); -} diff --git a/interface/resources/shaders/model_shadow_normal_specular_map.frag b/interface/resources/shaders/model_shadow_normal_specular_map.frag deleted file mode 100644 index 8283d10b93..0000000000 --- a/interface/resources/shaders/model_shadow_normal_specular_map.frag +++ /dev/null @@ -1,78 +0,0 @@ -#version 120 - -// -// model_shadow_normal_specular_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/23/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the normal map texture -uniform sampler2D normalMap; - -// the specular map texture -uniform sampler2D specularMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position -varying vec4 interpolatedPosition; - -// the interpolated normal -varying vec4 interpolatedNormal; - -// the interpolated tangent -varying vec4 interpolatedTangent; - -void main(void) { - vec3 normalizedNormal = normalize(vec3(interpolatedNormal)); - vec3 normalizedTangent = normalize(vec3(interpolatedTangent)); - vec3 normalizedBitangent = normalize(cross(normalizedNormal, normalizedTangent)); - vec3 localNormal = vec3(texture2D(normalMap, gl_TexCoord[0].st)) * 2.0 - vec3(1.0, 1.0, 1.0); - - // add up the local lights - vec4 viewNormal = vec4(normalizedTangent * localNormal.x + - normalizedBitangent * localNormal.y + normalizedNormal * localNormal.z, 0.0); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(viewNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(viewNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - - normalize(vec4(interpolatedPosition.xyz, 0.0))), viewNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); -} diff --git a/interface/resources/shaders/model_shadow_specular_map.frag b/interface/resources/shaders/model_shadow_specular_map.frag deleted file mode 100644 index f30f3d7b06..0000000000 --- a/interface/resources/shaders/model_shadow_specular_map.frag +++ /dev/null @@ -1,66 +0,0 @@ -#version 120 - -// -// model_shadow_specular_map.frag -// fragment shader -// -// Created by Andrzej Kapolka on 5/23/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - -// the diffuse texture -uniform sampler2D diffuseMap; - -// the specular texture -uniform sampler2D specularMap; - -// the shadow texture -uniform sampler2DShadow shadowMap; - -// the inverse of the size of the shadow map -const float shadowScale = 1.0 / 2048.0; - -// the interpolated position in view space -varying vec4 position; - -// the interpolated normal -varying vec4 normal; - -void main(void) { - // add up the local lights - vec4 normalizedNormal = normalize(normal); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(normalizedNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(normalizedNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse) * 0.25 * - (shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(-shadowScale, shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, -shadowScale, 0.0)).r + - shadow2D(shadowMap, gl_TexCoord[1].stp + vec3(shadowScale, shadowScale, 0.0)).r); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), - normalizedNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); -} diff --git a/interface/resources/shaders/model_specular_map.frag b/interface/resources/shaders/model_specular_map.frag index 824746d575..63c1ccc17b 100644 --- a/interface/resources/shaders/model_specular_map.frag +++ b/interface/resources/shaders/model_specular_map.frag @@ -11,47 +11,19 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// the maximum number of local lights to apply -const int MAX_LOCAL_LIGHTS = 2; - -// the color of each local light -uniform vec4 localLightColors[MAX_LOCAL_LIGHTS]; - -// the direction of each local light -uniform vec4 localLightDirections[MAX_LOCAL_LIGHTS]; - // the diffuse texture uniform sampler2D diffuseMap; // the specular texture uniform sampler2D specularMap; -// the interpolated position in view space -varying vec4 position; - // the interpolated normal varying vec4 normal; void main(void) { - // add up the local lights - vec4 normalizedNormal = normalize(normal); - vec4 localLight = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < MAX_LOCAL_LIGHTS; i++) { - localLight += localLightColors[i] * max(0.0, dot(normalizedNormal, localLightDirections[i])); - } - - // compute the base color based on OpenGL lighting model - float diffuse = dot(normalizedNormal, gl_LightSource[0].position); - float facingLight = step(0.0, diffuse); - vec4 base = gl_Color * (gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + - gl_FrontLightProduct[0].diffuse * (diffuse * facingLight) + localLight); - - // compute the specular component (sans exponent) - float specular = facingLight * max(0.0, dot(normalize(gl_LightSource[0].position - normalize(vec4(position.xyz, 0.0))), - normalizedNormal)); - - // modulate texture by base color and add specular contribution - gl_FragColor = base * texture2D(diffuseMap, gl_TexCoord[0].st) + vec4(pow(specular, gl_FrontMaterial.shininess) * - gl_FrontLightProduct[0].specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, 0.0); - + // set the diffuse, normal, specular data + gl_FragData[0] = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].st); + gl_FragData[1] = normalize(normal) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[2] = vec4(gl_FrontMaterial.specular.rgb * texture2D(specularMap, gl_TexCoord[0].st).rgb, + gl_FrontMaterial.shininess / 255.0); } diff --git a/interface/resources/shaders/skin_model.vert b/interface/resources/shaders/skin_model.vert index 943daf9061..4c2c3456d6 100644 --- a/interface/resources/shaders/skin_model.vert +++ b/interface/resources/shaders/skin_model.vert @@ -19,14 +19,11 @@ uniform mat4 clusterMatrices[MAX_CLUSTERS]; attribute vec4 clusterIndices; attribute vec4 clusterWeights; -// the interpolated position -varying vec4 position; - // the interpolated normal varying vec4 normal; void main(void) { - position = vec4(0.0, 0.0, 0.0, 0.0); + vec4 position = vec4(0.0, 0.0, 0.0, 0.0); normal = vec4(0.0, 0.0, 0.0, 0.0); for (int i = 0; i < INDICES_PER_VERTEX; i++) { mat4 clusterMatrix = clusterMatrices[int(clusterIndices[i])]; @@ -35,7 +32,6 @@ void main(void) { normal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; } - position = gl_ModelViewMatrix * position; normal = normalize(gl_ModelViewMatrix * normal); // pass along the vertex color @@ -44,8 +40,5 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; - // and the shadow texture coordinates - gl_TexCoord[1] = vec4(dot(gl_EyePlaneS[0], position), dot(gl_EyePlaneT[0], position), dot(gl_EyePlaneR[0], position), 1.0); - - gl_Position = gl_ProjectionMatrix * position; + gl_Position = gl_ModelViewProjectionMatrix * position; } diff --git a/interface/resources/shaders/skin_model_normal_map.vert b/interface/resources/shaders/skin_model_normal_map.vert index 66cc7c0f58..87622936af 100644 --- a/interface/resources/shaders/skin_model_normal_map.vert +++ b/interface/resources/shaders/skin_model_normal_map.vert @@ -22,9 +22,6 @@ attribute vec3 tangent; attribute vec4 clusterIndices; attribute vec4 clusterWeights; -// the interpolated position -varying vec4 interpolatedPosition; - // the interpolated normal varying vec4 interpolatedNormal; @@ -32,7 +29,7 @@ varying vec4 interpolatedNormal; varying vec4 interpolatedTangent; void main(void) { - interpolatedPosition = vec4(0.0, 0.0, 0.0, 0.0); + vec4 interpolatedPosition = vec4(0.0, 0.0, 0.0, 0.0); interpolatedNormal = vec4(0.0, 0.0, 0.0, 0.0); interpolatedTangent = vec4(0.0, 0.0, 0.0, 0.0); for (int i = 0; i < INDICES_PER_VERTEX; i++) { @@ -42,7 +39,6 @@ void main(void) { interpolatedNormal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; interpolatedTangent += clusterMatrix * vec4(tangent, 0.0) * clusterWeight; } - interpolatedPosition = gl_ModelViewMatrix * interpolatedPosition; interpolatedNormal = gl_ModelViewMatrix * interpolatedNormal; interpolatedTangent = gl_ModelViewMatrix * interpolatedTangent; @@ -52,9 +48,5 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = gl_MultiTexCoord0; - // and the shadow texture coordinates - gl_TexCoord[1] = vec4(dot(gl_EyePlaneS[0], interpolatedPosition), dot(gl_EyePlaneT[0], interpolatedPosition), - dot(gl_EyePlaneR[0], interpolatedPosition), 1.0); - - gl_Position = gl_ProjectionMatrix * interpolatedPosition; + gl_Position = gl_ModelViewProjectionMatrix * interpolatedPosition; } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3b85e81ea8..c657471f40 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2834,6 +2834,8 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); + _deferredLightingEffect.prepare(); + if (!selfAvatarOnly) { // draw a red sphere float originSphereRadius = 0.05f; @@ -2851,16 +2853,12 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { _audioReflector.render(); } - _deferredLightingEffect.prepare(); - bool deferredLightingRequired = false; - // Draw voxels if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) { PerformanceTimer perfTimer("voxels"); PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide() ... voxels..."); _voxels.render(); - deferredLightingRequired = true; } // also, metavoxels @@ -2869,11 +2867,6 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide() ... metavoxels..."); _metavoxels.render(); - deferredLightingRequired = true; - } - - if (deferredLightingRequired) { - _deferredLightingEffect.render(); } if (Menu::getInstance()->isOptionChecked(MenuOption::BuckyBalls)) { @@ -2926,6 +2919,11 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { } } + { + PerformanceTimer perfTimer("lighting"); + _deferredLightingEffect.render(); + } + if (!selfAvatarOnly) { // Render the world box if (whichCamera.getMode() != CAMERA_MODE_MIRROR && Menu::getInstance()->isOptionChecked(MenuOption::Stats) && diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 87290a3e64..d1ea76687c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -361,7 +361,6 @@ Menu::Menu() : shadowGroup->addAction(addCheckableActionToQMenuAndActionHash(shadowMenu, "None", 0, true)); shadowGroup->addAction(addCheckableActionToQMenuAndActionHash(shadowMenu, MenuOption::SimpleShadows, 0, false)); shadowGroup->addAction(addCheckableActionToQMenuAndActionHash(shadowMenu, MenuOption::CascadedShadows, 0, false)); - addCheckableActionToQMenuAndActionHash(shadowMenu, MenuOption::AvatarsReceiveShadows, 0, true); addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Stars, Qt::Key_Asterisk, true); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index b43e7cb75e..be349a1b26 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -346,7 +346,6 @@ namespace MenuOption { const QString AudioSourcePinkNoise = "Pink Noise"; const QString AudioSourceSine440 = "Sine 440hz"; const QString Avatars = "Avatars"; - const QString AvatarsReceiveShadows = "Avatars Receive Shadows"; const QString Bandwidth = "Bandwidth Display"; const QString BandwidthDetails = "Bandwidth Details"; const QString BlueSpeechSphere = "Blue Sphere While Speaking"; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index c7d69cff7a..b9f4a9be42 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -495,7 +495,7 @@ void Avatar::renderBody(RenderMode renderMode, float glowLevel) { return; } - _skeletonModel.render(1.0f, modelRenderMode, Menu::getInstance()->isOptionChecked(MenuOption::AvatarsReceiveShadows)); + _skeletonModel.render(1.0f, modelRenderMode); renderAttachments(renderMode); getHand()->render(false, modelRenderMode); } @@ -541,9 +541,8 @@ void Avatar::simulateAttachments(float deltaTime) { void Avatar::renderAttachments(RenderMode renderMode) { Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; - bool receiveShadows = Menu::getInstance()->isOptionChecked(MenuOption::AvatarsReceiveShadows); foreach (Model* model, _attachmentModels) { - model->render(1.0f, modelRenderMode, receiveShadows); + model->render(1.0f, modelRenderMode); } } diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index b226b8ed31..244983fd17 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -184,8 +184,7 @@ void Head::relaxLean(float deltaTime) { } void Head::render(float alpha, Model::RenderMode mode) { - if (_faceModel.render(alpha, mode, Menu::getInstance()->isOptionChecked(MenuOption::AvatarsReceiveShadows)) && - _renderLookatVectors && mode != Model::SHADOW_RENDER_MODE) { + if (_faceModel.render(alpha, mode) && _renderLookatVectors && mode != Model::SHADOW_RENDER_MODE) { renderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); } } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 48d58fb02c..396aadfa6e 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1054,7 +1054,7 @@ void MyAvatar::renderBody(RenderMode renderMode, float glowLevel) { // Render the body's voxels and head Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; - _skeletonModel.render(1.0f, modelRenderMode, Menu::getInstance()->isOptionChecked(MenuOption::AvatarsReceiveShadows)); + _skeletonModel.render(1.0f, modelRenderMode); renderAttachments(renderMode); // Render head so long as the camera isn't inside it @@ -1843,11 +1843,10 @@ void MyAvatar::renderAttachments(RenderMode renderMode) { QString headJointName = (geometry.headJointIndex == -1) ? QString() : geometry.joints.at(geometry.headJointIndex).name; Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; - bool receiveShadows = Menu::getInstance()->isOptionChecked(MenuOption::AvatarsReceiveShadows); for (int i = 0; i < _attachmentData.size(); i++) { const QString& jointName = _attachmentData.at(i).jointName; if (jointName != headJointName && jointName != "Head") { - _attachmentModels.at(i)->render(1.0f, modelRenderMode, receiveShadows); + _attachmentModels.at(i)->render(1.0f, modelRenderMode); } } } diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 0b16688056..8618af3bec 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -78,16 +78,6 @@ ProgramObject Model::_normalMapProgram; ProgramObject Model::_specularMapProgram; ProgramObject Model::_normalSpecularMapProgram; -ProgramObject Model::_shadowMapProgram; -ProgramObject Model::_shadowNormalMapProgram; -ProgramObject Model::_shadowSpecularMapProgram; -ProgramObject Model::_shadowNormalSpecularMapProgram; - -ProgramObject Model::_cascadedShadowMapProgram; -ProgramObject Model::_cascadedShadowNormalMapProgram; -ProgramObject Model::_cascadedShadowSpecularMapProgram; -ProgramObject Model::_cascadedShadowNormalSpecularMapProgram; - ProgramObject Model::_shadowProgram; ProgramObject Model::_skinProgram; @@ -95,43 +85,17 @@ ProgramObject Model::_skinNormalMapProgram; ProgramObject Model::_skinSpecularMapProgram; ProgramObject Model::_skinNormalSpecularMapProgram; -ProgramObject Model::_skinShadowMapProgram; -ProgramObject Model::_skinShadowNormalMapProgram; -ProgramObject Model::_skinShadowSpecularMapProgram; -ProgramObject Model::_skinShadowNormalSpecularMapProgram; - -ProgramObject Model::_skinCascadedShadowMapProgram; -ProgramObject Model::_skinCascadedShadowNormalMapProgram; -ProgramObject Model::_skinCascadedShadowSpecularMapProgram; -ProgramObject Model::_skinCascadedShadowNormalSpecularMapProgram; - ProgramObject Model::_skinShadowProgram; Model::Locations Model::_locations; Model::Locations Model::_normalMapLocations; Model::Locations Model::_specularMapLocations; Model::Locations Model::_normalSpecularMapLocations; -Model::Locations Model::_shadowMapLocations; -Model::Locations Model::_shadowNormalMapLocations; -Model::Locations Model::_shadowSpecularMapLocations; -Model::Locations Model::_shadowNormalSpecularMapLocations; -Model::Locations Model::_cascadedShadowMapLocations; -Model::Locations Model::_cascadedShadowNormalMapLocations; -Model::Locations Model::_cascadedShadowSpecularMapLocations; -Model::Locations Model::_cascadedShadowNormalSpecularMapLocations; - + Model::SkinLocations Model::_skinLocations; Model::SkinLocations Model::_skinNormalMapLocations; Model::SkinLocations Model::_skinSpecularMapLocations; Model::SkinLocations Model::_skinNormalSpecularMapLocations; -Model::SkinLocations Model::_skinShadowMapLocations; -Model::SkinLocations Model::_skinShadowNormalMapLocations; -Model::SkinLocations Model::_skinShadowSpecularMapLocations; -Model::SkinLocations Model::_skinShadowNormalSpecularMapLocations; -Model::SkinLocations Model::_skinCascadedShadowMapLocations; -Model::SkinLocations Model::_skinCascadedShadowNormalMapLocations; -Model::SkinLocations Model::_skinCascadedShadowSpecularMapLocations; -Model::SkinLocations Model::_skinCascadedShadowNormalSpecularMapLocations; Model::SkinLocations Model::_skinShadowLocations; void Model::setScale(const glm::vec3& scale) { @@ -164,23 +128,17 @@ void Model::setOffset(const glm::vec3& offset) { _snappedToRegistrationPoint = false; } -void Model::initProgram(ProgramObject& program, Model::Locations& locations, - int specularTextureUnit, int shadowTextureUnit) { +void Model::initProgram(ProgramObject& program, Model::Locations& locations, int specularTextureUnit) { program.bind(); locations.tangent = program.attributeLocation("tangent"); - locations.shadowDistances = program.uniformLocation("shadowDistances"); - locations.localLightColors = program.uniformLocation("localLightColors"); - locations.localLightDirections = program.uniformLocation("localLightDirections"); program.setUniformValue("diffuseMap", 0); program.setUniformValue("normalMap", 1); program.setUniformValue("specularMap", specularTextureUnit); - program.setUniformValue("shadowMap", shadowTextureUnit); program.release(); } -void Model::initSkinProgram(ProgramObject& program, Model::SkinLocations& locations, - int specularTextureUnit, int shadowTextureUnit) { - initProgram(program, locations, specularTextureUnit, shadowTextureUnit); +void Model::initSkinProgram(ProgramObject& program, Model::SkinLocations& locations, int specularTextureUnit) { + initProgram(program, locations, specularTextureUnit); program.bind(); locations.clusterMatrices = program.uniformLocation("clusterMatrices"); @@ -253,78 +211,11 @@ void Model::init() { initProgram(_normalSpecularMapProgram, _normalSpecularMapLocations, 2); - - _shadowMapProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + "shaders/model.vert"); - _shadowMapProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + - "shaders/model_shadow_map.frag"); - _shadowMapProgram.link(); - - initProgram(_shadowMapProgram, _shadowMapLocations); - - _shadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/model_normal_map.vert"); - _shadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_shadow_normal_map.frag"); - _shadowNormalMapProgram.link(); - - initProgram(_shadowNormalMapProgram, _shadowNormalMapLocations, 1, 2); - - _shadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/model.vert"); - _shadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_shadow_specular_map.frag"); - _shadowSpecularMapProgram.link(); - - initProgram(_shadowSpecularMapProgram, _shadowSpecularMapLocations, 1, 2); - - _shadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/model_normal_map.vert"); - _shadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_shadow_normal_specular_map.frag"); - _shadowNormalSpecularMapProgram.link(); - - initProgram(_shadowNormalSpecularMapProgram, _shadowNormalSpecularMapLocations, 2, 3); - - - _cascadedShadowMapProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + - "shaders/model.vert"); - _cascadedShadowMapProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + - "shaders/model_cascaded_shadow_map.frag"); - _cascadedShadowMapProgram.link(); - - initProgram(_cascadedShadowMapProgram, _cascadedShadowMapLocations); - - _cascadedShadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/model_normal_map.vert"); - _cascadedShadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_cascaded_shadow_normal_map.frag"); - _cascadedShadowNormalMapProgram.link(); - - initProgram(_cascadedShadowNormalMapProgram, _cascadedShadowNormalMapLocations, 1, 2); - - _cascadedShadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/model.vert"); - _cascadedShadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_cascaded_shadow_specular_map.frag"); - _cascadedShadowSpecularMapProgram.link(); - - initProgram(_cascadedShadowSpecularMapProgram, _cascadedShadowSpecularMapLocations, 1, 2); - - _cascadedShadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/model_normal_map.vert"); - _cascadedShadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_cascaded_shadow_normal_specular_map.frag"); - _cascadedShadowNormalSpecularMapProgram.link(); - - initProgram(_cascadedShadowNormalSpecularMapProgram, _cascadedShadowNormalSpecularMapLocations, 2, 3); - - _shadowProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + "shaders/model_shadow.vert"); _shadowProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + "shaders/model_shadow.frag"); _shadowProgram.link(); - _skinProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + "shaders/skin_model.vert"); _skinProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + "shaders/model.frag"); _skinProgram.link(); @@ -355,73 +246,6 @@ void Model::init() { initSkinProgram(_skinNormalSpecularMapProgram, _skinNormalSpecularMapLocations, 2); - - _skinShadowMapProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + - "shaders/skin_model.vert"); - _skinShadowMapProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + - "shaders/model_shadow_map.frag"); - _skinShadowMapProgram.link(); - - initSkinProgram(_skinShadowMapProgram, _skinShadowMapLocations); - - _skinShadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/skin_model_normal_map.vert"); - _skinShadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_shadow_normal_map.frag"); - _skinShadowNormalMapProgram.link(); - - initSkinProgram(_skinShadowNormalMapProgram, _skinShadowNormalMapLocations, 1, 2); - - _skinShadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/skin_model.vert"); - _skinShadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_shadow_specular_map.frag"); - _skinShadowSpecularMapProgram.link(); - - initSkinProgram(_skinShadowSpecularMapProgram, _skinShadowSpecularMapLocations, 1, 2); - - _skinShadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/skin_model_normal_map.vert"); - _skinShadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_shadow_normal_specular_map.frag"); - _skinShadowNormalSpecularMapProgram.link(); - - initSkinProgram(_skinShadowNormalSpecularMapProgram, _skinShadowNormalSpecularMapLocations, 2, 3); - - - _skinCascadedShadowMapProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + - "shaders/skin_model.vert"); - _skinCascadedShadowMapProgram.addShaderFromSourceFile(QGLShader::Fragment, Application::resourcesPath() + - "shaders/model_cascaded_shadow_map.frag"); - _skinCascadedShadowMapProgram.link(); - - initSkinProgram(_skinCascadedShadowMapProgram, _skinCascadedShadowMapLocations); - - _skinCascadedShadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/skin_model_normal_map.vert"); - _skinCascadedShadowNormalMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_cascaded_shadow_normal_map.frag"); - _skinCascadedShadowNormalMapProgram.link(); - - initSkinProgram(_skinCascadedShadowNormalMapProgram, _skinCascadedShadowNormalMapLocations, 1, 2); - - _skinCascadedShadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/skin_model.vert"); - _skinCascadedShadowSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_cascaded_shadow_specular_map.frag"); - _skinCascadedShadowSpecularMapProgram.link(); - - initSkinProgram(_skinCascadedShadowSpecularMapProgram, _skinCascadedShadowSpecularMapLocations, 1, 2); - - _skinCascadedShadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Vertex, - Application::resourcesPath() + "shaders/skin_model_normal_map.vert"); - _skinCascadedShadowNormalSpecularMapProgram.addShaderFromSourceFile(QGLShader::Fragment, - Application::resourcesPath() + "shaders/model_cascaded_shadow_normal_specular_map.frag"); - _skinCascadedShadowNormalSpecularMapProgram.link(); - - initSkinProgram(_skinCascadedShadowNormalSpecularMapProgram, _skinCascadedShadowNormalSpecularMapLocations, 2, 3); - - _skinShadowProgram.addShaderFromSourceFile(QGLShader::Vertex, Application::resourcesPath() + "shaders/skin_model_shadow.vert"); _skinShadowProgram.addShaderFromSourceFile(QGLShader::Fragment, @@ -558,7 +382,7 @@ void Model::setJointStates(QVector states) { _boundingRadius = radius; } -bool Model::render(float alpha, RenderMode mode, bool receiveShadows) { +bool Model::render(float alpha, RenderMode mode) { // render the attachments foreach (Model* attachment, _attachments) { attachment->render(alpha, mode); @@ -607,14 +431,20 @@ bool Model::render(float alpha, RenderMode mode, bool receiveShadows) { glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.5f * alpha); - receiveShadows &= Menu::getInstance()->getShadowsEnabled(); - renderMeshes(alpha, mode, false, receiveShadows); + Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers( + mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE, + mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE, + mode == DEFAULT_RENDER_MODE); + + renderMeshes(alpha, mode, false); glDisable(GL_ALPHA_TEST); // render translucent meshes afterwards - renderMeshes(alpha, mode, true, receiveShadows); + renderMeshes(alpha, mode, true); + + Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true); glDisable(GL_CULL_FACE); @@ -1341,12 +1171,11 @@ void Model::deleteGeometry() { } } -void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool receiveShadows) { +void Model::renderMeshes(float alpha, RenderMode mode, bool translucent) { updateVisibleJointStates(); const FBXGeometry& geometry = _geometry->getFBXGeometry(); const QVector& networkMeshes = _geometry->getMeshes(); - bool cascadedShadows = Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows); for (int i = 0; i < networkMeshes.size(); i++) { // exit early if the translucency doesn't match what we're drawing const NetworkMesh& networkMesh = networkMeshes.at(i); @@ -1370,7 +1199,6 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re ProgramObject* skinProgram = &_skinProgram; SkinLocations* skinLocations = &_skinLocations; GLenum specularTextureUnit = 0; - GLenum shadowTextureUnit = 0; if (mode == SHADOW_RENDER_MODE) { program = &_shadowProgram; skinProgram = &_skinShadowProgram; @@ -1378,40 +1206,12 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re } else if (!mesh.tangents.isEmpty()) { if (mesh.hasSpecularTexture()) { - if (receiveShadows) { - if (cascadedShadows) { - program = &_cascadedShadowNormalSpecularMapProgram; - locations = &_cascadedShadowNormalSpecularMapLocations; - skinProgram = &_skinCascadedShadowNormalSpecularMapProgram; - skinLocations = &_skinCascadedShadowNormalSpecularMapLocations; - } else { - program = &_shadowNormalSpecularMapProgram; - locations = &_shadowNormalSpecularMapLocations; - skinProgram = &_skinShadowNormalSpecularMapProgram; - skinLocations = &_skinShadowNormalSpecularMapLocations; - } - shadowTextureUnit = GL_TEXTURE3; - } else { - program = &_normalSpecularMapProgram; - locations = &_normalSpecularMapLocations; - skinProgram = &_skinNormalSpecularMapProgram; - skinLocations = &_skinNormalSpecularMapLocations; - } + program = &_normalSpecularMapProgram; + locations = &_normalSpecularMapLocations; + skinProgram = &_skinNormalSpecularMapProgram; + skinLocations = &_skinNormalSpecularMapLocations; specularTextureUnit = GL_TEXTURE2; - } else if (receiveShadows) { - if (cascadedShadows) { - program = &_cascadedShadowNormalMapProgram; - locations = &_cascadedShadowNormalMapLocations; - skinProgram = &_skinCascadedShadowNormalMapProgram; - skinLocations = &_skinCascadedShadowNormalMapLocations; - } else { - program = &_shadowNormalMapProgram; - locations = &_shadowNormalMapLocations; - skinProgram = &_skinShadowNormalMapProgram; - skinLocations = &_skinShadowNormalMapLocations; - } - shadowTextureUnit = GL_TEXTURE2; } else { program = &_normalMapProgram; locations = &_normalMapLocations; @@ -1419,40 +1219,11 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re skinLocations = &_skinNormalMapLocations; } } else if (mesh.hasSpecularTexture()) { - if (receiveShadows) { - if (cascadedShadows) { - program = &_cascadedShadowSpecularMapProgram; - locations = &_cascadedShadowSpecularMapLocations; - skinProgram = &_skinCascadedShadowSpecularMapProgram; - skinLocations = &_skinCascadedShadowSpecularMapLocations; - } else { - program = &_shadowSpecularMapProgram; - locations = &_shadowSpecularMapLocations; - skinProgram = &_skinShadowSpecularMapProgram; - skinLocations = &_skinShadowSpecularMapLocations; - } - shadowTextureUnit = GL_TEXTURE2; - } else { - program = &_specularMapProgram; - locations = &_specularMapLocations; - skinProgram = &_skinSpecularMapProgram; - skinLocations = &_skinSpecularMapLocations; - } - specularTextureUnit = GL_TEXTURE1; - - } else if (receiveShadows) { - if (cascadedShadows) { - program = &_cascadedShadowMapProgram; - locations = &_cascadedShadowMapLocations; - skinProgram = &_skinCascadedShadowMapProgram; - skinLocations = &_skinCascadedShadowMapLocations; - } else { - program = &_shadowMapProgram; - locations = &_shadowMapLocations; - skinProgram = &_skinShadowMapProgram; - skinLocations = &_skinShadowMapLocations; - } - shadowTextureUnit = GL_TEXTURE1; + program = &_specularMapProgram; + locations = &_specularMapLocations; + skinProgram = &_skinSpecularMapProgram; + skinLocations = &_skinSpecularMapLocations; + specularTextureUnit = GL_TEXTURE1; } const MeshState& state = _meshStates.at(i); @@ -1480,14 +1251,7 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re glMultMatrixf((const GLfloat*)&state.clusterMatrices[0]); program->bind(); } - if (cascadedShadows) { - activeProgram->setUniform(activeLocations->shadowDistances, Application::getInstance()->getShadowDistances()); - } - if (mode != SHADOW_RENDER_MODE) { - activeProgram->setUniformValueArray(activeLocations->localLightDirections, - (const GLfloat*)_localLightDirections, MAX_LOCAL_LIGHTS, 4); - } - + if (mesh.blendshapes.isEmpty()) { if (!(mesh.tangents.isEmpty() || mode == SHADOW_RENDER_MODE)) { activeProgram->setAttributeBuffer(activeLocations->tangent, GL_FLOAT, vertexCount * 2 * sizeof(glm::vec3), 3); @@ -1539,12 +1303,6 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re glMaterialfv(GL_FRONT, GL_SPECULAR, (const float*)&specular); glMaterialf(GL_FRONT, GL_SHININESS, part.shininess); - for (int k = 0; k < qMin(MAX_LOCAL_LIGHTS, _localLights.size()); k++) { - _localLightColors[k] = glm::vec4(_localLights.at(k).color, 1.0f) * diffuse; - } - activeProgram->setUniformValueArray(activeLocations->localLightColors, - (const GLfloat*)_localLightColors, MAX_LOCAL_LIGHTS, 4); - Texture* diffuseMap = networkPart.diffuseTexture.data(); if (mesh.isEye && diffuseMap) { diffuseMap = (_dilatedTextures[i][j] = @@ -1553,7 +1311,6 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re glBindTexture(GL_TEXTURE_2D, !diffuseMap ? Application::getInstance()->getTextureCache()->getWhiteTextureID() : diffuseMap->getID()); - if (!mesh.tangents.isEmpty()) { glActiveTexture(GL_TEXTURE1); Texture* normalMap = networkPart.normalTexture.data(); @@ -1569,12 +1326,6 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re Application::getInstance()->getTextureCache()->getWhiteTextureID() : specularMap->getID()); glActiveTexture(GL_TEXTURE0); } - - if (shadowTextureUnit) { - glActiveTexture(shadowTextureUnit); - glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getShadowDepthTextureID()); - glActiveTexture(GL_TEXTURE0); - } } glDrawRangeElementsEXT(GL_QUADS, 0, vertexCount - 1, part.quadIndices.size(), GL_UNSIGNED_INT, (void*)offset); offset += part.quadIndices.size() * sizeof(int); @@ -1604,12 +1355,6 @@ void Model::renderMeshes(float alpha, RenderMode mode, bool translucent, bool re glActiveTexture(GL_TEXTURE0); } - if (shadowTextureUnit) { - glActiveTexture(shadowTextureUnit); - glBindTexture(GL_TEXTURE_2D, 0); - glActiveTexture(GL_TEXTURE0); - } - if (state.clusterMatrices.size() > 1) { skinProgram->disableAttributeArray(skinLocations->clusterIndices); skinProgram->disableAttributeArray(skinLocations->clusterWeights); diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index 396a3e576c..71006e3e1d 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -89,7 +89,7 @@ public: enum RenderMode { DEFAULT_RENDER_MODE, SHADOW_RENDER_MODE, DIFFUSE_RENDER_MODE, NORMAL_RENDER_MODE }; - bool render(float alpha = 1.0f, RenderMode mode = DEFAULT_RENDER_MODE, bool receiveShadows = true); + bool render(float alpha = 1.0f, RenderMode mode = DEFAULT_RENDER_MODE); /// Sets the URL of the model to render. /// \param fallback the URL of a fallback model to render if the requested model fails to load @@ -255,7 +255,7 @@ private: void applyNextGeometry(); void deleteGeometry(); - void renderMeshes(float alpha, RenderMode mode, bool translucent, bool receiveShadows); + void renderMeshes(float alpha, RenderMode mode, bool translucent); QVector createJointStates(const FBXGeometry& geometry); void initJointTransforms(); @@ -292,16 +292,6 @@ private: static ProgramObject _specularMapProgram; static ProgramObject _normalSpecularMapProgram; - static ProgramObject _shadowMapProgram; - static ProgramObject _shadowNormalMapProgram; - static ProgramObject _shadowSpecularMapProgram; - static ProgramObject _shadowNormalSpecularMapProgram; - - static ProgramObject _cascadedShadowMapProgram; - static ProgramObject _cascadedShadowNormalMapProgram; - static ProgramObject _cascadedShadowSpecularMapProgram; - static ProgramObject _cascadedShadowNormalSpecularMapProgram; - static ProgramObject _shadowProgram; static ProgramObject _skinProgram; @@ -309,53 +299,22 @@ private: static ProgramObject _skinSpecularMapProgram; static ProgramObject _skinNormalSpecularMapProgram; - static ProgramObject _skinShadowMapProgram; - static ProgramObject _skinShadowNormalMapProgram; - static ProgramObject _skinShadowSpecularMapProgram; - static ProgramObject _skinShadowNormalSpecularMapProgram; - - static ProgramObject _skinCascadedShadowMapProgram; - static ProgramObject _skinCascadedShadowNormalMapProgram; - static ProgramObject _skinCascadedShadowSpecularMapProgram; - static ProgramObject _skinCascadedShadowNormalSpecularMapProgram; - static ProgramObject _skinShadowProgram; static int _normalMapTangentLocation; static int _normalSpecularMapTangentLocation; - static int _shadowNormalMapTangentLocation; - static int _shadowNormalSpecularMapTangentLocation; - static int _cascadedShadowNormalMapTangentLocation; - static int _cascadedShadowNormalSpecularMapTangentLocation; - - static int _cascadedShadowMapDistancesLocation; - static int _cascadedShadowNormalMapDistancesLocation; - static int _cascadedShadowSpecularMapDistancesLocation; - static int _cascadedShadowNormalSpecularMapDistancesLocation; class Locations { public: - int localLightColors; - int localLightDirections; int tangent; - int shadowDistances; }; static Locations _locations; static Locations _normalMapLocations; static Locations _specularMapLocations; static Locations _normalSpecularMapLocations; - static Locations _shadowMapLocations; - static Locations _shadowNormalMapLocations; - static Locations _shadowSpecularMapLocations; - static Locations _shadowNormalSpecularMapLocations; - static Locations _cascadedShadowMapLocations; - static Locations _cascadedShadowNormalMapLocations; - static Locations _cascadedShadowSpecularMapLocations; - static Locations _cascadedShadowNormalSpecularMapLocations; - static void initProgram(ProgramObject& program, Locations& locations, - int specularTextureUnit = 1, int shadowTextureUnit = 1); + static void initProgram(ProgramObject& program, Locations& locations, int specularTextureUnit = 1); class SkinLocations : public Locations { public: @@ -368,18 +327,9 @@ private: static SkinLocations _skinNormalMapLocations; static SkinLocations _skinSpecularMapLocations; static SkinLocations _skinNormalSpecularMapLocations; - static SkinLocations _skinShadowMapLocations; - static SkinLocations _skinShadowNormalMapLocations; - static SkinLocations _skinShadowSpecularMapLocations; - static SkinLocations _skinShadowNormalSpecularMapLocations; - static SkinLocations _skinCascadedShadowMapLocations; - static SkinLocations _skinCascadedShadowNormalMapLocations; - static SkinLocations _skinCascadedShadowSpecularMapLocations; - static SkinLocations _skinCascadedShadowNormalSpecularMapLocations; static SkinLocations _skinShadowLocations; - static void initSkinProgram(ProgramObject& program, SkinLocations& locations, - int specularTextureUnit = 1, int shadowTextureUnit = 1); + static void initSkinProgram(ProgramObject& program, SkinLocations& locations, int specularTextureUnit = 1); }; Q_DECLARE_METATYPE(QPointer)