Corrected lighting model for transparent surfaces. Reflections and specular are no longer masked by the alpha channel.
This commit is contained in:
@@ -120,7 +120,7 @@ void KRAmbientZone::render(KRCamera *pCamera, std::vector<KRPointLight *> &point
|
|||||||
|
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ void KRAudioSource::render(KRCamera *pCamera, std::vector<KRPointLight *> &point
|
|||||||
|
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ void KRBone::render(KRCamera *pCamera, std::vector<KRPointLight *> &point_lights
|
|||||||
|
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -312,7 +312,7 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende
|
|||||||
|
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
|
|
||||||
// Render all transparent geometry
|
// Render all transparent geometry
|
||||||
scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, false);
|
scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, false);
|
||||||
@@ -846,7 +846,7 @@ void KRCamera::renderPost()
|
|||||||
|
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
|
|
||||||
KRShader *fontShader = m_pContext->getShaderManager()->getShader("debug_font", this, std::vector<KRPointLight *>(), std::vector<KRDirectionalLight *>(), std::vector<KRSpotLight *>(), 0, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
KRShader *fontShader = m_pContext->getShaderManager()->getShader("debug_font", this, std::vector<KRPointLight *>(), std::vector<KRDirectionalLight *>(), std::vector<KRSpotLight *>(), 0, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
||||||
getContext().getShaderManager()->selectShader(*this, fontShader, m_viewport, KRMat4(), std::vector<KRPointLight *>(), std::vector<KRDirectionalLight *>(), std::vector<KRSpotLight *>(), 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
getContext().getShaderManager()->selectShader(*this, fontShader, m_viewport, KRMat4(), std::vector<KRPointLight *>(), std::vector<KRDirectionalLight *>(), std::vector<KRSpotLight *>(), 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ void KRCollider::render(KRCamera *pCamera, std::vector<KRPointLight *> &point_li
|
|||||||
|
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ void KRPointLight::render(KRCamera *pCamera, std::vector<KRPointLight *> &point_
|
|||||||
if(bVisualize) {
|
if(bVisualize) {
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ void KRReverbZone::render(KRCamera *pCamera, std::vector<KRPointLight *> &point_
|
|||||||
|
|
||||||
// Enable alpha blending
|
// Enable alpha blending
|
||||||
GLDEBUG(glEnable(GL_BLEND));
|
GLDEBUG(glEnable(GL_BLEND));
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -320,7 +320,7 @@ void KRScene::render(KROctreeNode *pOctreeNode, unordered_map<KRAABB, int> &visi
|
|||||||
if(renderPass != KRNode::RENDER_PASS_FORWARD_TRANSPARENT && renderPass != KRNode::RENDER_PASS_ADDITIVE_PARTICLES && renderPass != KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE) {
|
if(renderPass != KRNode::RENDER_PASS_FORWARD_TRANSPARENT && renderPass != KRNode::RENDER_PASS_ADDITIVE_PARTICLES && renderPass != KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE) {
|
||||||
GLDEBUG(glDisable(GL_BLEND));
|
GLDEBUG(glDisable(GL_BLEND));
|
||||||
} else if(renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT) {
|
} else if(renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT) {
|
||||||
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
|
||||||
} else {
|
} else {
|
||||||
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); // RENDER_PASS_FORWARD_TRANSPARENT and RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE
|
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); // RENDER_PASS_FORWARD_TRANSPARENT and RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -323,8 +323,34 @@ void main()
|
|||||||
gl_FragColor += diffuseMaterial * vec4(material_diffuse, 1.0) * vec4(vec3(lamberFactor), 1.0);
|
gl_FragColor += diffuseMaterial * vec4(material_diffuse, 1.0) * vec4(vec3(lamberFactor), 1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_REFLECTION_CUBE_MAP == 1
|
// -------------------- Switch to Pre-multiplied Alpha and Apply material_alpha --------------------
|
||||||
|
|
||||||
|
#if ALPHA_BLEND == 1
|
||||||
|
gl_FragColor.a = gl_FragColor.a * material_alpha; // Apply material_alpha
|
||||||
|
gl_FragColor.rgb *= gl_FragColor.a; // Switch to pre-multiplied alpha
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// -------------------- Add specular light --------------------
|
||||||
|
// Additive, not masked against diffuse alpha
|
||||||
|
#if ENABLE_SPECULAR == 1
|
||||||
|
#if HAS_SPEC_MAP == 1 && ENABLE_PER_PIXEL == 1
|
||||||
|
gl_FragColor.rgb += material_specular * vec3(texture2D(specularTexture, spec_uv)) * specularFactor;
|
||||||
|
#else
|
||||||
|
gl_FragColor.rgb += material_specular * specularFactor;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// -------------------- Multiply light map --------------------
|
||||||
|
#if HAS_LIGHT_MAP == 1
|
||||||
|
mediump vec3 lightMapColor = vec3(texture2D(lightmapTexture, lightmap_uv));
|
||||||
|
//gl_FragColor = vec4(gl_FragColor.r * lightMapColor.r, gl_FragColor.g * lightMapColor.g, gl_FragColor.b * lightMapColor.b, gl_FragColor.a);
|
||||||
|
gl_FragColor.rgb *= lightMapColor;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// -------------------- Add reflected light --------------------
|
// -------------------- Add reflected light --------------------
|
||||||
|
#if HAS_REFLECTION_CUBE_MAP == 1
|
||||||
|
// Reflected light is additive and not modulated by the light map
|
||||||
#if HAS_NORMAL_MAP == 1
|
#if HAS_NORMAL_MAP == 1
|
||||||
// Calculate reflection vector as I - 2.0 * dot(N, I) * N
|
// Calculate reflection vector as I - 2.0 * dot(N, I) * N
|
||||||
mediump vec3 incidenceVec = -normalize(eyeVec);
|
mediump vec3 incidenceVec = -normalize(eyeVec);
|
||||||
@@ -338,43 +364,33 @@ void main()
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// -------------------- Add specular light --------------------
|
|
||||||
#if ENABLE_SPECULAR == 1
|
|
||||||
#if HAS_SPEC_MAP == 1 && ENABLE_PER_PIXEL == 1
|
|
||||||
gl_FragColor += vec4(material_specular * vec3(texture2D(specularTexture, spec_uv)) * specularFactor, 0.0);
|
|
||||||
#else
|
|
||||||
gl_FragColor += vec4(material_specular * specularFactor, 0.0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ALPHA_BLEND == 1
|
|
||||||
gl_FragColor.a = gl_FragColor.a * material_alpha;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -------------------- Multiply light map --------------------
|
|
||||||
|
|
||||||
#if HAS_LIGHT_MAP == 1
|
|
||||||
mediump vec3 lightMapColor = vec3(texture2D(lightmapTexture, lightmap_uv));
|
|
||||||
gl_FragColor = vec4(gl_FragColor.r * lightMapColor.r, gl_FragColor.g * lightMapColor.g, gl_FragColor.b * lightMapColor.b, gl_FragColor.a);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// -------------------- Apply Fog --------------------
|
// -------------------- Apply Fog --------------------
|
||||||
|
#if FOG_TYPE == 1 || FOG_TYPE == 2 || FOG_TYPE == 3
|
||||||
|
|
||||||
#if FOG_TYPE == 1
|
#if FOG_TYPE == 1
|
||||||
// Linear fog
|
// Linear fog
|
||||||
gl_FragColor.rgb = mix(fog_color.rgb, gl_FragColor.rgb, clamp((fog_far - gl_FragCoord.z / gl_FragCoord.w) * fog_scale, 0.0, 1.0));
|
lowp float fog_alpha = clamp((fog_far - gl_FragCoord.z / gl_FragCoord.w) * fog_scale, 0.0, 1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if FOG_TYPE == 2
|
#if FOG_TYPE == 2
|
||||||
// Exponential fog
|
// Exponential fog
|
||||||
mediump float fog_z = gl_FragCoord.z / gl_FragCoord.w - fog_near;
|
mediump float fog_z = gl_FragCoord.z / gl_FragCoord.w - fog_near;
|
||||||
gl_FragColor.rgb = mix(fog_color.rgb, gl_FragColor.rgb, clamp(exp2(fog_density_premultiplied_exponential * fog_z), 0.0, 1.0));
|
lowp float fog_alpha = clamp(exp2(fog_density_premultiplied_exponential * fog_z), 0.0, 1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if FOG_TYPE == 3
|
#if FOG_TYPE == 3
|
||||||
// Exponential squared fog
|
// Exponential squared fog
|
||||||
mediump float fog_z = max(gl_FragCoord.z / gl_FragCoord.w - fog_near, 0.0);
|
mediump float fog_z = max(gl_FragCoord.z / gl_FragCoord.w - fog_near, 0.0);
|
||||||
gl_FragColor.rgb = mix(fog_color.rgb, gl_FragColor.rgb, clamp(exp2(fog_density_premultiplied_squared * fog_z * fog_z), 0.0, 1.0));
|
lowp float fog_alpha = clamp(exp2(fog_density_premultiplied_squared * fog_z * fog_z), 0.0, 1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ALPHA_BLEND == 1
|
||||||
|
gl_FragColor.rgb = mix(fog_color.rgb * gl_FragColor.a, gl_FragColor.rgb, fog_alpha);
|
||||||
|
#else
|
||||||
|
gl_FragColor.rgb = mix(fog_color.rgb, gl_FragColor.rgb, fog_alpha);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user