public void SetShaderConstantBindings(ShaderConstantBindings shaderConstantBindings) { if (_constantBindings != shaderConstantBindings) { PlatformSetShaderConstantBindings(shaderConstantBindings); _constantBindings = shaderConstantBindings; } }
private void NullInputs() { for (int i = 0; i < MaxVertexBuffers; i++) { _vertexBuffers[i] = null; } _indexBuffer = null; _material = null; _constantBindings = null; }
public Material( RenderContext rc, ShaderSet shaderSet, ShaderConstantBindings constantBindings, ShaderTextureBindingSlots textureBindingSlots, DefaultTextureBindingInfo[] defaultTextureBindings) { _rc = rc; ShaderSet = shaderSet; ConstantBindings = constantBindings; TextureBindingSlots = textureBindingSlots; DefaultTextureBindings = defaultTextureBindings; }
public Material GetMaterial( RenderContext rc, string vertexShaderName, string geometryShaderName, string fragmentShaderName, MaterialVertexInput vertexInputs, MaterialInputs <MaterialGlobalInputElement> globalInputs, MaterialInputs <MaterialPerObjectInputElement> perObjectInputs, MaterialTextureInputs textureInputs) { MaterialKey key = new MaterialKey() { VertexShaderName = vertexShaderName, FragmentShaderName = fragmentShaderName, GeometryShaderName = geometryShaderName, VertexInputs = vertexInputs, GlobalInputs = globalInputs }; Material m; if (!_materials.TryGetValue(key, out m)) { Shader vs = _factory.CreateShader(ShaderType.Vertex, vertexShaderName); Shader fs = _factory.CreateShader(ShaderType.Fragment, fragmentShaderName); VertexInputLayout inputLayout = _factory.CreateInputLayout(vs, vertexInputs); ShaderSet shaderSet; if (geometryShaderName != null) { Shader gs = _factory.CreateShader(ShaderType.Geometry, geometryShaderName); shaderSet = _factory.CreateShaderSet(inputLayout, vs, gs, fs); } else { shaderSet = _factory.CreateShaderSet(inputLayout, vs, fs); } ShaderConstantBindings constantBindings = _factory.CreateShaderConstantBindings(rc, shaderSet, globalInputs, perObjectInputs); ShaderTextureBindingSlots textureSlots = _factory.CreateShaderTextureBindingSlots(shaderSet, textureInputs); m = new Material(rc, shaderSet, constantBindings, textureSlots, _factory.CreateDefaultTextureBindingInfos(rc, textureInputs)); if (!_materials.TryAdd(key, m)) { return(_materials[key]); } } return(m); }
public Material CreateMaterial( RenderContext rc, string vertexShaderName, string fragmentShaderName, MaterialVertexInput[] vertexInputs, MaterialInputs <MaterialGlobalInputElement> globalInputs, MaterialInputs <MaterialPerObjectInputElement> perObjectInputs, MaterialTextureInputs textureInputs) { Shader vs = CreateShader(ShaderType.Vertex, vertexShaderName); Shader fs = CreateShader(ShaderType.Fragment, fragmentShaderName); VertexInputLayout inputLayout = CreateInputLayout(vs, vertexInputs); ShaderSet shaderSet = CreateShaderSet(inputLayout, vs, fs); ShaderConstantBindings constantBindings = CreateShaderConstantBindings(rc, shaderSet, globalInputs, perObjectInputs); ShaderTextureBindingSlots textureSlots = CreateShaderTextureBindingSlots(shaderSet, textureInputs); DefaultTextureBindingInfo[] defaultTextureInfos = CreateDefaultTextureBindingInfos(rc, textureInputs); return(new Material(rc, shaderSet, constantBindings, textureSlots, defaultTextureInfos)); }
private Material CreateMaterial(RenderContext rc) { ResourceFactory factory = rc.ResourceFactory; Shader vs = factory.CreateShader(ShaderType.Vertex, "text-vertex"); Shader fs = factory.CreateShader(ShaderType.Fragment, "text-fragment"); VertexInputLayout inputLayout = factory.CreateInputLayout(vs, new MaterialVertexInput(TextVertex.SizeInBytes, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float2), new MaterialVertexInputElement("in_texCoords", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float2), new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Byte4))); ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vs, fs); _constantBindings = factory.CreateShaderConstantBindings(rc, shaderSet, MaterialInputs <MaterialGlobalInputElement> .Empty, new MaterialInputs <MaterialPerObjectInputElement>( new MaterialPerObjectInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, 64), new MaterialPerObjectInputElement("TextOffsetBuffer", MaterialInputType.Float4, 16), new MaterialPerObjectInputElement("AtlasInfoBuffer", MaterialInputType.Custom, 16))); ShaderTextureBindingSlots textureSlots = factory.CreateShaderTextureBindingSlots(shaderSet, new MaterialTextureInputs(new ManualTextureInput("FontAtlas"))); Material material = new Material(rc, shaderSet, _constantBindings, textureSlots); return(material); }
private void InitializeContextObjects(AssetDatabase ad, RenderContext rc) { ResourceFactory factory = rc.ResourceFactory; _vb = factory.CreateVertexBuffer(new[] { new VertexPosition(Vector3.Zero) }, new VertexDescriptor(12, 1), false); _ib = factory.CreateIndexBuffer(new[] { 0 }, false); Shader vertexShader = factory.CreateShader(ShaderType.Vertex, "geometry-vertex"); Shader geometryShader = factory.CreateShader(ShaderType.Geometry, _geometryShaderName); Shader fragmentShader = factory.CreateShader(ShaderType.Fragment, "geometry-frag"); VertexInputLayout inputLayout = factory.CreateInputLayout( vertexShader, new MaterialVertexInput(12, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3))); ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vertexShader, geometryShader, fragmentShader); ShaderConstantBindings constantBindings = factory.CreateShaderConstantBindings(rc, shaderSet, new MaterialInputs <MaterialGlobalInputElement>( new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"), new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix"), new MaterialGlobalInputElement("CameraInfoBuffer", MaterialInputType.Custom, "CameraInfo") ), new MaterialInputs <MaterialPerObjectInputElement>( new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, _worldProvider.DataSizeInBytes))); ShaderTextureBindingSlots slots = factory.CreateShaderTextureBindingSlots(shaderSet, MaterialTextureInputs.Empty); _material = new Material(rc, shaderSet, constantBindings, slots, Array.Empty <DefaultTextureBindingInfo>()); }
private readonly RenderContext _rc; // TODO: Temporary, remove when Material.UseTexture is obsolete. public Material(RenderContext rc, ShaderSet shaderSet, ShaderConstantBindings constantBindings, ShaderTextureBindingSlots textureBindingSlots) : this(rc, shaderSet, constantBindings, textureBindingSlots, Array.Empty <DefaultTextureBindingInfo>()) { }
private void InitializeContextObjects(AssetDatabase ad, RenderContext rc) { ResourceFactory factory = rc.ResourceFactory; MeshData sphere = ad.LoadAsset <ObjFile>(new AssetID("Models/Sphere.obj")).GetFirstMesh(); Vector3[] spherePositions = sphere.GetVertexPositions(); _sphereGeometryVB = factory.CreateVertexBuffer(spherePositions.Length * 12, false); _sphereGeometryVB.SetVertexData(spherePositions, new VertexDescriptor(12, 1)); _ib = sphere.CreateIndexBuffer(factory, out _indexCount); Random r = new Random(); int width = InstanceRows; InstanceData[] instanceData = new InstanceData[width * width * width]; for (int z = 0; z < width; z++) { for (int y = 0; y < width; y++) { for (int x = 0; x < width; x++) { instanceData[z * width * width + y * width + x] = new InstanceData( new Vector3(x * 10, y * 10, z * 10), new RgbaFloat((float)r.NextDouble(), (float)r.NextDouble(), (float)r.NextDouble(), (float)r.NextDouble())); } } } _instanceVB = factory.CreateVertexBuffer(instanceData.Length * InstanceData.SizeInBytes, false); _instanceVB.SetVertexData(instanceData, new VertexDescriptor(InstanceData.SizeInBytes, 2, 0, IntPtr.Zero)); { Shader vs = factory.CreateShader(ShaderType.Vertex, "instanced-simple-vertex"); Shader fs = factory.CreateShader(ShaderType.Fragment, "instanced-simple-frag"); VertexInputLayout inputLayout = factory.CreateInputLayout( vs, new MaterialVertexInput(VertexPosition.SizeInBytes, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)), new MaterialVertexInput( InstanceData.SizeInBytes, new MaterialVertexInputElement("in_offset", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float3, VertexElementInputClass.PerInstance, 1), new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4, VertexElementInputClass.PerInstance, 1))); ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vs, fs); ShaderConstantBindings constantBindings = factory.CreateShaderConstantBindings(rc, shaderSet, new MaterialInputs <MaterialGlobalInputElement>( new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"), new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix")), new MaterialInputs <MaterialPerObjectInputElement>( new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, 16))); ShaderTextureBindingSlots textureSlots = factory.CreateShaderTextureBindingSlots(shaderSet, MaterialTextureInputs.Empty); _material = new Material(rc, shaderSet, constantBindings, textureSlots, Array.Empty <DefaultTextureBindingInfo>()); } //Shader vertexShader = factory.CreateShader(ShaderType.Vertex, "instanced-simple-vertex"); //Shader fragmentShader = factory.CreateShader(ShaderType.Fragment, "instanced-simple-frag"); //VertexInputLayout inputLayout = factory.CreateInputLayout( // vertexShader, // new MaterialVertexInput(VertexPosition.SizeInBytes, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)), // new MaterialVertexInput( // InstanceData.SizeInBytes, // new MaterialVertexInputElement("in_offset", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float3, VertexElementInputClass.PerInstance, 1), // new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4, VertexElementInputClass.PerInstance, 1))); //ShaderSet shaderSet = factory.CreateShaderSet(inputLayout, vertexShader, fragmentShader); //ShaderConstantBindings constantBindings = factory.CreateShaderConstantBindings( // rc, // shaderSet, // new MaterialInputs<MaterialGlobalInputElement>( // new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"), // new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix")), // new MaterialInputs<MaterialPerObjectInputElement>( // new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, 16))); //ShaderTextureBindingSlots textureSlots = factory.CreateShaderTextureBindingSlots(shaderSet, MaterialTextureInputs.Empty); //_material = factory.CreateMaterial(rc, shaderSet, constantBindings, textureSlots); //_material = factory.CreateMaterial(rc, "instanced-simple-vertex", "instanced-simple-frag", // new MaterialVertexInput(12, new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3)), // new MaterialVertexInput( // InstanceData.SizeInBytes, // new MaterialVertexInputElement("in_offset", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float3, VertexElementInputClass.PerInstance, 1), // new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4, VertexElementInputClass.PerInstance, 1)), // new MaterialInputs<MaterialGlobalInputElement>( // new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"), // new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix")), // new MaterialInputs<MaterialPerObjectInputElement>( // new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, 16)), // MaterialTextureInputs.Empty); }
protected abstract void PlatformSetShaderConstantBindings(ShaderConstantBindings shaderConstantBindings);