diff --git a/interface/resources/shaders/shadow_map.frag b/interface/resources/shaders/shadow_map.frag new file mode 100644 index 0000000000..4bd8b8b768 --- /dev/null +++ b/interface/resources/shaders/shadow_map.frag @@ -0,0 +1,16 @@ +#version 120 + +// +// shadow_map.frag +// fragment shader +// +// Created by Andrzej Kapolka on 11/21/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +uniform sampler2DShadow shadowMap; + +void main(void) { + gl_FragColor = gl_Color * mix(vec4(0.8, 0.8, 0.8, 1.0), vec4(1.0, 1.0, 1.0, 1.0), + shadow2D(shadowMap, gl_TexCoord[0].stp)); +} diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d5f68aa558..a6a5a9e20f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2782,7 +2782,7 @@ void Application::updateShadowMap() { glm::vec3 lightDirection = -getSunDirection(); glm::quat rotation = glm::inverse(rotationBetween(IDENTITY_FRONT, lightDirection)); glm::vec3 translation = glm::vec3(); - float nearScale = 0.0f; // (1.0f - _viewFrustum.getNearClip()) / (_viewFrustum.getFarClip() - _viewFrustum.getNearClip()); + float nearScale = 0.0f; float farScale = (2.0f - _viewFrustum.getNearClip()) / (_viewFrustum.getFarClip() - _viewFrustum.getNearClip()); loadViewFrustum(_myCamera, _viewFrustum); glm::vec3 points[] = { @@ -2794,13 +2794,6 @@ void Application::updateShadowMap() { rotation * (glm::mix(_viewFrustum.getNearTopRight(), _viewFrustum.getFarTopRight(), farScale) + translation), rotation * (glm::mix(_viewFrustum.getNearBottomLeft(), _viewFrustum.getFarBottomLeft(), farScale) + translation), rotation * (glm::mix(_viewFrustum.getNearBottomRight(), _viewFrustum.getFarBottomRight(), farScale) + translation) }; - /* glm::vec3 points[] = { - rotation * (_myAvatar.getPosition() + glm::vec3(-1, 0, 0) + translation), - rotation * (_myAvatar.getPosition() + glm::vec3(1, 0, 0) + translation), - rotation * (_myAvatar.getPosition() + glm::vec3(0, -1, 0) + translation), - rotation * (_myAvatar.getPosition() + glm::vec3(0, 1, 0) + translation), - rotation * (_myAvatar.getPosition() + glm::vec3(0, 0, -1) + translation), - rotation * (_myAvatar.getPosition() + glm::vec3(0, 0, 1) + translation) }; */ glm::vec3 minima(FLT_MAX, FLT_MAX, FLT_MAX), maxima(-FLT_MAX, -FLT_MAX, -FLT_MAX); for (int i = 0; i < sizeof(points) / sizeof(points[0]); i++) { minima = glm::min(minima, points[i]); @@ -3391,29 +3384,6 @@ void Application::displayOverlay() { // render the webcam input frame _webcam.renderPreview(_glWidget->width(), _glWidget->height()); - if (Menu::getInstance()->isOptionChecked(MenuOption::Shadows) && false) { - glBindTexture(GL_TEXTURE_2D, _textureCache.getShadowFramebufferObject()->texture()); - glEnable(GL_TEXTURE_2D); - glColor3f(1.0f, 1.0f, 1.0f); - - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); - glVertex2f(500, 500); - - glTexCoord2f(1.0f, 0.0f); - glVertex2f(1000, 500); - - glTexCoord2f(1.0f, 1.0f); - glVertex2f(1000, 0); - - glTexCoord2f(0.0f, 1.0f); - glVertex2f(500, 0); - glEnd(); - - glDisable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); - } - _palette.render(_glWidget->width(), _glWidget->height()); QAction* paintColorAction = NULL; diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index c4e700ad82..2b4ca7839a 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -519,6 +519,13 @@ void VoxelSystem::initVoxelMemory() { _perlinModulateProgram.bind(); _perlinModulateProgram.setUniformValue("permutationNormalTexture", 0); _perlinModulateProgram.release(); + + _shadowMapProgram.addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/shadow_map.frag"); + _shadowMapProgram.link(); + + _shadowMapProgram.bind(); + _shadowMapProgram.setUniformValue("shadowMap", 0); + _shadowMapProgram.release(); } } @@ -1080,6 +1087,7 @@ glm::vec3 VoxelSystem::computeVoxelVertex(const glm::vec3& startVertex, float vo } ProgramObject VoxelSystem::_perlinModulateProgram; +ProgramObject VoxelSystem::_shadowMapProgram; void VoxelSystem::init() { if (_initialized) { @@ -1388,6 +1396,7 @@ void VoxelSystem::render(bool texture) { void VoxelSystem::applyScaleAndBindProgram(bool texture) { if (Menu::getInstance()->isOptionChecked(MenuOption::Shadows)) { + _shadowMapProgram.bind(); glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getShadowDepthTextureID()); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); @@ -1412,6 +1421,7 @@ void VoxelSystem::removeScaleAndReleaseProgram(bool texture) { glPopMatrix(); if (Menu::getInstance()->isOptionChecked(MenuOption::Shadows)) { + _shadowMapProgram.release(); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); diff --git a/interface/src/VoxelSystem.h b/interface/src/VoxelSystem.h index 0fdbb5b884..d9c672fdf3 100644 --- a/interface/src/VoxelSystem.h +++ b/interface/src/VoxelSystem.h @@ -282,6 +282,7 @@ private: bool _voxelsDirty; static ProgramObject _perlinModulateProgram; + static ProgramObject _shadowMapProgram; int _hookID; std::vector _freeIndexes;