Example #1
0
        private static InputLayout CreateLayout(Device device, byte[] shaderBytecode, MaterialVertexInput[] vertexInputs)
        {
            int count   = vertexInputs.Sum(mvi => mvi.Elements.Length);
            int element = 0;

            InputElement[]  elements       = new InputElement[count];
            SemanticIndices indicesTracker = new SemanticIndices();

            for (int vbSlot = 0; vbSlot < vertexInputs.Length; vbSlot++)
            {
                MaterialVertexInput bufferInput = vertexInputs[vbSlot];
                int numElements   = bufferInput.Elements.Length;
                int currentOffset = 0;
                for (int i = 0; i < numElements; i++)
                {
                    var genericElement = bufferInput.Elements[i];
                    elements[element] = new InputElement(
                        GetSemanticName(genericElement.SemanticType),
                        indicesTracker.GetAndIncrement(genericElement.SemanticType),
                        ConvertGenericFormat(genericElement.ElementFormat),
                        currentOffset,
                        vbSlot,
                        D3DFormats.ConvertInputClass(genericElement.StorageClassifier),
                        genericElement.InstanceStepRate);
                    currentOffset += genericElement.SizeInBytes;
                    element       += 1;
                }
            }

            return(new InputLayout(device, shaderBytecode, elements));
        }
Example #2
0
        private void InitializeContextObjects(RenderContext context)
        {
            s_currentContext = context;
            ResourceFactory factory = context.ResourceFactory;

            s_vb0 = factory.CreateVertexBuffer(12 * s_cubeVertices.Length, false);
            VertexDescriptor desc = new VertexDescriptor(12, 1, 0, IntPtr.Zero);

            s_vb0.SetVertexData(s_cubeVertices.Select(vpc => vpc.Position).ToArray(), desc);

            s_vb1 = factory.CreateVertexBuffer(16 * s_cubeVertices.Length, false);
            VertexDescriptor desc2 = new VertexDescriptor(16, 1, 0, IntPtr.Zero);

            s_vb1.SetVertexData(s_cubeVertices.Select(vpc => vpc.Color).ToArray(), desc2);

            s_ib = factory.CreateIndexBuffer(sizeof(int) * s_cubeIndices.Length, false);
            s_ib.SetIndices(s_cubeIndices);

            MaterialVertexInput materialInputs0 = new MaterialVertexInput(
                12,
                new MaterialVertexInputElement[]
            {
                new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3),
            });

            MaterialVertexInput materialInputs1 = new MaterialVertexInput(
                16,
                new MaterialVertexInputElement[]
            {
                new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4)
            });

            MaterialInputs <MaterialGlobalInputElement> globalInputs = new MaterialInputs <MaterialGlobalInputElement>(
                new MaterialGlobalInputElement[]
            {
                new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix")
            });

            MaterialInputs <MaterialPerObjectInputElement> perObjectInputs = new MaterialInputs <MaterialPerObjectInputElement>(
                new MaterialPerObjectInputElement[]
            {
                new MaterialPerObjectInputElement("ModelViewMatrixBuffer", MaterialInputType.Matrix4x4, _modelViewProvider.DataSizeInBytes)
            });

            s_material = factory.CreateMaterial(
                context,
                VertexShaderSource,
                FragmentShaderSource,
                materialInputs0,
                materialInputs1,
                globalInputs,
                perObjectInputs,
                MaterialTextureInputs.Empty);
        }
Example #3
0
 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));
 }
Example #4
0
        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);
        }
Example #5
0
 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 OpenGLMaterialVertexInput(MaterialVertexInput genericInput)
        {
            VertexSizeInBytes = genericInput.VertexSizeInBytes;
            Elements          = new OpenGLMaterialVertexInputElement[genericInput.Elements.Length];
            int offset = 0;

            for (int i = 0; i < Elements.Length; i++)
            {
                var genericElement = genericInput.Elements[i];
                Elements[i] = new OpenGLMaterialVertexInputElement(genericElement, offset);
                offset     += genericElement.SizeInBytes;
            }
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }