private static ResourceRef <Material> CreateGaussBlurMaterial(RenderingDevice device, RenderTargetTexture texture, bool horizontal) { var samplerState = new SamplerSpec(); samplerState.addressU = TextureAddress.Clamp; samplerState.addressV = TextureAddress.Clamp; samplerState.magFilter = TextureFilterType.Linear; samplerState.minFilter = TextureFilterType.Linear; samplerState.mipFilter = TextureFilterType.Linear; var rasterizerState = new RasterizerSpec(); rasterizerState.cullMode = CullMode.None; var depthStencilState = new DepthStencilSpec(); depthStencilState.depthEnable = false; var vs = device.GetShaders().LoadVertexShader("gaussian_blur_vs"); var horDefines = new Dictionary <string, string>(); if (horizontal) { horDefines["HOR"] = "1"; } var ps = device.GetShaders().LoadPixelShader("gaussian_blur_ps", horDefines); var samplers = new MaterialSamplerSpec[] { new (new ResourceRef <ITexture>(texture), samplerState) }; return(device.CreateMaterial(null, depthStencilState, rasterizerState, samplers, vs, ps).Ref()); }
private ResourceRef <Material> ParseMaterial(JsonElement root) { if (!root.TryGetProperty("vertexShader", out var vertexShaderEl)) { throw new InvalidMaterialException(_path, "A vertexShader is required."); } var vertexShader = _device.GetShaders().LoadVertexShader(vertexShaderEl.GetString()); if (!root.TryGetProperty("fragmentShader", out var fragmentShaderEl)) { throw new InvalidMaterialException(_path, "A fragmentShader is required."); } var fragmentShader = _device.GetShaders().LoadPixelShader(fragmentShaderEl.GetString()); var blendState = new BlendSpec(); if (root.TryGetProperty("blend", out var blendEl)) { ParseBlendSpec(blendEl, blendState); } var depthStencil = new DepthStencilSpec(); if (root.TryGetProperty("depthStencil", out var depthStencilEl)) { ParseDepthStencil(depthStencilEl, depthStencil); } var rasterizer = new RasterizerSpec(); if (root.TryGetProperty("rasterizer", out var rasterizerEl)) { ParseRasterizer(rasterizerEl, rasterizer); } var samplers = new List <MaterialSamplerSpec>(); if (root.TryGetProperty("samplers", out var samplersEl)) { foreach (var samplerEl in samplersEl.EnumerateArray()) { var samplerState = new SamplerSpec(); ParseSampler(samplerEl, samplerState, out var texture); samplers.Add(new MaterialSamplerSpec(texture, samplerState)); } } return(_device.CreateMaterial( blendState, depthStencil, rasterizer, samplers.ToArray(), vertexShader, fragmentShader ).Ref()); }
private void CreateMaterial() { using var ps = _device.GetShaders().LoadPixelShader("fogofwar_ps"); var blendState = new BlendSpec(); blendState.blendEnable = true; blendState.srcBlend = BlendOperand.SrcAlpha; blendState.destBlend = BlendOperand.InvSrcAlpha; DepthStencilSpec depthStencilState = new DepthStencilSpec(); depthStencilState.depthEnable = false; RasterizerSpec rasterizerState = new RasterizerSpec(); SamplerSpec samplerState = new SamplerSpec(); samplerState.addressU = TextureAddress.Clamp; samplerState.addressV = TextureAddress.Clamp; samplerState.magFilter = TextureFilterType.Linear; samplerState.minFilter = TextureFilterType.Linear; MaterialSamplerSpec[] samplers = { new(new ResourceRef <ITexture>(_blurredFogTexture.Resource), samplerState) };
private Material CreateQuadMaterial() { var blendState = new BlendSpec { blendEnable = true, srcBlend = BlendOperand.SrcAlpha, destBlend = BlendOperand.InvSrcAlpha }; var depthState = new DepthStencilSpec(); depthState.depthEnable = true; depthState.depthWrite = false; var rasterizerState = new RasterizerSpec(); rasterizerState.cullMode = CullMode.None; var vsDefines = new Dictionary <string, string> { { "TEXTURE_STAGES", "1" } }; var vs = _device.GetShaders().LoadVertexShader("mdf_vs", vsDefines); var ps = _device.GetShaders().LoadPixelShader("textured_simple_ps"); var samplerState = new SamplerSpec(); samplerState.addressU = TextureAddress.Clamp; samplerState.addressV = TextureAddress.Clamp; samplerState.minFilter = TextureFilterType.Linear; samplerState.magFilter = TextureFilterType.Linear; samplerState.mipFilter = TextureFilterType.Linear; var samplers = new[] { new MaterialSamplerSpec(new ResourceRef <ITexture>(null), samplerState) }; return(_device.CreateMaterial( blendState, depthState, rasterizerState, samplers, vs, ps)); }
public static Material CreateMaterial(RenderingDevice device, PartSysEmitter emitter, bool pointSprites) { var blendState = new BlendSpec(); blendState.blendEnable = true; switch (emitter.GetSpec().GetBlendMode()) { case PartSysBlendMode.Add: blendState.srcBlend = BlendOperand.SrcAlpha; blendState.destBlend = BlendOperand.One; break; case PartSysBlendMode.Subtract: blendState.srcBlend = BlendOperand.Zero; blendState.destBlend = BlendOperand.InvSrcAlpha; break; case PartSysBlendMode.Blend: blendState.srcBlend = BlendOperand.SrcAlpha; blendState.destBlend = BlendOperand.InvSrcAlpha; break; case PartSysBlendMode.Multiply: blendState.srcBlend = BlendOperand.Zero; blendState.destBlend = BlendOperand.SrcColor; break; default: break; } // Particles respect the depth buffer, but do not modify it DepthStencilSpec depthStencilState = new DepthStencilSpec(); depthStencilState.depthEnable = true; depthStencilState.depthWrite = false; RasterizerSpec rasterizerState = new RasterizerSpec(); rasterizerState.cullMode = CullMode.None; var samplers = new List <MaterialSamplerSpec>(); var shaderName = "diffuse_only_ps"; var textureName = emitter.GetSpec().GetTextureName(); if (textureName.Length > 0) { var samplerState = new SamplerSpec { addressU = TextureAddress.Clamp, addressV = TextureAddress.Clamp, minFilter = TextureFilterType.Linear, magFilter = TextureFilterType.Linear, mipFilter = TextureFilterType.Linear }; var texture = device.GetTextures().Resolve(textureName, true); samplers.Add(new MaterialSamplerSpec(texture, samplerState)); shaderName = "textured_simple_ps"; } using var pixelShader = device.GetShaders().LoadPixelShader(shaderName); var vsName = pointSprites ? "particles_points_vs" : "particles_quads_vs"; using var vertexShader = device.GetShaders().LoadVertexShader(vsName); return(device.CreateMaterial(blendState, depthStencilState, rasterizerState, samplers.ToArray(), vertexShader, pixelShader)); }
public ShapeRenderer2d(RenderingDevice device) { _device = device; _textures = device.GetTextures(); untexturedMaterial = CreateMaterial(device, "diffuse_only_ps"); texturedMaterial = CreateMaterial(device, "textured_simple_ps"); texturedWithoutBlendingMaterial = CreateMaterial(device, "textured_simple_ps", false, false); texturedWithMaskMaterial = CreateMaterial(device, "textured_two_ps"); lineMaterial = CreateMaterial(device, "diffuse_only_ps", true); outlineMaterial = CreateOutlineMaterial(device); pieFillMaterial = CreatePieFillMaterial(device); bufferBinding = new BufferBinding(device, texturedMaterial.VertexShader).Ref(); mdfBufferBinding = _device.CreateMdfBufferBinding(); lineBufferBinding = new BufferBinding(device, lineMaterial.VertexShader).Ref(); SamplerSpec samplerWrapSpec = new SamplerSpec(); samplerWrapSpec.addressU = TextureAddress.Wrap; samplerWrapSpec.addressV = TextureAddress.Wrap; samplerWrapSpec.minFilter = TextureFilterType.Linear; samplerWrapSpec.magFilter = TextureFilterType.Linear; samplerWrapSpec.mipFilter = TextureFilterType.Linear; samplerWrapState = _device.CreateSamplerState(samplerWrapSpec); SamplerSpec samplerClampPointSpec = new SamplerSpec(); samplerClampPointSpec.addressU = TextureAddress.Clamp; samplerClampPointSpec.addressV = TextureAddress.Clamp; samplerClampPointSpec.minFilter = TextureFilterType.NearestNeighbor; samplerClampPointSpec.magFilter = TextureFilterType.NearestNeighbor; samplerClampPointSpec.mipFilter = TextureFilterType.NearestNeighbor; samplerClampPointState = _device.CreateSamplerState(samplerClampPointSpec); SamplerSpec samplerClampSpec = new SamplerSpec(); samplerClampSpec.addressU = TextureAddress.Clamp; samplerClampSpec.addressV = TextureAddress.Clamp; samplerClampSpec.minFilter = TextureFilterType.Linear; samplerClampSpec.magFilter = TextureFilterType.Linear; samplerClampSpec.mipFilter = TextureFilterType.Linear; samplerClampState = _device.CreateSamplerState(samplerClampSpec); DepthStencilSpec noDepthSpec = new DepthStencilSpec(); noDepthSpec.depthEnable = false; noDepthState = _device.CreateDepthStencilState(noDepthSpec); vertexBuffer = _device.CreateEmptyVertexBuffer(Vertex2d.Size * 8, debugName: "ShapeRenderer2d"); var indexData = new ushort[] { 0, 1, 2, 2, 3, 0 }; indexBuffer = _device.CreateIndexBuffer(indexData); bufferBinding.Resource.AddBuffer <Vertex2d>(vertexBuffer, 0) .AddElement(VertexElementType.Float4, VertexElementSemantic.Position) .AddElement(VertexElementType.Float4, VertexElementSemantic.Normal) .AddElement(VertexElementType.Color, VertexElementSemantic.Color) .AddElement(VertexElementType.Float2, VertexElementSemantic.TexCoord); mdfBufferBinding.AddBuffer <Vertex2d>(vertexBuffer, 0) .AddElement(VertexElementType.Float4, VertexElementSemantic.Position) .AddElement(VertexElementType.Float4, VertexElementSemantic.Normal) .AddElement(VertexElementType.Color, VertexElementSemantic.Color) .AddElement(VertexElementType.Float2, VertexElementSemantic.TexCoord); }