From 55f0be07615f3d2cc239433757adc2ee177f8d39 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Wed, 6 Nov 2013 17:47:03 +0100 Subject: [PATCH] Fixed reflection in 13-stencil. --- .../13-stencil/fs_stencil_color_lightning.sc | 4 +- .../fs_stencil_texture_lightning.sc | 4 +- examples/13-stencil/stencil.cpp | 69 +++++++------------ 3 files changed, 28 insertions(+), 49 deletions(-) diff --git a/examples/13-stencil/fs_stencil_color_lightning.sc b/examples/13-stencil/fs_stencil_color_lightning.sc index 2c3f606d..501dacc8 100644 --- a/examples/13-stencil/fs_stencil_color_lightning.sc +++ b/examples/13-stencil/fs_stencil_color_lightning.sc @@ -49,7 +49,7 @@ vec3 calcLight(int _idx, vec3 _view, vec3 _normal, vec3 _viewDir) vec4 lc = lit(bln.x, bln.y, u_shininess); float dist = max(length(toLight), u_lightPosRadius[_idx].w); - float attn = 150.0 * pow(dist, -2.0); + float attn = 250.0 * pow(dist, -2.0); vec3 rgb = (lc.y * u_diffuse + lc.z * u_specular) * u_lightRgbInnerR[_idx].rgb * attn; return rgb; @@ -84,5 +84,5 @@ void main() vec3 diffuse = toGamma(lightColor * color); gl_FragColor.xyz = clamp(ambient + diffuse, 0.0, 1.0); - gl_FragColor.w = 1.0; + gl_FragColor.w = u_color.w; } diff --git a/examples/13-stencil/fs_stencil_texture_lightning.sc b/examples/13-stencil/fs_stencil_texture_lightning.sc index d7860c68..fa801ede 100644 --- a/examples/13-stencil/fs_stencil_texture_lightning.sc +++ b/examples/13-stencil/fs_stencil_texture_lightning.sc @@ -50,7 +50,7 @@ vec3 calcLight(int _idx, vec3 _view, vec3 _normal, vec3 _viewDir) vec4 lc = lit(bln.x, bln.y, u_shininess); float dist = max(length(toLight), u_lightPosRadius[_idx].w); - float attn = 150.0 * pow(dist, -2.0); + float attn = 250.0 * pow(dist, -2.0); vec3 rgb = (lc.y * u_diffuse + lc.z * u_specular) * u_lightRgbInnerR[_idx].rgb * attn; return rgb; @@ -85,5 +85,5 @@ void main() vec3 diffuse = toGamma(lightColor * color); gl_FragColor.xyz = clamp(ambient + diffuse, 0.0, 1.0); - gl_FragColor.w = 1.0; + gl_FragColor.w = u_color.w; } diff --git a/examples/13-stencil/stencil.cpp b/examples/13-stencil/stencil.cpp index f11b93c4..4c0000fd 100644 --- a/examples/13-stencil/stencil.cpp +++ b/examples/13-stencil/stencil.cpp @@ -335,25 +335,25 @@ struct Uniforms m_params.m_lightCount = 4.0f; m_params.m_lightIndex = 4.0f; - m_ambient[0] = 0.05f; - m_ambient[1] = 0.05f; - m_ambient[2] = 0.05f; + m_ambient[0] = 0.02f; + m_ambient[1] = 0.02f; + m_ambient[2] = 0.02f; m_ambient[3] = 0.0f; //unused - m_diffuse[0] = 0.8f; - m_diffuse[1] = 0.8f; - m_diffuse[2] = 0.8f; + m_diffuse[0] = 0.2f; + m_diffuse[1] = 0.2f; + m_diffuse[2] = 0.2f; m_diffuse[3] = 0.0f; //unused m_specular_shininess[0] = 1.0f; m_specular_shininess[1] = 1.0f; m_specular_shininess[2] = 1.0f; - m_specular_shininess[3] = 25.0f; //shininess + m_specular_shininess[3] = 10.0f; //shininess m_color[0] = 1.0f; m_color[1] = 1.0f; m_color[2] = 1.0f; - m_color[3] = 1.0; + m_color[3] = 1.0f; m_time = 0.0f; @@ -469,7 +469,6 @@ struct RenderState { StencilReflection_CraftStencil = 0, StencilReflection_DrawReflected, - StencilReflection_DarkenReflections, StencilReflection_BlendPlane, StencilReflection_DrawScene, @@ -492,7 +491,10 @@ struct RenderState static RenderState s_renderStates[RenderState::Count] = { { // StencilReflection_CraftStencil - BGFX_STATE_MSAA + BGFX_STATE_RGB_WRITE + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_MSAA , UINT32_MAX , BGFX_STENCIL_TEST_ALWAYS // pass always | BGFX_STENCIL_FUNC_REF(1) // value = 1 @@ -505,6 +507,7 @@ static RenderState s_renderStates[RenderState::Count] = { // StencilReflection_DrawReflected BGFX_STATE_RGB_WRITE | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA) | BGFX_STATE_DEPTH_WRITE | BGFX_STATE_DEPTH_TEST_LESS | BGFX_STATE_CULL_CW //reflection matrix has inverted normals. using CCW instead of CW. @@ -518,22 +521,11 @@ static RenderState s_renderStates[RenderState::Count] = | BGFX_STENCIL_OP_PASS_Z_KEEP , BGFX_STENCIL_NONE }, - { // StencilReflection_DarkenReflections - BGFX_STATE_RGB_WRITE - | BGFX_STATE_DEPTH_WRITE - | BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ZERO, BGFX_STATE_BLEND_FACTOR) - | BGFX_STATE_DEPTH_TEST_LESS - | BGFX_STATE_CULL_CCW - | BGFX_STATE_MSAA - , UINT32_MAX - , BGFX_STENCIL_NONE - , BGFX_STENCIL_NONE - }, { // StencilReflection_BlendPlane BGFX_STATE_RGB_WRITE | BGFX_STATE_DEPTH_WRITE - | BGFX_STATE_BLEND_LIGHTEN - | BGFX_STATE_DEPTH_TEST_EQUAL + | BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_ONE, BGFX_STATE_BLEND_SRC_COLOR) + | BGFX_STATE_DEPTH_TEST_LESS | BGFX_STATE_CULL_CCW | BGFX_STATE_MSAA , UINT32_MAX @@ -1091,6 +1083,7 @@ int _main_(int /*_argc*/, char** /*_argv*/) s_uniforms.m_params.m_lightningPass = 1.0f; s_uniforms.m_params.m_lightCount = settings_numLights; s_uniforms.m_params.m_lightIndex = 0.0f; + s_uniforms.m_color[3] = settings_reflectionValue; s_uniforms.submitPerFrameUniforms(); // Time. @@ -1239,6 +1232,9 @@ int _main_(int /*_argc*/, char** /*_argv*/) // Second pass - Draw reflected objects. + // Clear depth from previous pass. + clearView(RENDER_VIEWID_RANGE1_PASS_1, BGFX_CLEAR_DEPTH_BIT, clearValues); + // Compute reflected matrix. float reflectMtx[16]; float plane_pos[3] = { 0.0f, 0.01f, 0.0f }; @@ -1278,37 +1274,20 @@ int _main_(int /*_argc*/, char** /*_argv*/) // Set lights back. memcpy(s_uniforms.m_lightPosRadius, lightPosRadius, numLights * 4*sizeof(float)); - // Third pass - Darken reflected objects. - - uint8_t val = uint8_t(settings_reflectionValue * UINT8_MAX); - uint32_t factor = (val << 24) - | (val << 16) - | (val << 8 ) - | (val << 0 ) - ; - s_renderStates[RenderState::StencilReflection_DarkenReflections].m_blendFactorRgba = factor; + // Third pass - Blend plane. // Floor. hplaneMesh.submit(RENDER_VIEWID_RANGE1_PASS_2 - , floorMtx - , programColorBlack - , s_renderStates[RenderState::StencilReflection_DarkenReflections] - ); - - // Fourth pass - Draw plane. (blend plane with what's behind it) - - // Floor. - hplaneMesh.submit(RENDER_VIEWID_RANGE1_PASS_3 , floorMtx , programTextureLightning , s_renderStates[RenderState::StencilReflection_BlendPlane] , fieldstoneTex ); - // Fifth pass - Draw everything else but the plane. - + // Fourth pass - Draw everything else but the plane. + // Bunny. - bunnyMesh.submit(RENDER_VIEWID_RANGE1_PASS_4 + bunnyMesh.submit(RENDER_VIEWID_RANGE1_PASS_3 , bunnyMtx , programColorLightning , s_renderStates[RenderState::StencilReflection_DrawScene] @@ -1317,7 +1296,7 @@ int _main_(int /*_argc*/, char** /*_argv*/) // Columns. for (uint8_t ii = 0; ii < 4; ++ii) { - columnMesh.submit(RENDER_VIEWID_RANGE1_PASS_4 + columnMesh.submit(RENDER_VIEWID_RANGE1_PASS_3 , columnMtx[ii] , programColorLightning , s_renderStates[RenderState::StencilReflection_DrawScene]