mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 18:50:00 +02:00
connecting the globalLight info to the DeferredLightingEffect
This commit is contained in:
parent
925449721a
commit
1b22a3ef36
6 changed files with 222 additions and 214 deletions
|
@ -2585,6 +2585,9 @@ const GLfloat WORLD_AMBIENT_COLOR[] = { 0.525f, 0.525f, 0.6f };
|
||||||
const GLfloat WORLD_DIFFUSE_COLOR[] = { 0.6f, 0.525f, 0.525f };
|
const GLfloat WORLD_DIFFUSE_COLOR[] = { 0.6f, 0.525f, 0.525f };
|
||||||
const GLfloat WORLD_SPECULAR_COLOR[] = { 0.94f, 0.94f, 0.737f, 1.0f };
|
const GLfloat WORLD_SPECULAR_COLOR[] = { 0.94f, 0.94f, 0.737f, 1.0f };
|
||||||
|
|
||||||
|
const glm::vec3 GLOBAL_LIGHT_COLOR = { 0.6f, 0.525f, 0.525f };
|
||||||
|
const float GLOBAL_LIGHT_INTENSITY = 1.0f;
|
||||||
|
|
||||||
void Application::setupWorldLight() {
|
void Application::setupWorldLight() {
|
||||||
|
|
||||||
// Setup 3D lights (after the camera transform, so that they are positioned in world space)
|
// Setup 3D lights (after the camera transform, so that they are positioned in world space)
|
||||||
|
@ -2599,6 +2602,7 @@ void Application::setupWorldLight() {
|
||||||
glLightfv(GL_LIGHT0, GL_SPECULAR, WORLD_SPECULAR_COLOR);
|
glLightfv(GL_LIGHT0, GL_SPECULAR, WORLD_SPECULAR_COLOR);
|
||||||
glMaterialfv(GL_FRONT, GL_SPECULAR, WORLD_SPECULAR_COLOR);
|
glMaterialfv(GL_FRONT, GL_SPECULAR, WORLD_SPECULAR_COLOR);
|
||||||
glMateriali(GL_FRONT, GL_SHININESS, 96);
|
glMateriali(GL_FRONT, GL_SHININESS, 96);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::shouldRenderMesh(float largestDimension, float distanceToCamera) {
|
bool Application::shouldRenderMesh(float largestDimension, float distanceToCamera) {
|
||||||
|
@ -2805,7 +2809,7 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs
|
||||||
|
|
||||||
{
|
{
|
||||||
DependencyManager::get<DeferredLightingEffect>()->setAmbientLightMode(getRenderAmbientLight());
|
DependencyManager::get<DeferredLightingEffect>()->setAmbientLightMode(getRenderAmbientLight());
|
||||||
|
DependencyManager::get<DeferredLightingEffect>()->setGlobalLight(getSunDirection(), GLOBAL_LIGHT_COLOR, GLOBAL_LIGHT_INTENSITY);
|
||||||
PROFILE_RANGE("DeferredLighting");
|
PROFILE_RANGE("DeferredLighting");
|
||||||
PerformanceTimer perfTimer("lighting");
|
PerformanceTimer perfTimer("lighting");
|
||||||
DependencyManager::get<DeferredLightingEffect>()->render();
|
DependencyManager::get<DeferredLightingEffect>()->render();
|
||||||
|
|
|
@ -56,7 +56,7 @@ const Vec3& Light::getDirection() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::setColor(const Color& color) {
|
void Light::setColor(const Color& color) {
|
||||||
editSchema()._color = glm::normalize(color);
|
editSchema()._color = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::setIntensity(float intensity) {
|
void Light::setIntensity(float intensity) {
|
||||||
|
@ -89,7 +89,7 @@ void Light::setSpotExponent(float exponent) {
|
||||||
editSchema()._spot.w = exponent;
|
editSchema()._spot.w = exponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Light::setShowVolumeContour(float show) {
|
void Light::setShowContour(float show) {
|
||||||
if (show <= 0.f) {
|
if (show <= 0.f) {
|
||||||
show = 0.0f;
|
show = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,161 @@ typedef glm::vec3 Vec3;
|
||||||
typedef glm::vec4 Vec4;
|
typedef glm::vec4 Vec4;
|
||||||
typedef glm::quat Quat;
|
typedef glm::quat Quat;
|
||||||
|
|
||||||
|
class SphericalHarmonics {
|
||||||
|
public:
|
||||||
|
glm::vec3 L00 ; float spare0;
|
||||||
|
glm::vec3 L1m1 ; float spare1;
|
||||||
|
glm::vec3 L10 ; float spare2;
|
||||||
|
glm::vec3 L11 ; float spare3;
|
||||||
|
glm::vec3 L2m2 ; float spare4;
|
||||||
|
glm::vec3 L2m1 ; float spare5;
|
||||||
|
glm::vec3 L20 ; float spare6;
|
||||||
|
glm::vec3 L21 ; float spare7;
|
||||||
|
glm::vec3 L22 ; float spare8;
|
||||||
|
|
||||||
|
static const int NUM_COEFFICIENTS = 9;
|
||||||
|
|
||||||
|
enum Preset {
|
||||||
|
OLD_TOWN_SQUARE = 0,
|
||||||
|
GRACE_CATHEDRAL,
|
||||||
|
EUCALYPTUS_GROVE,
|
||||||
|
ST_PETERS_BASILICA,
|
||||||
|
UFFIZI_GALLERY,
|
||||||
|
GALILEOS_TOMB,
|
||||||
|
VINE_STREET_KITCHEN,
|
||||||
|
BREEZEWAY,
|
||||||
|
CAMPUS_SUNSET,
|
||||||
|
FUNSTON_BEACH_SUNSET,
|
||||||
|
|
||||||
|
NUM_PRESET,
|
||||||
|
};
|
||||||
|
|
||||||
|
void assignPreset(int p) {
|
||||||
|
switch (p) {
|
||||||
|
case OLD_TOWN_SQUARE: {
|
||||||
|
L00 = glm::vec3( 0.871297f, 0.875222f, 0.864470f);
|
||||||
|
L1m1 = glm::vec3( 0.175058f, 0.245335f, 0.312891f);
|
||||||
|
L10 = glm::vec3( 0.034675f, 0.036107f, 0.037362f);
|
||||||
|
L11 = glm::vec3(-0.004629f,-0.029448f,-0.048028f);
|
||||||
|
L2m2 = glm::vec3(-0.120535f,-0.121160f,-0.117507f);
|
||||||
|
L2m1 = glm::vec3( 0.003242f, 0.003624f, 0.007511f);
|
||||||
|
L20 = glm::vec3(-0.028667f,-0.024926f,-0.020998f);
|
||||||
|
L21 = glm::vec3(-0.077539f,-0.086325f,-0.091591f);
|
||||||
|
L22 = glm::vec3(-0.161784f,-0.191783f,-0.219152f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GRACE_CATHEDRAL: {
|
||||||
|
L00 = glm::vec3( 0.79f, 0.44f, 0.54f);
|
||||||
|
L1m1 = glm::vec3( 0.39f, 0.35f, 0.60f);
|
||||||
|
L10 = glm::vec3(-0.34f, -0.18f, -0.27f);
|
||||||
|
L11 = glm::vec3(-0.29f, -0.06f, 0.01f);
|
||||||
|
L2m2 = glm::vec3(-0.11f, -0.05f, -0.12f);
|
||||||
|
L2m1 = glm::vec3(-0.26f, -0.22f, -0.47f);
|
||||||
|
L20 = glm::vec3(-0.16f, -0.09f, -0.15f);
|
||||||
|
L21 = glm::vec3( 0.56f, 0.21f, 0.14f);
|
||||||
|
L22 = glm::vec3( 0.21f, -0.05f, -0.30f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EUCALYPTUS_GROVE: {
|
||||||
|
L00 = glm::vec3( 0.38f, 0.43f, 0.45f);
|
||||||
|
L1m1 = glm::vec3( 0.29f, 0.36f, 0.41f);
|
||||||
|
L10 = glm::vec3( 0.04f, 0.03f, 0.01f);
|
||||||
|
L11 = glm::vec3(-0.10f, -0.10f, -0.09f);
|
||||||
|
L2m2 = glm::vec3(-0.06f, -0.06f, -0.04f);
|
||||||
|
L2m1 = glm::vec3( 0.01f, -0.01f, -0.05f);
|
||||||
|
L20 = glm::vec3(-0.09f, -0.13f, -0.15f);
|
||||||
|
L21 = glm::vec3(-0.06f, -0.05f, -0.04f);
|
||||||
|
L22 = glm::vec3( 0.02f, 0.00f, -0.05f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ST_PETERS_BASILICA: {
|
||||||
|
L00 = glm::vec3( 0.36f, 0.26f, 0.23f);
|
||||||
|
L1m1 = glm::vec3( 0.18f, 0.14f, 0.13f);
|
||||||
|
L10 = glm::vec3(-0.02f, -0.01f, 0.00f);
|
||||||
|
L11 = glm::vec3( 0.03f, 0.02f, -0.00f);
|
||||||
|
L2m2 = glm::vec3( 0.02f, 0.01f, -0.00f);
|
||||||
|
L2m1 = glm::vec3(-0.05f, -0.03f, -0.01f);
|
||||||
|
L20 = glm::vec3(-0.09f, -0.08f, -0.07f);
|
||||||
|
L21 = glm::vec3( 0.01f, 0.00f, 0.00f);
|
||||||
|
L22 = glm::vec3(-0.08f, -0.03f, -0.00f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UFFIZI_GALLERY: {
|
||||||
|
L00 = glm::vec3( 0.32f, 0.31f, 0.35f);
|
||||||
|
L1m1 = glm::vec3( 0.37f, 0.37f, 0.43f);
|
||||||
|
L10 = glm::vec3( 0.00f, 0.00f, 0.00f);
|
||||||
|
L11 = glm::vec3(-0.01f, -0.01f, -0.01f);
|
||||||
|
L2m2 = glm::vec3(-0.02f, -0.02f, -0.03f);
|
||||||
|
L2m1 = glm::vec3(-0.01f, -0.01f, -0.01f);
|
||||||
|
L20 = glm::vec3(-0.28f, -0.28f, -0.32f);
|
||||||
|
L21 = glm::vec3( 0.00f, 0.00f, 0.00f);
|
||||||
|
L22 = glm::vec3(-0.24f, -0.24f, -0.28f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GALILEOS_TOMB: {
|
||||||
|
L00 = glm::vec3( 1.04f, 0.76f, 0.71f);
|
||||||
|
L1m1 = glm::vec3( 0.44f, 0.34f, 0.34f);
|
||||||
|
L10 = glm::vec3(-0.22f, -0.18f, -0.17f);
|
||||||
|
L11 = glm::vec3( 0.71f, 0.54f, 0.56f);
|
||||||
|
L2m2 = glm::vec3( 0.64f, 0.50f, 0.52f);
|
||||||
|
L2m1 = glm::vec3(-0.12f, -0.09f, -0.08f);
|
||||||
|
L20 = glm::vec3(-0.37f, -0.28f, -0.32f);
|
||||||
|
L21 = glm::vec3(-0.17f, -0.13f, -0.13f);
|
||||||
|
L22 = glm::vec3( 0.55f, 0.42f, 0.42f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VINE_STREET_KITCHEN: {
|
||||||
|
L00 = glm::vec3( 0.64f, 0.67f, 0.73f);
|
||||||
|
L1m1 = glm::vec3( 0.28f, 0.32f, 0.33f);
|
||||||
|
L10 = glm::vec3( 0.42f, 0.60f, 0.77f);
|
||||||
|
L11 = glm::vec3(-0.05f, -0.04f, -0.02f);
|
||||||
|
L2m2 = glm::vec3(-0.10f, -0.08f, -0.05f);
|
||||||
|
L2m1 = glm::vec3( 0.25f, 0.39f, 0.53f);
|
||||||
|
L20 = glm::vec3( 0.38f, 0.54f, 0.71f);
|
||||||
|
L21 = glm::vec3( 0.06f, 0.01f, -0.02f);
|
||||||
|
L22 = glm::vec3(-0.03f, -0.02f, -0.03f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BREEZEWAY: {
|
||||||
|
L00 = glm::vec3( 0.32f, 0.36f, 0.38f);
|
||||||
|
L1m1 = glm::vec3( 0.37f, 0.41f, 0.45f);
|
||||||
|
L10 = glm::vec3(-0.01f, -0.01f, -0.01f);
|
||||||
|
L11 = glm::vec3(-0.10f, -0.12f, -0.12f);
|
||||||
|
L2m2 = glm::vec3(-0.13f, -0.15f, -0.17f);
|
||||||
|
L2m1 = glm::vec3(-0.01f, -0.02f, 0.02f);
|
||||||
|
L20 = glm::vec3(-0.07f, -0.08f, -0.09f);
|
||||||
|
L21 = glm::vec3( 0.02f, 0.03f, 0.03f);
|
||||||
|
L22 = glm::vec3(-0.29f, -0.32f, -0.36f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CAMPUS_SUNSET: {
|
||||||
|
L00 = glm::vec3( 0.79f, 0.94f, 0.98f);
|
||||||
|
L1m1 = glm::vec3( 0.44f, 0.56f, 0.70f);
|
||||||
|
L10 = glm::vec3(-0.10f, -0.18f, -0.27f);
|
||||||
|
L11 = glm::vec3( 0.45f, 0.38f, 0.20f);
|
||||||
|
L2m2 = glm::vec3( 0.18f, 0.14f, 0.05f);
|
||||||
|
L2m1 = glm::vec3(-0.14f, -0.22f, -0.31f);
|
||||||
|
L20 = glm::vec3(-0.39f, -0.40f, -0.36f);
|
||||||
|
L21 = glm::vec3( 0.09f, 0.07f, 0.04f);
|
||||||
|
L22 = glm::vec3( 0.67f, 0.67f, 0.52f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FUNSTON_BEACH_SUNSET: {
|
||||||
|
L00 = glm::vec3( 0.68f, 0.69f, 0.70f);
|
||||||
|
L1m1 = glm::vec3( 0.32f, 0.37f, 0.44f);
|
||||||
|
L10 = glm::vec3(-0.17f, -0.17f, -0.17f);
|
||||||
|
L11 = glm::vec3(-0.45f, -0.42f, -0.34f);
|
||||||
|
L2m2 = glm::vec3(-0.17f, -0.17f, -0.15f);
|
||||||
|
L2m1 = glm::vec3(-0.08f, -0.09f, -0.10f);
|
||||||
|
L20 = glm::vec3(-0.03f, -0.02f, -0.01f);
|
||||||
|
L21 = glm::vec3( 0.16f, 0.14f, 0.10f);
|
||||||
|
L22 = glm::vec3( 0.37f, 0.31f, 0.20f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class Light {
|
class Light {
|
||||||
public:
|
public:
|
||||||
enum Type {
|
enum Type {
|
||||||
|
@ -84,9 +239,15 @@ public:
|
||||||
void setSpotExponent(float exponent);
|
void setSpotExponent(float exponent);
|
||||||
float getSpotExponent() const { return getSchema()._spot.w; }
|
float getSpotExponent() const { return getSchema()._spot.w; }
|
||||||
|
|
||||||
// For editing purpose, show the light volume contour
|
// For editing purpose, show the light volume contour.
|
||||||
void setShowVolumeContour(float show);
|
// Set to non 0 to show it, the value is used as the intensity of the contour color
|
||||||
float getShowVolumeContour() const { return getSchema()._control.w; }
|
void setShowContour(float show);
|
||||||
|
float getShowContour() const { return getSchema()._control.w; }
|
||||||
|
|
||||||
|
// Spherical Harmonics storing the Ambien lighting approximation used for the Sun typed light
|
||||||
|
void setAmbientSphere(const SphericalHarmonics& sphere) { _ambientSphere = sphere; }
|
||||||
|
const SphericalHarmonics& getAmbientSphere() const { return _ambientSphere; }
|
||||||
|
void setAmbientSpherePreset(SphericalHarmonics::Preset preset) { _ambientSphere.assignPreset(preset); }
|
||||||
|
|
||||||
// Schema to access the attribute values of the light
|
// Schema to access the attribute values of the light
|
||||||
class Schema {
|
class Schema {
|
||||||
|
@ -121,6 +282,7 @@ protected:
|
||||||
Flags _flags;
|
Flags _flags;
|
||||||
UniformBufferView _schemaBuffer;
|
UniformBufferView _schemaBuffer;
|
||||||
Transform _transform;
|
Transform _transform;
|
||||||
|
SphericalHarmonics _ambientSphere;
|
||||||
|
|
||||||
const Schema& getSchema() const { return _schemaBuffer.get<Schema>(); }
|
const Schema& getSchema() const { return _schemaBuffer.get<Schema>(); }
|
||||||
Schema& editSchema() { return _schemaBuffer.edit<Schema>(); }
|
Schema& editSchema() { return _schemaBuffer.edit<Schema>(); }
|
||||||
|
|
|
@ -54,47 +54,38 @@ uniform SphericalHarmonics ambientSphere;
|
||||||
// The view Matrix
|
// The view Matrix
|
||||||
uniform mat4 invViewMat;
|
uniform mat4 invViewMat;
|
||||||
|
|
||||||
vec3 evalAmbientColor(vec3 normal, vec3 diffuse, vec3 specular, float gloss) {
|
vec3 evalAmbienGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss) {
|
||||||
return diffuse.rgb * gl_FrontLightProduct[0].ambient.rgb;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 evalAmbientSphereColor(vec3 normal, vec3 diffuse, vec3 specular, float gloss) {
|
|
||||||
vec3 ambientLight = 0.5 * evalSphericalLight(ambientSphere, normal).xyz;
|
|
||||||
|
|
||||||
return diffuse.rgb * ambientLight;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
vec3 evalDirectionalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss) {
|
|
||||||
|
|
||||||
// Need the light now
|
// Need the light now
|
||||||
Light light = getLight();
|
Light light = getLight();
|
||||||
vec4 shading = evalFragShading(normal, getLightDirection(light), normalize(position), specular, gloss);
|
|
||||||
return vec3(diffuse + shading.rgb) * shading.w * shadowAttenuation * getLightColor(light) * getLightIntensity(light);
|
|
||||||
// return vec3(diffuse + shading.rgb) * shading.w * shadowAttenuation * gl_FrontLightProduct[0].diffuse.rgb;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 evalAmbienGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss) {
|
vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0));
|
||||||
vec3 color = evalAmbientColor(normal, diffuse, specular, gloss)
|
vec4 fragEyeVector = invViewMat * vec4(-position, 0.0);
|
||||||
+ evalDirectionalColor(shadowAttenuation,
|
vec3 fragEyeDir = normalize(fragEyeVector.xyz);
|
||||||
position,
|
|
||||||
normal,
|
vec3 color = diffuse.rgb * getLightColor(light) * getLightIntensity(light);
|
||||||
diffuse,
|
|
||||||
specular,
|
vec4 shading = evalFragShading(fragNormal, getLightDirection(light), fragEyeDir, specular, gloss);
|
||||||
gloss);
|
|
||||||
return color;
|
color += vec3(diffuse + shading.rgb) * shading.w * shadowAttenuation * getLightColor(light) * getLightIntensity(light);
|
||||||
|
|
||||||
|
return color;
|
||||||
}
|
}
|
||||||
vec3 evalAmbienSphereGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss) {
|
vec3 evalAmbienSphereGlobalColor(float shadowAttenuation, vec3 position, vec3 normal, vec3 diffuse, vec3 specular, float gloss) {
|
||||||
vec3 color = evalAmbientSphereColor(normal, diffuse, specular, gloss)
|
// Need the light now
|
||||||
+ evalDirectionalColor(shadowAttenuation,
|
Light light = getLight();
|
||||||
position,
|
|
||||||
normal,
|
vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0));
|
||||||
diffuse,
|
vec4 fragEyeVector = invViewMat * vec4(-position, 0.0);
|
||||||
specular,
|
vec3 fragEyeDir = normalize(fragEyeVector.xyz);
|
||||||
gloss);
|
|
||||||
return color;
|
vec3 color = diffuse.rgb * 0.5 * evalSphericalLight(ambientSphere, fragNormal).xyz;
|
||||||
|
|
||||||
|
vec4 shading = evalFragShading(fragNormal, getLightDirection(light), fragEyeDir, specular, gloss);
|
||||||
|
|
||||||
|
color += vec3(diffuse + shading.rgb) * shading.w * shadowAttenuation * getLightColor(light) * getLightIntensity(light);
|
||||||
|
|
||||||
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 evalLightmappedColor(float shadowAttenuation, vec3 normal, vec3 diffuse, vec3 lightmap) {
|
vec3 evalLightmappedColor(float shadowAttenuation, vec3 normal, vec3 diffuse, vec3 lightmap) {
|
||||||
|
|
|
@ -45,146 +45,6 @@
|
||||||
#include "point_light_frag.h"
|
#include "point_light_frag.h"
|
||||||
#include "spot_light_frag.h"
|
#include "spot_light_frag.h"
|
||||||
|
|
||||||
class SphericalHarmonics {
|
|
||||||
public:
|
|
||||||
glm::vec3 L00 ; float spare0;
|
|
||||||
glm::vec3 L1m1 ; float spare1;
|
|
||||||
glm::vec3 L10 ; float spare2;
|
|
||||||
glm::vec3 L11 ; float spare3;
|
|
||||||
glm::vec3 L2m2 ; float spare4;
|
|
||||||
glm::vec3 L2m1 ; float spare5;
|
|
||||||
glm::vec3 L20 ; float spare6;
|
|
||||||
glm::vec3 L21 ; float spare7;
|
|
||||||
glm::vec3 L22 ; float spare8;
|
|
||||||
|
|
||||||
static const int NUM_COEFFICIENTS = 9;
|
|
||||||
|
|
||||||
void assignPreset(int p) {
|
|
||||||
switch (p) {
|
|
||||||
case DeferredLightingEffect::OLD_TOWN_SQUARE: {
|
|
||||||
L00 = glm::vec3( 0.871297f, 0.875222f, 0.864470f);
|
|
||||||
L1m1 = glm::vec3( 0.175058f, 0.245335f, 0.312891f);
|
|
||||||
L10 = glm::vec3( 0.034675f, 0.036107f, 0.037362f);
|
|
||||||
L11 = glm::vec3(-0.004629f,-0.029448f,-0.048028f);
|
|
||||||
L2m2 = glm::vec3(-0.120535f,-0.121160f,-0.117507f);
|
|
||||||
L2m1 = glm::vec3( 0.003242f, 0.003624f, 0.007511f);
|
|
||||||
L20 = glm::vec3(-0.028667f,-0.024926f,-0.020998f);
|
|
||||||
L21 = glm::vec3(-0.077539f,-0.086325f,-0.091591f);
|
|
||||||
L22 = glm::vec3(-0.161784f,-0.191783f,-0.219152f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::GRACE_CATHEDRAL: {
|
|
||||||
L00 = glm::vec3( 0.79f, 0.44f, 0.54f);
|
|
||||||
L1m1 = glm::vec3( 0.39f, 0.35f, 0.60f);
|
|
||||||
L10 = glm::vec3(-0.34f, -0.18f, -0.27f);
|
|
||||||
L11 = glm::vec3(-0.29f, -0.06f, 0.01f);
|
|
||||||
L2m2 = glm::vec3(-0.11f, -0.05f, -0.12f);
|
|
||||||
L2m1 = glm::vec3(-0.26f, -0.22f, -0.47f);
|
|
||||||
L20 = glm::vec3(-0.16f, -0.09f, -0.15f);
|
|
||||||
L21 = glm::vec3( 0.56f, 0.21f, 0.14f);
|
|
||||||
L22 = glm::vec3( 0.21f, -0.05f, -0.30f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::EUCALYPTUS_GROVE: {
|
|
||||||
L00 = glm::vec3( 0.38f, 0.43f, 0.45f);
|
|
||||||
L1m1 = glm::vec3( 0.29f, 0.36f, 0.41f);
|
|
||||||
L10 = glm::vec3( 0.04f, 0.03f, 0.01f);
|
|
||||||
L11 = glm::vec3(-0.10f, -0.10f, -0.09f);
|
|
||||||
L2m2 = glm::vec3(-0.06f, -0.06f, -0.04f);
|
|
||||||
L2m1 = glm::vec3( 0.01f, -0.01f, -0.05f);
|
|
||||||
L20 = glm::vec3(-0.09f, -0.13f, -0.15f);
|
|
||||||
L21 = glm::vec3(-0.06f, -0.05f, -0.04f);
|
|
||||||
L22 = glm::vec3( 0.02f, 0.00f, -0.05f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::ST_PETERS_BASILICA: {
|
|
||||||
L00 = glm::vec3( 0.36f, 0.26f, 0.23f);
|
|
||||||
L1m1 = glm::vec3( 0.18f, 0.14f, 0.13f);
|
|
||||||
L10 = glm::vec3(-0.02f, -0.01f, 0.00f);
|
|
||||||
L11 = glm::vec3( 0.03f, 0.02f, -0.00f);
|
|
||||||
L2m2 = glm::vec3( 0.02f, 0.01f, -0.00f);
|
|
||||||
L2m1 = glm::vec3(-0.05f, -0.03f, -0.01f);
|
|
||||||
L20 = glm::vec3(-0.09f, -0.08f, -0.07f);
|
|
||||||
L21 = glm::vec3( 0.01f, 0.00f, 0.00f);
|
|
||||||
L22 = glm::vec3(-0.08f, -0.03f, -0.00f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::UFFIZI_GALLERY: {
|
|
||||||
L00 = glm::vec3( 0.32f, 0.31f, 0.35f);
|
|
||||||
L1m1 = glm::vec3( 0.37f, 0.37f, 0.43f);
|
|
||||||
L10 = glm::vec3( 0.00f, 0.00f, 0.00f);
|
|
||||||
L11 = glm::vec3(-0.01f, -0.01f, -0.01f);
|
|
||||||
L2m2 = glm::vec3(-0.02f, -0.02f, -0.03f);
|
|
||||||
L2m1 = glm::vec3(-0.01f, -0.01f, -0.01f);
|
|
||||||
L20 = glm::vec3(-0.28f, -0.28f, -0.32f);
|
|
||||||
L21 = glm::vec3( 0.00f, 0.00f, 0.00f);
|
|
||||||
L22 = glm::vec3(-0.24f, -0.24f, -0.28f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::GALILEOS_TOMB: {
|
|
||||||
L00 = glm::vec3( 1.04f, 0.76f, 0.71f);
|
|
||||||
L1m1 = glm::vec3( 0.44f, 0.34f, 0.34f);
|
|
||||||
L10 = glm::vec3(-0.22f, -0.18f, -0.17f);
|
|
||||||
L11 = glm::vec3( 0.71f, 0.54f, 0.56f);
|
|
||||||
L2m2 = glm::vec3( 0.64f, 0.50f, 0.52f);
|
|
||||||
L2m1 = glm::vec3(-0.12f, -0.09f, -0.08f);
|
|
||||||
L20 = glm::vec3(-0.37f, -0.28f, -0.32f);
|
|
||||||
L21 = glm::vec3(-0.17f, -0.13f, -0.13f);
|
|
||||||
L22 = glm::vec3( 0.55f, 0.42f, 0.42f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::VINE_STREET_KITCHEN: {
|
|
||||||
L00 = glm::vec3( 0.64f, 0.67f, 0.73f);
|
|
||||||
L1m1 = glm::vec3( 0.28f, 0.32f, 0.33f);
|
|
||||||
L10 = glm::vec3( 0.42f, 0.60f, 0.77f);
|
|
||||||
L11 = glm::vec3(-0.05f, -0.04f, -0.02f);
|
|
||||||
L2m2 = glm::vec3(-0.10f, -0.08f, -0.05f);
|
|
||||||
L2m1 = glm::vec3( 0.25f, 0.39f, 0.53f);
|
|
||||||
L20 = glm::vec3( 0.38f, 0.54f, 0.71f);
|
|
||||||
L21 = glm::vec3( 0.06f, 0.01f, -0.02f);
|
|
||||||
L22 = glm::vec3(-0.03f, -0.02f, -0.03f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::BREEZEWAY: {
|
|
||||||
L00 = glm::vec3( 0.32f, 0.36f, 0.38f);
|
|
||||||
L1m1 = glm::vec3( 0.37f, 0.41f, 0.45f);
|
|
||||||
L10 = glm::vec3(-0.01f, -0.01f, -0.01f);
|
|
||||||
L11 = glm::vec3(-0.10f, -0.12f, -0.12f);
|
|
||||||
L2m2 = glm::vec3(-0.13f, -0.15f, -0.17f);
|
|
||||||
L2m1 = glm::vec3(-0.01f, -0.02f, 0.02f);
|
|
||||||
L20 = glm::vec3(-0.07f, -0.08f, -0.09f);
|
|
||||||
L21 = glm::vec3( 0.02f, 0.03f, 0.03f);
|
|
||||||
L22 = glm::vec3(-0.29f, -0.32f, -0.36f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::CAMPUS_SUNSET: {
|
|
||||||
L00 = glm::vec3( 0.79f, 0.94f, 0.98f);
|
|
||||||
L1m1 = glm::vec3( 0.44f, 0.56f, 0.70f);
|
|
||||||
L10 = glm::vec3(-0.10f, -0.18f, -0.27f);
|
|
||||||
L11 = glm::vec3( 0.45f, 0.38f, 0.20f);
|
|
||||||
L2m2 = glm::vec3( 0.18f, 0.14f, 0.05f);
|
|
||||||
L2m1 = glm::vec3(-0.14f, -0.22f, -0.31f);
|
|
||||||
L20 = glm::vec3(-0.39f, -0.40f, -0.36f);
|
|
||||||
L21 = glm::vec3( 0.09f, 0.07f, 0.04f);
|
|
||||||
L22 = glm::vec3( 0.67f, 0.67f, 0.52f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeferredLightingEffect::FUNSTON_BEACH_SUNSET: {
|
|
||||||
L00 = glm::vec3( 0.68f, 0.69f, 0.70f);
|
|
||||||
L1m1 = glm::vec3( 0.32f, 0.37f, 0.44f);
|
|
||||||
L10 = glm::vec3(-0.17f, -0.17f, -0.17f);
|
|
||||||
L11 = glm::vec3(-0.45f, -0.42f, -0.34f);
|
|
||||||
L2m2 = glm::vec3(-0.17f, -0.17f, -0.15f);
|
|
||||||
L2m1 = glm::vec3(-0.08f, -0.09f, -0.10f);
|
|
||||||
L20 = glm::vec3(-0.03f, -0.02f, -0.01f);
|
|
||||||
L21 = glm::vec3( 0.16f, 0.14f, 0.10f);
|
|
||||||
L22 = glm::vec3( 0.37f, 0.31f, 0.20f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) {
|
void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) {
|
||||||
_viewState = viewState;
|
_viewState = viewState;
|
||||||
_simpleProgram.addShaderFromSourceCode(QGLShader::Vertex, simple_vert);
|
_simpleProgram.addShaderFromSourceCode(QGLShader::Vertex, simple_vert);
|
||||||
|
@ -220,6 +80,7 @@ void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) {
|
||||||
lp->setColor(glm::vec3(1.0f));
|
lp->setColor(glm::vec3(1.0f));
|
||||||
lp->setIntensity(1.0f);
|
lp->setIntensity(1.0f);
|
||||||
lp->setType(model::Light::SUN);
|
lp->setType(model::Light::SUN);
|
||||||
|
lp->setAmbientSpherePreset(model::SphericalHarmonics::Preset(_ambientLightMode % model::SphericalHarmonics::NUM_PRESET));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeferredLightingEffect::bindSimpleProgram() {
|
void DeferredLightingEffect::bindSimpleProgram() {
|
||||||
|
@ -285,7 +146,7 @@ void DeferredLightingEffect::addSpotLight(const glm::vec3& position, float radiu
|
||||||
lp->setMaximumRadius(radius);
|
lp->setMaximumRadius(radius);
|
||||||
lp->setColor(diffuse);
|
lp->setColor(diffuse);
|
||||||
lp->setIntensity(1.0f);
|
lp->setIntensity(1.0f);
|
||||||
lp->setShowVolumeContour(quadraticAttenuation);
|
//lp->setShowContour(quadraticAttenuation);
|
||||||
|
|
||||||
if (exponent == 0.0f && cutoff == PI) {
|
if (exponent == 0.0f && cutoff == PI) {
|
||||||
lp->setType(model::Light::POINT);
|
lp->setType(model::Light::POINT);
|
||||||
|
@ -396,25 +257,19 @@ void DeferredLightingEffect::render() {
|
||||||
program->bind();
|
program->bind();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (locations->ambientSphere >= 0) {
|
|
||||||
SphericalHarmonics sh;
|
|
||||||
if (_ambientLightMode < NUM_PRESET) {
|
|
||||||
sh.assignPreset(_ambientLightMode);
|
|
||||||
} else {
|
|
||||||
sh.assignPreset(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i =0; i <SphericalHarmonics::NUM_COEFFICIENTS; i++) {
|
|
||||||
program->setUniformValue(locations->ambientSphere + i, *(((QVector4D*) &sh) + i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
auto light = _allocatedLights[_globalLights.front()];
|
auto globalLight = _allocatedLights[_globalLights.front()];
|
||||||
|
|
||||||
|
if (locations->ambientSphere >= 0) {
|
||||||
|
auto sh = globalLight->getAmbientSphere();
|
||||||
|
for (int i =0; i <model::SphericalHarmonics::NUM_COEFFICIENTS; i++) {
|
||||||
|
program->setUniformValue(locations->ambientSphere + i, *(((QVector4D*) &sh) + i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (locations->lightBufferUnit >= 0) {
|
if (locations->lightBufferUnit >= 0) {
|
||||||
gpu::Batch batch;
|
gpu::Batch batch;
|
||||||
batch.setUniformBuffer(locations->lightBufferUnit, light->getSchemaBuffer());
|
batch.setUniformBuffer(locations->lightBufferUnit, globalLight->getSchemaBuffer());
|
||||||
gpu::GLBackend::renderBatch(batch);
|
gpu::GLBackend::renderBatch(batch);
|
||||||
}
|
}
|
||||||
glUniformMatrix4fv(locations->invViewMat, 1, false, reinterpret_cast< const GLfloat* >(&invViewMat));
|
glUniformMatrix4fv(locations->invViewMat, 1, false, reinterpret_cast< const GLfloat* >(&invViewMat));
|
||||||
|
@ -662,7 +517,16 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeferredLightingEffect::setAmbientLightMode(int preset) {
|
void DeferredLightingEffect::setAmbientLightMode(int preset) {
|
||||||
if ((preset >= -1) && (preset < NUM_PRESET)) {
|
if ((preset >= -1) && (preset < model::SphericalHarmonics::NUM_PRESET)) {
|
||||||
_ambientLightMode = preset;
|
_ambientLightMode = preset;
|
||||||
|
auto light = _allocatedLights.front();
|
||||||
|
light->setAmbientSpherePreset(model::SphericalHarmonics::Preset(preset % model::SphericalHarmonics::NUM_PRESET));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeferredLightingEffect::setGlobalLight(const glm::vec3& direction, const glm::vec3& diffuse, float intensity) {
|
||||||
|
auto light = _allocatedLights.front();
|
||||||
|
light->setDirection(direction);
|
||||||
|
light->setColor(diffuse);
|
||||||
|
light->setIntensity(intensity);
|
||||||
|
}
|
||||||
|
|
|
@ -73,22 +73,9 @@ public:
|
||||||
void prepare();
|
void prepare();
|
||||||
void render();
|
void render();
|
||||||
|
|
||||||
enum AmbientLightPreset {
|
// update global lighting
|
||||||
OLD_TOWN_SQUARE = 0,
|
|
||||||
GRACE_CATHEDRAL,
|
|
||||||
EUCALYPTUS_GROVE,
|
|
||||||
ST_PETERS_BASILICA,
|
|
||||||
UFFIZI_GALLERY,
|
|
||||||
GALILEOS_TOMB,
|
|
||||||
VINE_STREET_KITCHEN,
|
|
||||||
BREEZEWAY,
|
|
||||||
CAMPUS_SUNSET,
|
|
||||||
FUNSTON_BEACH_SUNSET,
|
|
||||||
|
|
||||||
NUM_PRESET,
|
|
||||||
};
|
|
||||||
|
|
||||||
void setAmbientLightMode(int preset);
|
void setAmbientLightMode(int preset);
|
||||||
|
void setGlobalLight(const glm::vec3& direction, const glm::vec3& diffuse, float intensity);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DeferredLightingEffect() {}
|
DeferredLightingEffect() {}
|
||||||
|
|
Loading…
Reference in a new issue