mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-12-01 03:47:07 -05:00
Fixed reflection in 13-stencil.
This commit is contained in:
parent
9ee7d760a7
commit
55f0be0761
3 changed files with 28 additions and 49 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in a new issue