public Material Create(AssetDatabase ad, RenderContext rc, Dictionary <string, ConstantBufferDataProvider> providers = null) { Material ret; if (!CreatedResourceCache.TryGetCachedItem(this, out ret)) { MaterialTextureInputElement[] texElements = TextureInputs.Select(ta => ta.Create(ad)).ToArray(); var allTextures = texElements.Concat(ContextTextures).ToArray(); var materialTextureInputs = new MaterialTextureInputs(allTextures); MaterialInputs <MaterialGlobalInputElement> globalInputs; if (providers != null) { globalInputs = new MaterialInputs <MaterialGlobalInputElement>(GlobalInputs.Select(mgid => mgid.Create(providers)).ToArray()); } else { globalInputs = new MaterialInputs <MaterialGlobalInputElement>(GlobalInputs.Select(mgid => mgid.Create()).ToArray()); } MaterialInputs <MaterialPerObjectInputElement> perObjectInputs = new MaterialInputs <MaterialPerObjectInputElement>(PerObjectInputs); ret = rc.ResourceFactory.CreateMaterial(rc, VertexShader, FragmentShader, VertexInputs, globalInputs, perObjectInputs, materialTextureInputs); CreatedResourceCache.CacheItem(this, ret); } return(ret); }
public Material GetMaterial( RenderContext rc, string vertexShaderName, string pixelShaderName, MaterialVertexInput vertexInputs, MaterialInputs <MaterialGlobalInputElement> globalInputs, MaterialInputs <MaterialPerObjectInputElement> perObjectInputs, MaterialTextureInputs textureInputs) { return(GetMaterial(rc, vertexShaderName, null, pixelShaderName, vertexInputs, globalInputs, perObjectInputs, textureInputs)); }
private void InitializeContextObjects(RenderContext context) { _currentContext = context; ResourceFactory factory = context.ResourceFactory; s_vb = factory.CreateVertexBuffer(VertexPositionNormalTexture.SizeInBytes * _vertices.Length, false); VertexDescriptor desc = new VertexDescriptor(VertexPositionNormalTexture.SizeInBytes, VertexPositionNormalTexture.ElementCount, 0, IntPtr.Zero); s_vb.SetVertexData(_vertices, desc); s_ib = factory.CreateIndexBuffer(sizeof(int) * _indices.Length, false); s_ib.SetIndices(_indices); MaterialVertexInput materialInputs = new MaterialVertexInput( VertexPositionNormalTexture.SizeInBytes, new MaterialVertexInputElement[] { new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3), new MaterialVertexInputElement("in_normal", VertexSemanticType.Normal, VertexElementFormat.Float3), new MaterialVertexInputElement("in_texCoord", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float2) }); MaterialInputs <MaterialGlobalInputElement> globalInputs = new MaterialInputs <MaterialGlobalInputElement>( new MaterialGlobalInputElement[] { new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"), new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix"), new MaterialGlobalInputElement("LightBuffer", MaterialInputType.Custom, "LightBuffer"), }); MaterialInputs <MaterialPerObjectInputElement> perObjectInputs = new MaterialInputs <MaterialPerObjectInputElement>( new MaterialPerObjectInputElement[] { new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, _worldProvider.DataSizeInBytes), new MaterialPerObjectInputElement("InverseTransposeWorldMatrixBuffer", MaterialInputType.Matrix4x4, _inverseTransposeWorldProvider.DataSizeInBytes), }); MaterialTextureInputs textureInputs = new MaterialTextureInputs( new MaterialTextureInputElement[] { new TextureDataInputElement("surfaceTexture", _texture) }); s_material = factory.CreateMaterial( context, VertexShaderSource, FragmentShaderSource, materialInputs, globalInputs, perObjectInputs, textureInputs); s_wireframeRasterizerState = factory.CreateRasterizerState(FaceCullingMode.None, TriangleFillMode.Wireframe, true, true); }
public Task <Material> GetMaterialAsync( RenderContext rc, string vertexShaderName, string pixelShaderName, MaterialVertexInput vertexInputs, MaterialInputs <MaterialGlobalInputElement> globalInputs, MaterialInputs <MaterialPerObjectInputElement> perObjectInputs, MaterialTextureInputs textureInputs) { return(_gs.ExecuteOnMainThread( () => GetMaterial(rc, vertexShaderName, pixelShaderName, vertexInputs, globalInputs, perObjectInputs, textureInputs))); }
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); }
private void InitializeContextObjects(RenderContext rc) { var factory = rc.ResourceFactory; var mesh = LoadTeapotMesh(); _vertexBuffer = factory.CreateVertexBuffer(mesh.Vertices.Length * VertexPositionNormalTexture.SizeInBytes, false); _vertexBuffer.SetVertexData(mesh.Vertices, new VertexDescriptor(VertexPositionNormalTexture.SizeInBytes, 3, 0, IntPtr.Zero)); _indexBuffer = factory.CreateIndexBuffer(mesh.Indices.Length * sizeof(int), false); _indexBuffer.SetIndices(mesh.Indices); MaterialVertexInput materialInputs = new MaterialVertexInput( VertexPositionNormalTexture.SizeInBytes, new MaterialVertexInputElement[] { new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3), new MaterialVertexInputElement("in_normal", VertexSemanticType.Normal, VertexElementFormat.Float3), new MaterialVertexInputElement("in_texCoord", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float2) }); MaterialInputs <MaterialGlobalInputElement> globalInputs = new MaterialInputs <MaterialGlobalInputElement>( new MaterialGlobalInputElement[] { new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"), new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix"), new MaterialGlobalInputElement("LightBuffer", MaterialInputType.Custom, "LightBuffer"), }); MaterialInputs <MaterialPerObjectInputElement> perObjectInputs = new MaterialInputs <MaterialPerObjectInputElement>( new MaterialPerObjectInputElement[] { new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, _worldProvider.DataSizeInBytes), new MaterialPerObjectInputElement("InverseTransposeWorldMatrixBuffer", MaterialInputType.Matrix4x4, _inverseTransposeWorldProvider.DataSizeInBytes), }); MaterialTextureInputs textureInputs = new MaterialTextureInputs( new TextureDataInputElement("surfaceTexture", s_cubeTexture)); _material = factory.CreateMaterial( rc, "textured-vertex", "lit-frag", materialInputs, globalInputs, perObjectInputs, textureInputs); }
public OpenGLTextureBindingSlots(ShaderSet shaderSet, MaterialTextureInputs textureInputs) { TextureInputs = textureInputs; _textureBindings = new OpenGLProgramTextureBinding[textureInputs.Elements.Length]; for (int i = 0; i < textureInputs.Elements.Length; i++) { var element = textureInputs.Elements[i]; int location = GL.GetUniformLocation(((OpenGLShaderSet)shaderSet).ProgramID, element.Name); if (location == -1) { throw new InvalidOperationException($"No sampler was found with the name {element.Name}"); } _textureBindings[i] = new OpenGLProgramTextureBinding(location); } }
public override ShaderTextureBindingSlots CreateShaderTextureBindingSlots(ShaderSet shaderSet, MaterialTextureInputs textureInputs) { return(new D3DShaderTextureBindingSlots((D3DShaderSet)shaderSet, textureInputs)); }
public D3DShaderTextureBindingSlots(D3DShaderSet shaderSet, MaterialTextureInputs textureInputs) { TextureInputs = textureInputs; }