mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-17 10:30:47 +02:00
#15 clear RT before render for TBR
This commit is contained in:
16
src/cache.h
16
src/cache.h
@@ -288,6 +288,8 @@ struct AmbientCache {
|
|||||||
float(max((s.floor - 2) * 256, (s.floor + s.ceiling) * 256 / 2)),
|
float(max((s.floor - 2) * 256, (s.floor + s.ceiling) * 256 / 2)),
|
||||||
float((sector % r.zSectors) * 1024 + 512 + r.info.z));
|
float((sector % r.zSectors) * 1024 + 512 + r.info.z));
|
||||||
|
|
||||||
|
Core::setClearColor(vec4(0, 0, 0, 1));
|
||||||
|
|
||||||
// first pass - render environment from position (room geometry & static meshes)
|
// first pass - render environment from position (room geometry & static meshes)
|
||||||
game->renderEnvironment(room, pos, textures, 4);
|
game->renderEnvironment(room, pos, textures, 4);
|
||||||
|
|
||||||
@@ -304,7 +306,7 @@ struct AmbientCache {
|
|||||||
for (int j = 0; j < 6; j++) {
|
for (int j = 0; j < 6; j++) {
|
||||||
Texture *src = textures[j * 4 + i - 1];
|
Texture *src = textures[j * 4 + i - 1];
|
||||||
Texture *dst = textures[j * 4 + i];
|
Texture *dst = textures[j * 4 + i];
|
||||||
Core::setRenderTarget(dst, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR);
|
Core::setTarget(dst, RT_STORE_COLOR);
|
||||||
src->bind(sDiffuse);
|
src->bind(sDiffuse);
|
||||||
game->getMesh()->renderQuad();
|
game->getMesh()->renderQuad();
|
||||||
}
|
}
|
||||||
@@ -312,11 +314,12 @@ struct AmbientCache {
|
|||||||
|
|
||||||
// get result color from 1x1 textures
|
// get result color from 1x1 textures
|
||||||
for (int j = 0; j < 6; j++) {
|
for (int j = 0; j < 6; j++) {
|
||||||
Core::setRenderTarget(textures[j * 4 + 3], RT_STORE_COLOR);
|
Core::setTarget(textures[j * 4 + 3], RT_LOAD_COLOR);
|
||||||
colors[j] = Core::copyPixel(0, 0).xyz();
|
colors[j] = Core::copyPixel(0, 0).xyz();
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::setDepthTest(true);
|
Core::setDepthTest(true);
|
||||||
|
Core::setClearColor(vec4(0, 0, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void processQueue() {
|
void processQueue() {
|
||||||
@@ -628,7 +631,7 @@ struct WaterCache {
|
|||||||
Core::active.shader->setParam(uParam, vec4(p.x, p.z, drop.radius * DETAIL, -drop.strength));
|
Core::active.shader->setParam(uParam, vec4(p.x, p.z, drop.radius * DETAIL, -drop.strength));
|
||||||
|
|
||||||
item.data[0]->bind(sDiffuse);
|
item.data[0]->bind(sDiffuse);
|
||||||
Core::setRenderTarget(item.data[1], RT_STORE_COLOR);
|
Core::setTarget(item.data[1], RT_STORE_COLOR);
|
||||||
Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f));
|
Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f));
|
||||||
game->getMesh()->renderQuad();
|
game->getMesh()->renderQuad();
|
||||||
swap(item.data[0], item.data[1]);
|
swap(item.data[0], item.data[1]);
|
||||||
@@ -636,7 +639,6 @@ struct WaterCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void step(Item &item) {
|
void step(Item &item) {
|
||||||
item.timer = SIMULATE_TIMESTEP;
|
|
||||||
if (item.timer < SIMULATE_TIMESTEP) return;
|
if (item.timer < SIMULATE_TIMESTEP) return;
|
||||||
|
|
||||||
game->setShader(Core::passWater, Shader::WATER_STEP);
|
game->setShader(Core::passWater, Shader::WATER_STEP);
|
||||||
@@ -646,7 +648,7 @@ struct WaterCache {
|
|||||||
while (item.timer >= SIMULATE_TIMESTEP) {
|
while (item.timer >= SIMULATE_TIMESTEP) {
|
||||||
// water step
|
// water step
|
||||||
item.data[0]->bind(sDiffuse);
|
item.data[0]->bind(sDiffuse);
|
||||||
Core::setRenderTarget(item.data[1], RT_STORE_COLOR);
|
Core::setTarget(item.data[1], RT_STORE_COLOR);
|
||||||
Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f));
|
Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f));
|
||||||
game->getMesh()->renderQuad();
|
game->getMesh()->renderQuad();
|
||||||
swap(item.data[0], item.data[1]);
|
swap(item.data[0], item.data[1]);
|
||||||
@@ -665,7 +667,7 @@ struct WaterCache {
|
|||||||
|
|
||||||
Core::whiteTex->bind(sReflect);
|
Core::whiteTex->bind(sReflect);
|
||||||
item.data[0]->bind(sNormal);
|
item.data[0]->bind(sNormal);
|
||||||
Core::setRenderTarget(item.caustics, RT_STORE_COLOR);
|
Core::setTarget(item.caustics, RT_STORE_COLOR);
|
||||||
game->getMesh()->renderPlane();
|
game->getMesh()->renderPlane();
|
||||||
#ifdef BLUR_CAUSTICS
|
#ifdef BLUR_CAUSTICS
|
||||||
// v blur
|
// v blur
|
||||||
@@ -765,7 +767,7 @@ struct WaterCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// render mirror reflection
|
// render mirror reflection
|
||||||
Core::setRenderTarget(reflect, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR);
|
Core::setTarget(reflect, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR);
|
||||||
Camera *camera = (Camera*)game->getCamera();
|
Camera *camera = (Camera*)game->getCamera();
|
||||||
game->setupBinding();
|
game->setupBinding();
|
||||||
|
|
||||||
|
18
src/core.h
18
src/core.h
@@ -22,6 +22,8 @@
|
|||||||
#undef OS_PTHREAD_MT
|
#undef OS_PTHREAD_MT
|
||||||
#elif ANDROID
|
#elif ANDROID
|
||||||
#define MOBILE
|
#define MOBILE
|
||||||
|
#define RENDER_TBR
|
||||||
|
|
||||||
#include <GLES2/gl2.h>
|
#include <GLES2/gl2.h>
|
||||||
#include <GLES2/gl2ext.h>
|
#include <GLES2/gl2ext.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
@@ -57,6 +59,8 @@
|
|||||||
extern void osToggleVR(bool enable);
|
extern void osToggleVR(bool enable);
|
||||||
#elif __RPI__
|
#elif __RPI__
|
||||||
#define MOBILE
|
#define MOBILE
|
||||||
|
#define RENDER_TBR
|
||||||
|
|
||||||
#include <GLES2/gl2.h>
|
#include <GLES2/gl2.h>
|
||||||
#include <GLES2/gl2ext.h>
|
#include <GLES2/gl2ext.h>
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
@@ -101,6 +105,8 @@
|
|||||||
|
|
||||||
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
|
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
|
||||||
#define MOBILE
|
#define MOBILE
|
||||||
|
#define RENDER_TBR
|
||||||
|
|
||||||
#include <OpenGLES/ES2/gl.h>
|
#include <OpenGLES/ES2/gl.h>
|
||||||
#include <OpenGLES/ES2/glext.h>
|
#include <OpenGLES/ES2/glext.h>
|
||||||
#include <OpenGLES/ES3/glext.h>
|
#include <OpenGLES/ES3/glext.h>
|
||||||
@@ -1237,6 +1243,8 @@ namespace Core {
|
|||||||
sceGuDrawBufferList(GU_PSM_5650, target->offset, target->width);
|
sceGuDrawBufferList(GU_PSM_5650, target->offset, target->width);
|
||||||
*/
|
*/
|
||||||
#else
|
#else
|
||||||
|
bool depth = false;
|
||||||
|
|
||||||
Core::stats.rt++;
|
Core::stats.rt++;
|
||||||
if (!target) { // may be a null
|
if (!target) { // may be a null
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
|
glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
|
||||||
@@ -1245,7 +1253,8 @@ namespace Core {
|
|||||||
if (target->opt & Texture::CUBEMAP)
|
if (target->opt & Texture::CUBEMAP)
|
||||||
texTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + face;
|
texTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + face;
|
||||||
|
|
||||||
bool depth = target->format == Texture::DEPTH || target->format == Texture::SHADOW;
|
depth = target->format == Texture::DEPTH || target->format == Texture::SHADOW;
|
||||||
|
|
||||||
int rtIndex = cacheRenderTarget(depth, target->width, target->height);
|
int rtIndex = cacheRenderTarget(depth, target->width, target->height);
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
|
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
|
||||||
@@ -1254,6 +1263,11 @@ namespace Core {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RENDER_TBR
|
||||||
|
if (!(reqTarget.op & RT_LOAD_COLOR) && !depth) reqTarget.op |= RT_CLEAR_COLOR;
|
||||||
|
if (!(reqTarget.op & RT_LOAD_DEPTH) && depth) reqTarget.op |= RT_CLEAR_DEPTH;
|
||||||
|
#endif
|
||||||
|
|
||||||
active.target = target;
|
active.target = target;
|
||||||
active.targetOp = reqTarget.op;
|
active.targetOp = reqTarget.op;
|
||||||
active.targetFace = face;
|
active.targetFace = face;
|
||||||
@@ -1454,7 +1468,7 @@ namespace Core {
|
|||||||
renderState &= ~RS_DEPTH_TEST;
|
renderState &= ~RS_DEPTH_TEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRenderTarget(Texture *target, int op, int face = 0) {
|
void setTarget(Texture *target, int op, int face = 0) {
|
||||||
if (!target)
|
if (!target)
|
||||||
target = defaultTarget;
|
target = defaultTarget;
|
||||||
|
|
||||||
|
@@ -1121,21 +1121,21 @@ struct Inventory {
|
|||||||
//
|
//
|
||||||
#else
|
#else
|
||||||
// vertical blur
|
// vertical blur
|
||||||
Core::setRenderTarget(background[1], RT_STORE_COLOR);
|
Core::setTarget(background[1], RT_STORE_COLOR);
|
||||||
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
|
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
|
||||||
Core::active.shader->setParam(uParam, vec4(0, 1, 1.0f / INVENTORY_BG_SIZE, 0));;
|
Core::active.shader->setParam(uParam, vec4(0, 1, 1.0f / INVENTORY_BG_SIZE, 0));;
|
||||||
background[0]->bind(sDiffuse);
|
background[0]->bind(sDiffuse);
|
||||||
game->getMesh()->renderQuad();
|
game->getMesh()->renderQuad();
|
||||||
|
|
||||||
// horizontal blur
|
// horizontal blur
|
||||||
Core::setRenderTarget(background[0], RT_STORE_COLOR);
|
Core::setTarget(background[0], RT_STORE_COLOR);
|
||||||
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
|
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
|
||||||
Core::active.shader->setParam(uParam, vec4(1, 0, 1.0f / INVENTORY_BG_SIZE, 0));;
|
Core::active.shader->setParam(uParam, vec4(1, 0, 1.0f / INVENTORY_BG_SIZE, 0));;
|
||||||
background[1]->bind(sDiffuse);
|
background[1]->bind(sDiffuse);
|
||||||
game->getMesh()->renderQuad();
|
game->getMesh()->renderQuad();
|
||||||
|
|
||||||
// grayscale
|
// grayscale
|
||||||
Core::setRenderTarget(background[1], RT_STORE_COLOR);
|
Core::setTarget(background[1], RT_STORE_COLOR);
|
||||||
game->setShader(Core::passFilter, Shader::FILTER_GRAYSCALE, false, false);
|
game->setShader(Core::passFilter, Shader::FILTER_GRAYSCALE, false, false);
|
||||||
Core::active.shader->setParam(uParam, vec4(1, 0, 0, 0));
|
Core::active.shader->setParam(uParam, vec4(1, 0, 0, 0));
|
||||||
background[0]->bind(sDiffuse);
|
background[0]->bind(sDiffuse);
|
||||||
|
18
src/level.h
18
src/level.h
@@ -414,18 +414,22 @@ struct Level : IGame {
|
|||||||
|
|
||||||
virtual void renderEnvironment(int roomIndex, const vec3 &pos, Texture **targets, int stride = 0, Core::Pass pass = Core::passAmbient) {
|
virtual void renderEnvironment(int roomIndex, const vec3 &pos, Texture **targets, int stride = 0, Core::Pass pass = Core::passAmbient) {
|
||||||
PROFILE_MARKER("ENVIRONMENT");
|
PROFILE_MARKER("ENVIRONMENT");
|
||||||
Core::eye = 0.0f;
|
|
||||||
setupBinding();
|
setupBinding();
|
||||||
|
float tmpEye = Core::eye;
|
||||||
Core::Pass tmpPass = Core::pass;
|
Core::Pass tmpPass = Core::pass;
|
||||||
// first pass render level into cube faces
|
Core::eye = 0.0f;
|
||||||
|
|
||||||
|
// render level into cube faces or texture images
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
setupCubeCamera(pos, i);
|
setupCubeCamera(pos, i);
|
||||||
Core::pass = pass;
|
Core::pass = pass;
|
||||||
Texture *target = (targets[0]->opt & Texture::CUBEMAP) ? targets[0] : targets[i * stride];
|
Texture *target = (targets[0]->opt & Texture::CUBEMAP) ? targets[0] : targets[i * stride];
|
||||||
Core::setRenderTarget(target, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR, i);
|
Core::setTarget(target, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR, i);
|
||||||
renderView(roomIndex, false, false);
|
renderView(roomIndex, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::pass = tmpPass;
|
Core::pass = tmpPass;
|
||||||
|
Core::eye = tmpEye;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setEffect(Controller *controller, TR::Effect::Type effect) {
|
virtual void setEffect(Controller *controller, TR::Effect::Type effect) {
|
||||||
@@ -1869,7 +1873,7 @@ struct Level : IGame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (water) {
|
if (water) {
|
||||||
Core::setRenderTarget(NULL, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR); // render to back buffer
|
Core::setTarget(NULL, RT_CLEAR_COLOR | RT_CLEAR_DEPTH | RT_STORE_COLOR); // render to back buffer
|
||||||
setupBinding();
|
setupBinding();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2041,7 +2045,7 @@ struct Level : IGame {
|
|||||||
bool colorShadow = shadow->format == Texture::RGBA ? true : false;
|
bool colorShadow = shadow->format == Texture::RGBA ? true : false;
|
||||||
if (colorShadow)
|
if (colorShadow)
|
||||||
Core::setClearColor(vec4(1.0f));
|
Core::setClearColor(vec4(1.0f));
|
||||||
Core::setRenderTarget(shadow, RT_CLEAR_DEPTH | (colorShadow ? (RT_CLEAR_COLOR | RT_STORE_COLOR) : RT_STORE_DEPTH));
|
Core::setTarget(shadow, RT_CLEAR_DEPTH | (colorShadow ? (RT_CLEAR_COLOR | RT_STORE_COLOR) : RT_STORE_DEPTH));
|
||||||
Core::validateRenderState();
|
Core::validateRenderState();
|
||||||
|
|
||||||
Core::setCulling(cfBack);
|
Core::setCulling(cfBack);
|
||||||
@@ -2478,7 +2482,7 @@ struct Level : IGame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void renderInventory() {
|
void renderInventory() {
|
||||||
Core::setRenderTarget(NULL, RT_CLEAR_DEPTH | RT_STORE_COLOR);
|
Core::setTarget(NULL, RT_CLEAR_DEPTH | RT_STORE_COLOR);
|
||||||
|
|
||||||
if (!(level.isTitle() || inventory.titleTimer > 0.0f))
|
if (!(level.isTitle() || inventory.titleTimer > 0.0f))
|
||||||
inventory.renderBackground();
|
inventory.renderBackground();
|
||||||
@@ -2501,7 +2505,7 @@ struct Level : IGame {
|
|||||||
lastTitle = title;
|
lastTitle = title;
|
||||||
|
|
||||||
if (isEnded) {
|
if (isEnded) {
|
||||||
Core::setRenderTarget(NULL, RT_CLEAR_COLOR);
|
Core::setTarget(NULL, RT_CLEAR_COLOR);
|
||||||
UI::begin();
|
UI::begin();
|
||||||
UI::updateAspect(float(Core::width) / float(Core::height));
|
UI::updateAspect(float(Core::width) / float(Core::height));
|
||||||
UI::textOut(vec2(0, 480 - 16), STR_LOADING, UI::aCenter, UI::width);
|
UI::textOut(vec2(0, 480 - 16), STR_LOADING, UI::aCenter, UI::width);
|
||||||
|
@@ -4,18 +4,17 @@ R"====(
|
|||||||
precision highp float;
|
precision highp float;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OPT_CONTACT
|
#if defined(PASS_COMPOSE) && !defined(TYPE_FLASH)
|
||||||
varying vec3 vCoord;
|
varying vec3 vCoord;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
varying vec4 vTexCoord; // xy - atlas coords, zw - trapezoidal correction
|
varying vec4 vTexCoord; // xy - atlas coords, zw - trapezoidal correction
|
||||||
|
|
||||||
#ifdef OPT_CAUSTICS
|
#ifdef OPT_CAUSTICS
|
||||||
varying vec2 vCausticsCoord; // - xy caustics texture coord
|
|
||||||
uniform vec4 uRoomSize; // xy - minXZ, zw - maxXZ
|
uniform vec4 uRoomSize; // xy - minXZ, zw - maxXZ
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uniform mat4 uLightProj;
|
uniform mat4 uLightProj[SHADOW_OBJ_MAX];
|
||||||
uniform mat4 uViewProj;
|
uniform mat4 uViewProj;
|
||||||
uniform vec3 uViewPos;
|
uniform vec3 uViewPos;
|
||||||
uniform vec4 uParam; // x - time, y - water height, z - clip plane sign, w - clip plane height
|
uniform vec4 uParam; // x - time, y - water height, z - clip plane sign, w - clip plane height
|
||||||
@@ -32,7 +31,6 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
|
|
||||||
#ifndef TYPE_FLASH
|
#ifndef TYPE_FLASH
|
||||||
#ifdef PASS_COMPOSE
|
#ifdef PASS_COMPOSE
|
||||||
varying vec4 vLightProj;
|
|
||||||
varying vec4 vLightVec; // xyz - dir, w - fog factor
|
varying vec4 vLightVec; // xyz - dir, w - fog factor
|
||||||
|
|
||||||
#ifdef OPT_SHADOW
|
#ifdef OPT_SHADOW
|
||||||
@@ -131,7 +129,7 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
vLightVec.w = clamp(1.0 / exp(fog), 0.0, 1.0);
|
vLightVec.w = clamp(1.0 / exp(fog), 0.0, 1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OPT_CONTACT
|
#if defined(PASS_COMPOSE) && !defined(TYPE_FLASH)
|
||||||
vCoord = coord.xyz;
|
vCoord = coord.xyz;
|
||||||
#endif
|
#endif
|
||||||
return coord;
|
return coord;
|
||||||
@@ -227,10 +225,6 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
#if defined(PASS_COMPOSE) && !defined(TYPE_SPRITE)
|
#if defined(PASS_COMPOSE) && !defined(TYPE_SPRITE)
|
||||||
vTexCoord.xy *= vTexCoord.zw;
|
vTexCoord.xy *= vTexCoord.zw;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OPT_CAUSTICS
|
|
||||||
vCausticsCoord.xy = clamp((coord.xz - uRoomSize.xy) / (uRoomSize.zw - uRoomSize.xy), vec2(0.0), vec2(1.0));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
@@ -239,10 +233,6 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
#ifndef PASS_SHADOW
|
#ifndef PASS_SHADOW
|
||||||
_diffuse();
|
_diffuse();
|
||||||
_lighting(coord.xyz);
|
_lighting(coord.xyz);
|
||||||
|
|
||||||
#if defined(PASS_COMPOSE) && !defined(TYPE_FLASH)
|
|
||||||
vLightProj = uLightProj * coord;
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_uv(coord.xyz);
|
_uv(coord.xyz);
|
||||||
@@ -293,8 +283,6 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SHADOW_TEXEL (2.0 / SHADOW_TEX_SIZE)
|
|
||||||
|
|
||||||
float random(vec3 seed, float freq) {
|
float random(vec3 seed, float freq) {
|
||||||
float dt = dot(floor(seed * freq), vec3(53.1215, 21.1352, 9.1322));
|
float dt = dot(floor(seed * freq), vec3(53.1215, 21.1352, 9.1322));
|
||||||
return fract(sin(dt) * 2105.2354);
|
return fract(sin(dt) * 2105.2354);
|
||||||
@@ -308,8 +296,18 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
return vec3(v.x * sc.y + v.y * sc.x, v.x * -sc.x + v.y * sc.y, 0.0);
|
return vec3(v.x * sc.y + v.y * sc.x, v.x * -sc.x + v.y * sc.y, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
float getShadow(vec4 lightProj) {
|
float getShadow(vec4 lightProj, vec2 tileOffset) {
|
||||||
vec3 p = lightProj.xyz / lightProj.w;
|
vec3 p = lightProj.xyz / lightProj.w;
|
||||||
|
float vis =
|
||||||
|
#ifdef TYPE_ROOM
|
||||||
|
min(dot(vNormal.xyz, vLightVec.xyz), lightProj.w);
|
||||||
|
#else
|
||||||
|
lightProj.w;
|
||||||
|
#endif
|
||||||
|
vis = min(min(p.x, p.y), vis);
|
||||||
|
if (vis <= 0.0 || max(p.x, p.y) > 1.0) return 1.0;
|
||||||
|
|
||||||
|
p.xy = p.xy * vec2(0.25, 0.5) + tileOffset;
|
||||||
|
|
||||||
float rShadow = SHADOW(SHADOW_TEXEL * vec3(-0.93289, -0.03146, 0.0) + p) +
|
float rShadow = SHADOW(SHADOW_TEXEL * vec3(-0.93289, -0.03146, 0.0) + p) +
|
||||||
SHADOW(SHADOW_TEXEL * vec3( 0.81628, -0.05965, 0.0) + p) +
|
SHADOW(SHADOW_TEXEL * vec3( 0.81628, -0.05965, 0.0) + p) +
|
||||||
@@ -337,13 +335,17 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
return rShadow + (1.0 - rShadow) * fade;
|
return rShadow + (1.0 - rShadow) * fade;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getShadow() {
|
float getShadow() { // hardcoded for 4x2 shadow atlas
|
||||||
#ifdef TYPE_ROOM
|
vec4 c = vec4(vCoord, 1.0);
|
||||||
float vis = min(dot(vNormal.xyz, vLightVec.xyz), vLightProj.w);
|
return min(min(min(min(min(min(min(
|
||||||
#else
|
getShadow(uLightProj[0] * c, vec2(0.00, 0.0)),
|
||||||
float vis = vLightProj.w;
|
getShadow(uLightProj[1] * c, vec2(0.25, 0.0))),
|
||||||
#endif
|
getShadow(uLightProj[2] * c, vec2(0.50, 0.0))),
|
||||||
return vis > 0.0 ? getShadow(vLightProj) : 1.0;
|
getShadow(uLightProj[3] * c, vec2(0.75, 0.0))),
|
||||||
|
getShadow(uLightProj[4] * c, vec2(0.00, 0.5))),
|
||||||
|
getShadow(uLightProj[5] * c, vec2(0.25, 0.5))),
|
||||||
|
getShadow(uLightProj[6] * c, vec2(0.50, 0.5))),
|
||||||
|
getShadow(uLightProj[7] * c, vec2(0.75, 0.5)));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -351,7 +353,7 @@ uniform vec4 uMaterial; // x - diffuse, y - ambient, z - specular, w - alpha
|
|||||||
uniform sampler2D sReflect;
|
uniform sampler2D sReflect;
|
||||||
|
|
||||||
float calcCaustics(vec3 n) {
|
float calcCaustics(vec3 n) {
|
||||||
vec2 cc = vCausticsCoord.xy;
|
vec2 cc = clamp((vCoord.xz - uRoomSize.xy) / (uRoomSize.zw - uRoomSize.xy), vec2(0.0), vec2(1.0));
|
||||||
vec2 border = vec2(256.0) / (uRoomSize.zw - uRoomSize.xy);
|
vec2 border = vec2(256.0) / (uRoomSize.zw - uRoomSize.xy);
|
||||||
vec2 fade = smoothstep(vec2(0.0), border, cc) * (1.0 - smoothstep(vec2(1.0) - border, vec2(1.0), cc));
|
vec2 fade = smoothstep(vec2(0.0), border, cc) * (1.0 - smoothstep(vec2(1.0) - border, vec2(1.0), cc));
|
||||||
return texture2D(sReflect, cc).x * max(0.0, -n.y) * fade.x * fade.y;
|
return texture2D(sReflect, cc).x * max(0.0, -n.y) * fade.x * fade.y;
|
||||||
|
Reference in New Issue
Block a user