/// <summary> /// Function to build up the render targets. /// </summary> /// <param name="width">The width of the render targets.</param> /// <param name="height">The height of the render targets.</param> /// <param name="format">The format of the buffer.</param> private void BuildRenderTargets(int width, int height, BufferFormat format) { // For the lighting effect, we use a deferred rendering technique where we have 3 render targets for diffuse, specularity, and normal mapping. // These targets are sub resources of the same texture resource (array indices). // Diffuse. _rtvInfo.Width = width; _rtvInfo.Height = height; _rtvInfo.Format = format; _rtvInfo.ArrayCount = 2; _gbufferTargets[0] = Graphics.TemporaryTargets.Rent(_rtvInfo, "Gorgon 2D GBuffer - Diffuse/Specular", false); _gbufferTargets[0].Clear(GorgonColor.Black); // Specular. _gbufferTargets[1] = _gbufferTargets[0].Texture.GetRenderTargetView(arrayIndex: 1, arrayCount: 1); _rtvInfo.Format = BufferFormat.R8G8B8A8_UNorm; _rtvInfo.ArrayCount = 1; // Normals. // We'll clear it before the pass, the default color is insufficient. _gbufferTargets[2] = Graphics.TemporaryTargets.Rent(_rtvInfo, "Gorgon 2D Buffer - Normals", false); GorgonTexture2DView normalSrv = _gbufferTargets[2].GetShaderResourceView(); if ((_pixelLitShaderState.ShaderResources[1] != normalSrv) || (_diffuseFilter != DiffuseFiltering) || (_normalFilter != NormalFiltering) || (_specularFilter != SpecularFiltering)) { _diffuseFilter = DiffuseFiltering ?? GorgonSamplerState.Default; _normalFilter = NormalFiltering ?? GorgonSamplerState.PointFiltering; _specularFilter = SpecularFiltering ?? GorgonSamplerState.Default; _pixelDeferShaderState = PixelShaderBuilder.ResetTo(_pixelDeferShaderState) .SamplerState(_diffuseFilter, 0) .SamplerState(_normalFilter, 1) .SamplerState(_specularFilter, 2) .Build(); _pixelLitShaderState = PixelShaderBuilder .ResetTo(_pixelLitShaderState) .ShaderResource(normalSrv, 1) .SamplerState(_diffuseFilter, 0) .SamplerState(_normalFilter, 1) .SamplerState(_specularFilter, 2) .Build(); _lightingState = BatchStateBuilder .ResetTo(_lightingState) .PixelShaderState(_pixelLitShaderState) .Build(); } _gbufferTexture = _gbufferTargets[0].Texture.GetShaderResourceView(); }