Light: Support for specularmap

The specular map is embedded in the alpha component of texture.
Alpha value of 1. means no specular, alpha of 0. means 100% specular.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14786 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj 2013-12-25 20:19:18 +00:00
parent 4435ffbaa0
commit ec3fd4fa13
9 changed files with 21 additions and 6 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}
//-------------------------------------

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -33,6 +33,7 @@ enum TypeRTT
RTT_TMP4,
RTT_NORMAL_AND_DEPTH,
RTT_COLOR,
RTT_SPECULARMAP,
RTT_HALF1,
RTT_HALF2,