diff --git a/data/shaders/lightblend.frag b/data/shaders/lightblend.frag index be44256b2..a9100da0e 100644 --- a/data/shaders/lightblend.frag +++ b/data/shaders/lightblend.frag @@ -1,6 +1,7 @@ uniform sampler2D diffuse; uniform sampler2D specular; uniform sampler2D ambient_occlusion; +uniform sampler2D specular_map; uniform vec3 ambient; void main() @@ -9,7 +10,8 @@ void main() vec3 diffuse = texture2D(diffuse, texc).xyz; vec3 spec = texture2D(specular, texc).xyz; + float specmap = texture2D(specular_map, texc).x; float ao = texture2D(ambient_occlusion, texc).x; - gl_FragColor = vec4(diffuse + spec + ao * ambient, 1.0); + gl_FragColor = vec4(diffuse + spec * specmap + ao * ambient, 1.0); } diff --git a/data/shaders/objectpass.frag b/data/shaders/objectpass.frag index 9ae602623..d90250cc2 100644 --- a/data/shaders/objectpass.frag +++ b/data/shaders/objectpass.frag @@ -8,16 +8,19 @@ noperspective in vec3 nor; void main() { vec4 light = vec4(1.0); + vec4 color; if (haslightmap != 0) { light = texture2D(lighttex, gl_TexCoord[1].xy); } if (hastex != 0) - gl_FragData[0] = texture2D(tex, gl_TexCoord[0].xy) * light; + color = texture2D(tex, gl_TexCoord[0].xy) * light; else - gl_FragData[0] = gl_Color; + color = gl_Color; + gl_FragData[0] = vec4(color.xyz, 1.); gl_FragData[1] = vec4(0.5 * normalize(nor) + 0.5, gl_FragCoord.z); + gl_FragData[2] = vec4(1. - color.a); } diff --git a/data/shaders/objectpass_ref.frag b/data/shaders/objectpass_ref.frag index 6c9bc83dc..67071d4e0 100644 --- a/data/shaders/objectpass_ref.frag +++ b/data/shaders/objectpass_ref.frag @@ -13,11 +13,12 @@ void main() { if (col.a < 0.5) discard; - gl_FragData[0] = col; + gl_FragData[0] = vec4(col.xyz, 1.); //} else { // gl_FragData[0] = gl_Color; //} gl_FragData[1] = vec4(0.5 * normalize(nor) + 0.5, gl_FragCoord.z); + gl_FragData[2] = vec4(1. - col.a); } diff --git a/data/shaders/objectpass_rimlit.frag b/data/shaders/objectpass_rimlit.frag index 6bdb15754..8c29f33dc 100644 --- a/data/shaders/objectpass_rimlit.frag +++ b/data/shaders/objectpass_rimlit.frag @@ -10,6 +10,7 @@ noperspective in vec3 viewpos; void main() { float rim = 1.0 - dot(eyenor, viewpos); rim = smoothstep(0.5, 1.5, rim) * 0.35; + vec4 color; if (hastex != 0) { vec4 col = texture2D(tex, gl_TexCoord[0].xy); @@ -19,11 +20,13 @@ void main() { col.xyz += rim; - gl_FragData[0] = col; + color = col; } else { - gl_FragData[0] = gl_Color + vec4(vec3(rim), 0.0); + color = gl_Color + vec4(vec3(rim), 0.0); } + gl_FragData[0] = vec4(color.xyz, 1.); gl_FragData[1] = vec4(0.5 * normalize(nor) + 0.5, gl_FragCoord.z); + gl_FragData[2] = vec4(1. - color.a); } diff --git a/src/graphics/callbacks.cpp b/src/graphics/callbacks.cpp index 96c5a2eac..b8465204f 100644 --- a/src/graphics/callbacks.cpp +++ b/src/graphics/callbacks.cpp @@ -348,6 +348,8 @@ void LightBlendProvider::OnSetConstants(IMaterialRendererServices *srv, int) srv->setVertexShaderConstant("specular", &tex, 1); tex = 2; srv->setVertexShaderConstant("ambient_occlusion", &tex, 1); + tex = 3; + srv->setVertexShaderConstant("specular_map", &tex, 1); } //------------------------------------- diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index c72e4cade..3788599b8 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -425,6 +425,7 @@ void IrrDriver::initDevice() m_mrt.reallocate(3); m_mrt.push_back(m_rtts->getRTT(RTT_COLOR)); m_mrt.push_back(m_rtts->getRTT(RTT_NORMAL_AND_DEPTH)); + m_mrt.push_back(m_rtts->getRTT(RTT_SPECULARMAP)); irr::video::COpenGLDriver* gl_driver = (irr::video::COpenGLDriver*)m_device->getVideoDriver(); gl_driver->extGlGenQueries(1, &m_lensflare_query); diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index f6962a206..7ba3013d3 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -789,6 +789,7 @@ void IrrDriver::renderLights(const core::aabbox3df& cambox, lightmat.setTexture(0, m_rtts->getRTT(RTT_TMP1)); lightmat.setTexture(1, m_rtts->getRTT(RTT_TMP2)); lightmat.setTexture(2, m_rtts->getRTT(RTT_SSAO)); + lightmat.setTexture(3, m_rtts->getRTT(RTT_SPECULARMAP)); lightmat.MaterialType = m_shaders->getShader(ES_LIGHTBLEND); if (!m_lightviz) diff --git a/src/graphics/rtts.cpp b/src/graphics/rtts.cpp index e1a80393c..e7509bb8c 100644 --- a/src/graphics/rtts.cpp +++ b/src/graphics/rtts.cpp @@ -68,6 +68,7 @@ RTT::RTT() rtts[RTT_TMP4] = drv->addRenderTargetTexture(res, "rtt.tmp4", ECF_R8, stencil); rtts[RTT_NORMAL_AND_DEPTH] = drv->addRenderTargetTexture(res, "rtt.normal_and_depth", ECF_A32B32G32R32F, stencil); rtts[RTT_COLOR] = drv->addRenderTargetTexture(res, "rtt.color", ECF_A16B16G16R16F, stencil); + rtts[RTT_SPECULARMAP] = drv->addRenderTargetTexture(res, "rtt.specularmap", ECF_R8, stencil); rtts[RTT_HALF1] = drv->addRenderTargetTexture(half, "rtt.half1", ECF_A8R8G8B8, stencil); rtts[RTT_HALF2] = drv->addRenderTargetTexture(half, "rtt.half2", ECF_A8R8G8B8, stencil); diff --git a/src/graphics/rtts.hpp b/src/graphics/rtts.hpp index 29e7f5257..7ad8c3d7e 100644 --- a/src/graphics/rtts.hpp +++ b/src/graphics/rtts.hpp @@ -33,6 +33,7 @@ enum TypeRTT RTT_TMP4, RTT_NORMAL_AND_DEPTH, RTT_COLOR, + RTT_SPECULARMAP, RTT_HALF1, RTT_HALF2,