public override void Initialize()
        {
            base.Initialize();

            try
            {
                using (ShaderBytecode effectByteCode = ShaderBytecode.CompileFromFile(
                           "Shaders/transformEffectWireframe.fx",
                           "Render",
                           "fx_5_0",
                           ShaderFlags.EnableStrictness,
                           EffectFlags.None))
                {
                    effect         = new SlimDX.Direct3D11.Effect(DeviceManager.Instance.device, effectByteCode);
                    technique      = effect.GetTechniqueByIndex(0);
                    pass           = technique.GetPassByIndex(0);
                    inputSignature = pass.Description.Signature;
                }

                var elements = new[] {
                    new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
                };
                layout = new InputLayout(DeviceManager.Instance.device, inputSignature, elements);

                tmat  = effect.GetVariableByName("gWVP").AsMatrix();
                wfCol = effect.GetVariableByName("colorWireframe").AsVector();
                mCol  = effect.GetVariableByName("colorSolid").AsVector();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
Beispiel #2
0
        /// <summary>
        /// モデルを描画する
        /// </summary>
        public void DrawModel(Dx11.Device device, Dx11.Effect effect)
        {
            int startIdx = 0, indexCount = 0;

            for (int i = 0; i < Cnv.meshSection.matList.PolygonCount; i++)
            {
                //マテリアル名から一致するマテリアルを調べる
                int    matNum  = Cnv.meshSection.matList.materialIndex[i];
                string refName = Cnv.meshSection.matList.materialReferens[matNum];

                Material m = GetMaterialFromReference(refName);
                //Console.WriteLine("mat:" + matNum + "-> ref:" + refName + ",matName:" + m.Name);

                //テクスチャを利用しているかどうか
                if (!m.TextureFileName.Equals(""))
                {
                    effect.GetVariableByName("tex").AsScalar().Set(true);
                    effect.GetVariableByName("normalTexture").AsResource().SetResource(textureManager.GetTexture(m.Name));
                }
                else
                {
                    effect.GetVariableByName("tex").AsScalar().Set(false);
                    effect.GetVariableByName("mat").AsScalar().Set(true);
                    effect.GetVariableByName("matColor").AsVector().Set(m.DiffuseColor);
                }

                //頂点数が4の場合は2つに分割する
                if (Cnv.meshSection.meshList.mesh[i].Length == VTXNUM_SQUARE)
                {
                    indexCount = 6;
                    effect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(device.ImmediateContext);
                    device.ImmediateContext.DrawIndexed(indexCount, startIdx, 0);
                }
                else
                {
                    indexCount = 3;
                    effect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(device.ImmediateContext);
                    device.ImmediateContext.DrawIndexed(indexCount, startIdx, 0);
                }
                startIdx += indexCount;
            }

            effect.GetVariableByName("tex").AsScalar().Set(false);
            effect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(device.ImmediateContext);
            device.ImmediateContext.DrawIndexed(indices.Count, 0, 0);
        }
Beispiel #3
0
        // Zavedenie zdrojov
        public void LoadResources(DX11.Device device)
        {
            Vertex[] vertices;
            short[]  indices;
            if (telesoObjektu.Equals("Ihlan"))
            {
                //Ihlan - pyramid
                vertices = new Vertex[]
                {
                    new Vertex(new Vector3(-1, -1, 1), Color.Red.ToArgb()),
                    new Vertex(new Vector3(1, -1, 1), Color.LightBlue.ToArgb()),
                    new Vertex(new Vector3(-1, -1, -1), Color.LightCyan.ToArgb()),
                    new Vertex(new Vector3(1, -1, -1), Color.CadetBlue.ToArgb()),
                    new Vertex(new Vector3(0, 2, 0), Color.Yellow.ToArgb()),
                };

                indices = new short[]
                {
                    //Podstava
                    0, 2, 1,
                    1, 2, 3,
                    //Steny
                    0, 1, 4,
                    1, 3, 4,
                    3, 2, 4,
                    2, 0, 4
                };
            }
            else
            {
                //Kocka - box
                vertices = new Vertex[]   //Matica 8 vrcholov
                {
                    new Vertex(new Vector3(-1, -1, -1), Color.Red.ToArgb()),
                    new Vertex(new Vector3(1, -1, -1), Color.LightBlue.ToArgb()),
                    new Vertex(new Vector3(1, -1, 1), Color.LightCyan.ToArgb()),
                    new Vertex(new Vector3(-1, -1, 1), Color.CadetBlue.ToArgb()),
                    new Vertex(new Vector3(-1, 1, -1), Color.Red.ToArgb()),
                    new Vertex(new Vector3(1, 1, -1), Color.Orange.ToArgb()),
                    new Vertex(new Vector3(1, 1, 1), Color.Goldenrod.ToArgb()),
                    new Vertex(new Vector3(-1, 1, 1), Color.Yellow.ToArgb())
                };

                indices = new short[] //Matica 36 indexov
                {
                    4, 1, 0, 4, 5, 1, //Stena 1 ...
                    5, 2, 1, 5, 6, 2,
                    6, 3, 2, 6, 7, 3,
                    7, 0, 3, 7, 4, 0,
                    7, 5, 4, 7, 6, 5,
                    2, 3, 0, 2, 0, 1
                };
            }



            DataStream outStream      = new DataStream(8 * Marshal.SizeOf(typeof(Vertex)), true, true); //Inicializácia objektu typu DataStream pre vertex buffer
            DataStream outStreamIndex = new DataStream(36 * Marshal.SizeOf(typeof(short)), true, true); //Index buffer

            for (int loop = 0; loop < vertices.Length; loop++)                                          //Načítanie hodnôt
            {
                outStream.Write <Vertex>(vertices[loop]);
            }

            for (int loop = 0; loop < indices.Length; loop++)     //Načítanie hodnôt
            {
                outStreamIndex.Write <short>(indices[loop]);
            }

            outStream.Position      = 0;   //Nastavenie polohy
            outStreamIndex.Position = 0;

            DX11.BufferDescription bufferDescription = new DX11.BufferDescription();
            bufferDescription.BindFlags      = DX11.BindFlags.VertexBuffer;
            bufferDescription.CpuAccessFlags = DX11.CpuAccessFlags.None;
            bufferDescription.OptionFlags    = DX11.ResourceOptionFlags.None;
            bufferDescription.SizeInBytes    = 8 * Marshal.SizeOf(typeof(Vertex));
            bufferDescription.Usage          = DX11.ResourceUsage.Default;

            DX11.BufferDescription bufferDescriptionIndex = new DX11.BufferDescription();
            bufferDescriptionIndex.BindFlags      = DX11.BindFlags.IndexBuffer;
            bufferDescriptionIndex.CpuAccessFlags = DX11.CpuAccessFlags.None;
            bufferDescriptionIndex.OptionFlags    = DX11.ResourceOptionFlags.None;
            bufferDescriptionIndex.SizeInBytes    = 36 * Marshal.SizeOf(typeof(short));
            bufferDescriptionIndex.Usage          = DX11.ResourceUsage.Default;

            m_vertexBuffer = new DX11.Buffer(device, outStream, bufferDescription);           //Inicializácia pre vertex buffer
            m_indexBuffer  = new DX11.Buffer(device, outStreamIndex, bufferDescriptionIndex); //Index buffer
            outStream.Close();
            outStreamIndex.Close();

            //Preloženie efektového súboru (HLSL) a priradenie objektu m_ShaderByteCode
            D3DCompiler.ShaderBytecode m_shaderByteCode =
                D3DCompiler.ShaderBytecode.CompileFromFile("Shader1.fx",
                                                           "fx_5_0",
                                                           D3DCompiler.ShaderFlags.None,
                                                           D3DCompiler.EffectFlags.None);

            m_effect            = new DX11.Effect(device, m_shaderByteCode);              //Objekt pre správu množiny stavovývh objektov, zdrojov a šejdrov pre implementáciu D3D renderovacieho efektu
            m_effectTechnique   = m_effect.GetTechniqueByIndex(0);                        //Získať techniku cez index
            m_effectPass        = m_effectTechnique.GetPassByIndex(0);                    //Získať prechod cez index
            m_transformVariable = m_effect.GetVariableByName("WorldViewProj").AsMatrix(); //Získanie premennej cez meno

            DX11.InputElement[] m_inputElements = new DX11.InputElement[]                 //Parameter pre metódu InputLayout
            {
                new DX11.InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32_Float, 0, 0),
                new DX11.InputElement("COLOR", 0, SlimDX.DXGI.Format.R8G8B8A8_UNorm, 12, 0)
            };
            m_vertexLayout = new DX11.InputLayout(device, m_effectPass.Description.Signature, m_inputElements); //Vytvorenie objektu pre opis vstupu pre "Input assembler stage"
        }
Beispiel #4
0
 private void InitializeVertexLayout()
 {
     layout = new Dx11.InputLayout(
         device, effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature,
         VertexData.Elements);
 }
Beispiel #5
0
 private void InitVertexLayout(Dx11.Device device, Dx11.Effect effect)
 {
     vertexLayout = new Dx11.InputLayout(
         device,
         effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, VertexPositionTexture.VertexElements);
 }
Beispiel #6
0
        private void ParseStandardGlobal(SlimDX.Direct3D11.Effect effect, EffectVariable sg)
        {
            if (!sg.Description.Name.ToLower().Equals("script"))
            {
                throw new InvalidMMEEffectShaderException(
                          string.Format("STANDARDGLOBALセマンティクスの指定される変数名は\"Script\"である必要があります、指定された変数名は\"{0}\"でした。",
                                        sg.Description.Name));
            }
            if (!sg.GetVariableType().Description.TypeName.ToLower().Equals("float"))
            {
                throw new InvalidMMEEffectShaderException(
                          string.Format("STANDARDGLOBALセマンティクスの指定される変数型は\"float\"である必要があります、指定された変数名は\"{0}\"でした。",
                                        sg.GetVariableType().Description.TypeName.ToLower()));
            }
            if (sg.AsScalar().GetFloat() != 0.8f)
            {
                throw new InvalidMMEEffectShaderException(
                          string.Format("STANDARDGLOBALセマンティクスの指定される値は\"0.8\"である必要があります、指定された値は\"{0}\"でした。",
                                        sg.AsScalar().GetFloat()));
            }
            //ScriptOutputの解析
            EffectVariable soVal = EffectParseHelper.getAnnotation(sg, "ScriptOutput", "string");

            if (soVal != null)
            {
                if (!soVal.AsString().GetString().Equals("color"))
                {
                    throw new InvalidMMEEffectShaderException(
                              string.Format(
                                  "STANDARDGLOBALセマンティクスの指定される変数のアノテーション「string ScriptOutput」は、\"color\"でなくてはなりません。指定された値は\"{0}\"でした。",
                                  soVal.AsString().GetString().ToLower()));
                }
            }
            EffectVariable scVal = EffectParseHelper.getAnnotation(sg, "ScriptClass", "string");

            if (scVal != null)
            {
                string sc = scVal.AsString().GetString();
                switch (sc.ToLower())
                {
                case "object":
                    ScriptClass = ScriptClass.Object;
                    break;

                case "scene":
                    ScriptClass = ScriptClass.Scene;
                    break;

                case "sceneorobject":
                    ScriptClass = ScriptClass.SceneOrObject;
                    break;

                default:
                    throw new InvalidMMEEffectShaderException(
                              string.Format(
                                  "STANDARDGLOBALセマンティクスの指定される変数のアノテーション「string ScriptClass」は、\"object\",\"scene\",\"sceneorobject\"でなくてはなりません。指定された値は\"{0}\"でした。(スペルミス?)",
                                  sc.ToLower()));
                }
            }
            EffectVariable sorVal = EffectParseHelper.getAnnotation(sg, "ScriptOrder", "string");

            if (sorVal != null)
            {
                string sor = sorVal.AsString().GetString();
                switch (sor.ToLower())
                {
                case "standard":
                    ScriptOrder = ScriptOrder.Standard;
                    break;

                case "preprocess":
                    ScriptOrder = ScriptOrder.Preprocess;
                    break;

                case "postprocess":
                    ScriptOrder = ScriptOrder.Postprocess;
                    break;

                default:
                    throw new InvalidMMEEffectShaderException(
                              string.Format(
                                  "STANDARDGLOBALセマンティクスの指定される変数のアノテーション「string ScriptOrder」は、\"standard\",\"preprocess\",\"postprocess\"でなくてはなりません。指定された値は\"{0}\"でした。(スペルミス?)",
                                  sor.ToLower()));
                }
            }
            EffectVariable scrVal = EffectParseHelper.getAnnotation(sg, "Script", "string");

            if (scrVal != null)
            {
                StandardGlobalScript = scrVal.AsString().GetString();
                if (string.IsNullOrEmpty(StandardGlobalScript))
                {
                    for (int i = 0; i < effect.Description.TechniqueCount; i++)
                    {
                        SortedTechnique.Add(effect.GetTechniqueByIndex(i));
                    }
                }
                else
                {
                    string[] scriptChunks = StandardGlobalScript.Split(';');
                    if (scriptChunks.Length == 1)
                    {
                        throw new InvalidMMEEffectShaderException(
                                  string.Format("STANDARDGLOBALセマンティクスの指定される変数のスクリプト「{0}」は読み込めませんでした。\";\"が足りません。",
                                                StandardGlobalScript));
                    }
                    string targetScript = scriptChunks[scriptChunks.Length - 2]; //最後のセミコロンが付いているスクリプト以外は無視
                    if (StandardGlobalScript.IndexOf("?") == -1)                 //見つからない時
                    {
                        string[] args = targetScript.Split('=');
                        if (args.Length > 2)
                        {
                            throw new InvalidMMEEffectShaderException(
                                      string.Format("STANDARDGLOBALセマンティクスの指定される変数のスクリプト「{0}」は読み込めませんでした。\"=\"の数が多すぎます。",
                                                    targetScript));
                        }
                        if (!args[0].ToLower().Equals("technique"))
                        {
                            throw new InvalidMMEEffectShaderException(
                                      string.Format(
                                          "STANDARDGLOBALセマンティクスの指定される変数のスクリプト「{0}」は読み込めませんでした。\"{1}\"は\"Technique\"であるべきです。(スペルミス?)",
                                          targetScript, args[0]));
                        }
                        EffectTechnique technique = effect.GetTechniqueByName(args[1]);
                        if (technique != null)
                        {
                            SortedTechnique.Add(technique);
                        }
                        else
                        {
                            throw new InvalidMMEEffectShaderException(
                                      string.Format(
                                          "STANDARDGLOBALセマンティクスの指定される変数のスクリプト「{0}」は読み込めませんでした。テクニック\"{1}\"は存在しません。(スペルミス?)",
                                          targetScript, args[1]));
                        }
                    }
                    else //?が見つかるとき
                    {
                        string[] args = targetScript.Split('?');
                        if (args.Length == 2)
                        {
                            string[] techniques = args[1].Split(':');
                            foreach (string technique in techniques)
                            {
                                EffectTechnique effectTechnique = effect.GetTechniqueByName(technique);
                                if (effectTechnique != null)
                                {
                                    SortedTechnique.Add(effectTechnique);
                                }
                                else
                                {
                                    throw new InvalidMMEEffectShaderException(
                                              string.Format(
                                                  "STANDARDGLOBALセマンティクスの指定される変数のスクリプト「{0}」は読み込めませんでした。テクニック\"{1}\"は見つかりません。(スペルミス?)",
                                                  targetScript, technique));
                                }
                            }
                        }
                        else if (args.Length > 2)
                        {
                            throw new InvalidMMEEffectShaderException(
                                      string.Format("STANDARDGLOBALセマンティクスの指定される変数のスクリプト「{0}」は読み込めませんでした。\"?\"の数が多すぎます。",
                                                    targetScript));
                        }
                    }
                    if (scriptChunks.Length > 2)
                    {
                        Debug.WriteLine(
                            string.Format(
                                "STANDARDGLOBALセマンティクスの指定される変数のスクリプト「{0}」では、複数回Techniqueの代入が行われていますが、最後の代入以外は無視されます。",
                                StandardGlobalScript));
                    }
                }
            }
        }
Beispiel #7
0
 private void DrawTriangle()
 {
     effect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(device.ImmediateContext);
     device.ImmediateContext.Draw(3, 0);
 }