/// <summary>
///
/// </summary>
/// <param name="camera"></param>
/// <param name="depthBuffer"></param>
/// <param name="hdrTarget"></param>
/// <param name="diffuse"></param>
/// <param name="specular"></param>
/// <param name="normals"></param>
internal void RenderGBuffer ( StereoEye stereoEye, Camera camera, HdrFrame frame, RenderWorld viewLayer )
{
using ( new PixEvent("RenderGBuffer") ) {
if (surfaceShader==null) {
return;
}
if (rs.SkipSceneRendering) {
return;
}
var device = Game.GraphicsDevice;
var view = camera.GetViewMatrix( stereoEye );
var projection = camera.GetProjectionMatrix( stereoEye );
var viewPosition = camera.GetCameraPosition4( stereoEye );
var cbData = new CBMeshInstanceData();
var hdr = frame.HdrBuffer.Surface;
var depth = frame.DepthBuffer.Surface;
var diffuse = frame.DiffuseBuffer.Surface;
var specular = frame.SpecularBuffer.Surface;
var normals = frame.NormalMapBuffer.Surface;
var scattering = frame.ScatteringBuffer.Surface;
device.ResetStates();
device.SetTargets( depth, hdr, diffuse, specular, normals, scattering );
device.PixelShaderSamplers[0] = SamplerState.AnisotropicWrap ;
var instances = viewLayer.Instances;
//#warning INSTANSING!
foreach ( var instance in instances ) {
if (!instance.Visible) {
continue;
}
cbData.View = view;
cbData.Projection = projection;
cbData.World = instance.World;
cbData.ViewPos = viewPosition;
constBuffer.SetData( cbData );
device.PixelShaderConstants[0] = constBuffer ;
device.VertexShaderConstants[0] = constBuffer ;
device.SetupVertexInput( instance.vb, instance.ib );
if (instance.IsSkinned) {
constBufferBones.SetData( instance.BoneTransforms );
device.VertexShaderConstants[3] = constBufferBones ;
}
try {
foreach ( var sg in instance.ShadingGroups ) {
device.PipelineState = instance.IsSkinned ? sg.Material.GBufferSkinned : sg.Material.GBufferRigid;
device.PixelShaderConstants[1] = sg.Material.ConstantBufferParameters;
device.PixelShaderConstants[2] = sg.Material.ConstantBufferUVModifiers;
device.VertexShaderConstants[1] = sg.Material.ConstantBufferParameters;
device.VertexShaderConstants[2] = sg.Material.ConstantBufferUVModifiers;
sg.Material.SetTextures( device );
device.DrawIndexed( sg.IndicesCount, sg.StartIndex, 0 );
rs.Counters.SceneDIPs++;
}
} catch ( UbershaderException e ) {
Log.Warning( e.Message );
ExceptionDialog.Show( e );
}
}
}
}