Improved caustics effect.
This commit is contained in:
parent
8f127be9de
commit
718c1cacb0
@ -1,20 +1,32 @@
|
|||||||
uniform sampler2D tex;
|
uniform sampler2D Albedo;
|
||||||
|
uniform sampler2D DiffuseMap;
|
||||||
|
uniform sampler2D SpecularMap;
|
||||||
|
uniform sampler2D SSAO;
|
||||||
|
uniform vec2 screen;
|
||||||
|
uniform vec3 ambient;
|
||||||
uniform sampler2D caustictex;
|
uniform sampler2D caustictex;
|
||||||
uniform vec2 dir;
|
uniform vec2 dir;
|
||||||
uniform vec2 dir2;
|
uniform vec2 dir2;
|
||||||
|
|
||||||
|
#if __VERSION__ >= 130
|
||||||
in vec2 uv;
|
in vec2 uv;
|
||||||
out vec4 FragColor;
|
out vec4 FragColor;
|
||||||
|
#else
|
||||||
|
varying vec2 uv;
|
||||||
|
#define FragColor gl_FragColor
|
||||||
|
#endif
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec2 tc = uv;
|
vec2 tc = gl_FragCoord.xy / screen;
|
||||||
|
vec3 DiffuseComponent = texture(DiffuseMap, tc).xyz;
|
||||||
|
vec3 SpecularComponent = texture(SpecularMap, tc).xyz;
|
||||||
|
vec4 color = texture(Albedo, uv);
|
||||||
|
float ao = texture(SSAO, tc).x;
|
||||||
|
|
||||||
vec3 col = texture(tex, tc).xyz;
|
float caustic = texture(caustictex, uv + dir).x;
|
||||||
float caustic = texture(caustictex, tc + dir).x;
|
float caustic2 = texture(caustictex, (uv.yx + dir2 * vec2(-0.6, 0.3)) * vec2(0.6)).x;
|
||||||
float caustic2 = texture(caustictex, (tc.yx + dir2 * vec2(-0.6, 0.3)) * vec2(0.6)).x;
|
|
||||||
|
|
||||||
col += caustic * caustic2;
|
vec3 LightFactor = ao * ambient + DiffuseComponent + SpecularComponent + caustic * caustic2 * 10;
|
||||||
|
FragColor = vec4(color.xyz * LightFactor, 1.);
|
||||||
FragColor = vec4(col, 1.0);
|
|
||||||
}
|
}
|
||||||
|
@ -752,8 +752,13 @@ namespace MeshShader
|
|||||||
GLuint CausticsShader::uniform_MVP;
|
GLuint CausticsShader::uniform_MVP;
|
||||||
GLuint CausticsShader::uniform_dir;
|
GLuint CausticsShader::uniform_dir;
|
||||||
GLuint CausticsShader::uniform_dir2;
|
GLuint CausticsShader::uniform_dir2;
|
||||||
GLuint CausticsShader::uniform_tex;
|
GLuint CausticsShader::uniform_Albedo;
|
||||||
GLuint CausticsShader::uniform_caustictex;
|
GLuint CausticsShader::uniform_caustictex;
|
||||||
|
GLuint CausticsShader::uniform_DiffuseMap;
|
||||||
|
GLuint CausticsShader::uniform_SpecularMap;
|
||||||
|
GLuint CausticsShader::uniform_SSAO;
|
||||||
|
GLuint CausticsShader::uniform_screen;
|
||||||
|
GLuint CausticsShader::uniform_ambient;
|
||||||
|
|
||||||
void CausticsShader::init()
|
void CausticsShader::init()
|
||||||
{
|
{
|
||||||
@ -763,17 +768,28 @@ namespace MeshShader
|
|||||||
uniform_MVP = glGetUniformLocation(Program, "ModelViewProjectionMatrix");
|
uniform_MVP = glGetUniformLocation(Program, "ModelViewProjectionMatrix");
|
||||||
uniform_dir = glGetUniformLocation(Program, "dir");
|
uniform_dir = glGetUniformLocation(Program, "dir");
|
||||||
uniform_dir2 = glGetUniformLocation(Program, "dir2");
|
uniform_dir2 = glGetUniformLocation(Program, "dir2");
|
||||||
uniform_tex = glGetUniformLocation(Program, "tex");
|
uniform_Albedo = glGetUniformLocation(Program, "Albedo");
|
||||||
uniform_caustictex = glGetUniformLocation(Program, "caustictex");
|
uniform_caustictex = glGetUniformLocation(Program, "caustictex");
|
||||||
|
uniform_DiffuseMap = glGetUniformLocation(Program, "DiffuseMap");
|
||||||
|
uniform_SpecularMap = glGetUniformLocation(Program, "SpecularMap");
|
||||||
|
uniform_SSAO = glGetUniformLocation(Program, "SSAO");
|
||||||
|
uniform_screen = glGetUniformLocation(Program, "screen");
|
||||||
|
uniform_ambient = glGetUniformLocation(Program, "ambient");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CausticsShader::setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::vector2df &dir, const core::vector2df &dir2, unsigned TU_tex, unsigned TU_caustictex)
|
void CausticsShader::setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::vector2df &dir, const core::vector2df &dir2, const core::vector2df &screen, unsigned TU_albedo, unsigned TU_DiffuseMap, unsigned TU_Specmap, unsigned TU_SSAO, unsigned TU_caustictex)
|
||||||
{
|
{
|
||||||
glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer());
|
glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer());
|
||||||
glUniform2f(uniform_dir, dir.X, dir.Y);
|
glUniform2f(uniform_dir, dir.X, dir.Y);
|
||||||
glUniform2f(uniform_dir2, dir2.X, dir2.Y);
|
glUniform2f(uniform_dir2, dir2.X, dir2.Y);
|
||||||
glUniform1i(uniform_tex, TU_tex);
|
glUniform1i(uniform_Albedo, TU_albedo);
|
||||||
glUniform1i(uniform_caustictex, TU_caustictex);
|
glUniform1i(uniform_caustictex, TU_caustictex);
|
||||||
|
glUniform2f(uniform_screen, screen.X, screen.Y);
|
||||||
|
glUniform1i(uniform_DiffuseMap, TU_DiffuseMap);
|
||||||
|
glUniform1i(uniform_SpecularMap, TU_Specmap);
|
||||||
|
glUniform1i(uniform_SSAO, TU_SSAO);
|
||||||
|
const video::SColorf s = irr_driver->getSceneManager()->getAmbientLight();
|
||||||
|
glUniform3f(uniform_ambient, s.r, s.g, s.b);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint BubbleShader::Program;
|
GLuint BubbleShader::Program;
|
||||||
|
@ -174,10 +174,10 @@ class CausticsShader
|
|||||||
public:
|
public:
|
||||||
static GLuint Program;
|
static GLuint Program;
|
||||||
static GLuint attrib_position, attrib_texcoord;
|
static GLuint attrib_position, attrib_texcoord;
|
||||||
static GLuint uniform_MVP, uniform_dir, uniform_dir2, uniform_tex, uniform_caustictex;
|
static GLuint uniform_MVP, uniform_dir, uniform_dir2, uniform_Albedo, uniform_DiffuseMap, uniform_SpecularMap, uniform_SSAO, uniform_screen, uniform_ambient, uniform_caustictex;
|
||||||
|
|
||||||
static void init();
|
static void init();
|
||||||
static void setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::vector2df &dir, const core::vector2df &dir2, unsigned TU_tex, unsigned TU_caustictex);
|
static void setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::vector2df &dir, const core::vector2df &dir2, const core::vector2df &screen, unsigned TU_albedo, unsigned TU_DiffuseMap, unsigned TU_Specmap, unsigned TU_SSAO, unsigned TU_caustictex);
|
||||||
};
|
};
|
||||||
|
|
||||||
class BubbleShader
|
class BubbleShader
|
||||||
|
@ -361,12 +361,30 @@ void drawCaustics(const GLMesh &mesh, const core::matrix4 & ModelViewProjectionM
|
|||||||
GLenum itype = mesh.IndexType;
|
GLenum itype = mesh.IndexType;
|
||||||
size_t count = mesh.IndexCount;
|
size_t count = mesh.IndexCount;
|
||||||
|
|
||||||
setTexture(0, mesh.textures[0], GL_LINEAR, GL_LINEAR, true);
|
setTexture(0, mesh.textures[0], GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||||
setTexture(1, getTextureGLuint(irr_driver->getTexture(file_manager->getAsset("textures/noise.png").c_str())), GL_LINEAR, GL_LINEAR, true);
|
if (irr_driver->getLightViz())
|
||||||
|
{
|
||||||
|
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ALPHA };
|
||||||
|
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA };
|
||||||
|
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||||
|
}
|
||||||
|
setTexture(1, getTextureGLuint(irr_driver->getTexture(file_manager->getAsset("textures/caustics.png").c_str())), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||||
|
setTexture(2, getTextureGLuint(irr_driver->getRTT(RTT_TMP1)), GL_NEAREST, GL_NEAREST);
|
||||||
|
setTexture(3, getTextureGLuint(irr_driver->getRTT(RTT_TMP2)), GL_NEAREST, GL_NEAREST);
|
||||||
|
setTexture(4, getTextureGLuint(irr_driver->getRTT(RTT_SSAO)), GL_NEAREST, GL_NEAREST);
|
||||||
|
if (!UserConfigParams::m_ssao)
|
||||||
|
{
|
||||||
|
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ONE };
|
||||||
|
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
glUseProgram(MeshShader::CausticsShader::Program);
|
glUseProgram(MeshShader::CausticsShader::Program);
|
||||||
MeshShader::CausticsShader::setUniforms(ModelViewProjectionMatrix, dir, dir2, 0, 1);
|
MeshShader::CausticsShader::setUniforms(ModelViewProjectionMatrix, dir, dir2, core::vector2df(UserConfigParams::m_width, UserConfigParams::m_height), 0, 2, 3, 4, 1);
|
||||||
|
|
||||||
glBindVertexArray(mesh.vao_second_pass);
|
glBindVertexArray(mesh.vao_second_pass);
|
||||||
glDrawElements(ptype, count, itype, 0);
|
glDrawElements(ptype, count, itype, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user