public void RenderWaterReflection(WaterPlane water, BaseCamera camera, ref Matrix4 ProjectionMatrix, Vector4 clipPlane, bool bApplyLensFlareScale = false) { if (m_postConstructor) { return; } Matrix4 modelMatrix = Matrix4.Identity; if (bApplyLensFlareScale) { modelMatrix *= Matrix4.CreateScale(LENS_FLARE_SIZE_TO_SUN_SIZE, -LENS_FLARE_SIZE_TO_SUN_SIZE, LENS_FLARE_SIZE_TO_SUN_SIZE); } float translationPositionY = (2 * water.GetTranslation().Y) - m_lightSource.Position.Y; modelMatrix *= Matrix4.CreateTranslation(m_lightSource.Position.X, translationPositionY, m_lightSource.Position.Z); GL.Enable(EnableCap.ClipDistance0); m_shader.startProgram(); m_texture1.BindTexture(TextureUnit.Texture0); m_texture2.BindTexture(TextureUnit.Texture1); m_shader.setUniformValues(ref modelMatrix, camera.GetViewMatrix(), ref ProjectionMatrix, m_lightSource, 0, 1); m_shader.SetClipPlane(ref clipPlane); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); m_buffer.RenderVAO(PrimitiveType.Triangles); GL.Disable(EnableCap.Blend); m_shader.stopProgram(); GL.Disable(EnableCap.ClipDistance0); }
public Matrix4 GetMirrorMatrix(WaterPlane water) { Vector3 currentPosition = ComponentTranslation; float translationPositionY = (2 * water.GetTranslation().Y) - currentPosition.Y; Matrix4 mirrorMatrix = Matrix4.Identity; mirrorMatrix *= Matrix4.CreateRotationX(MathHelper.DegreesToRadians(ComponentRotation.X)); mirrorMatrix *= Matrix4.CreateRotationY(MathHelper.DegreesToRadians(ComponentRotation.Y)); mirrorMatrix *= Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(ComponentRotation.Z)); mirrorMatrix *= Matrix4.CreateScale(ComponentScale.X, -ComponentScale.Y, ComponentScale.Z); mirrorMatrix *= Matrix4.CreateTranslation(currentPosition.X, translationPositionY, currentPosition.Z); return(mirrorMatrix); }
public void RenderWaterReflection(WaterPlane water, DirectionalLight Sun, BaseCamera camera, ref Matrix4 ProjectionMatrix, Vector4 clipPlane) { if (m_bPostConstructor) { return; } float translationPositionY = (2 * water.GetTranslation().Y); Matrix4 mirrorMatrix, modelMatrix = Matrix4.Identity; mirrorMatrix = Matrix4.CreateScale(1, -1, 1); mirrorMatrix *= Matrix4.CreateTranslation(0, translationPositionY, 0); GL.Enable(EnableCap.ClipDistance0); liteReflectionShader.startProgram(); _textureBlack.BindTexture(TextureUnit.Texture0); _textureR.BindTexture(TextureUnit.Texture1); _textureG.BindTexture(TextureUnit.Texture2); _textureB.BindTexture(TextureUnit.Texture3); _blendMap.BindTexture(TextureUnit.Texture4); liteReflectionShader.SetTextureR(1); liteReflectionShader.SetTextureG(2); liteReflectionShader.SetTextureB(3); liteReflectionShader.SetTextureBlack(0); liteReflectionShader.SetBlendMap(4); liteReflectionShader.SetMaterial(_terrainMaterial); liteReflectionShader.SetTransformationMatrices(ref mirrorMatrix, ref modelMatrix, camera.GetViewMatrix(), ref ProjectionMatrix); liteReflectionShader.SetDirectionalLight(Sun); liteReflectionShader.SetClippingPlane(ref clipPlane); _buffer.RenderVAO(PrimitiveType.Triangles); liteReflectionShader.stopProgram(); GL.Disable(EnableCap.ClipDistance0); }