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()); } }
/// <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); }
// 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" }
private void InitializeVertexLayout() { layout = new Dx11.InputLayout( device, effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, VertexData.Elements); }
private void InitVertexLayout(Dx11.Device device, Dx11.Effect effect) { vertexLayout = new Dx11.InputLayout( device, effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, VertexPositionTexture.VertexElements); }
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)); } } } }
private void DrawTriangle() { effect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(device.ImmediateContext); device.ImmediateContext.Draw(3, 0); }