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> private void UpdateCamera() { var world = Matrix.Identity; var viewEye = new Vector3(0, 5, 45); var viewTarget = new Vector3(0, 5, 0); var view = Matrix.Multiply( Matrix.Multiply( Matrix.RotationX(0), Matrix.RotationY(0) ), Matrix.Multiply( Matrix.LookAtRH(viewEye, viewTarget, new Vector3(0, 1, 0)), Matrix.Translation(moving.X, moving.Y, moving.Z * 5.5f) ) ); if (zooming < 0) { zooming = 0; } else if (zooming > 3) { zooming = 3; } var projection = Matrix.PerspectiveFovRH( 30 * ((float)Math.PI - zooming) / 180, (ClientSize.Width - zooming) / ClientSize.Height, 0.1f, 1000 ); effect.GetVariableByName("World").AsMatrix().SetMatrix(world); effect.GetVariableByName("View").AsMatrix().SetMatrix(view); effect.GetVariableByName("Projection").AsMatrix().SetMatrix(projection); }
private void BuildFX() { var shaderFlags = ShaderFlags.None; #if DEBUG shaderFlags |= ShaderFlags.Debug; shaderFlags |= ShaderFlags.SkipOptimization; #endif string errors = null; ShaderBytecode compiledShader = null; try { //compiledShader = new ShaderBytecode(new DataStream(File.ReadAllBytes("fx/Lighting.fxo"), false, false)); //_fx = new Effect(Device, compiledShader); Core.FX.IncludeFX includeFX = new Core.FX.IncludeFX(); compiledShader = ShaderBytecode.CompileFromFile("FX/Lighting.fx", null, "fx_5_0", shaderFlags, EffectFlags.None, null, includeFX, out errors); _fx = new Effect(Device, compiledShader); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } finally { Util.ReleaseCom(ref compiledShader); } _tech = _fx.GetTechniqueByName("LightTech"); _fxWVP = _fx.GetVariableByName("gWorldViewProj").AsMatrix(); _fxWorld = _fx.GetVariableByName("gWorld").AsMatrix(); _fxWIT = _fx.GetVariableByName("gWorldInvTranspose").AsMatrix(); _fxEyePosW = _fx.GetVariableByName("gEyePosW").AsVector(); _fxDirLight = _fx.GetVariableByName("gDirLight"); _fxPointLight = _fx.GetVariableByName("gPointLight"); _fxSpotLight = _fx.GetVariableByName("gSpotLight"); _fxMaterial = _fx.GetVariableByName("gMaterial"); }
private void BuildFX() { ShaderBytecode compiledShader = null; try { compiledShader = new ShaderBytecode(new DataStream(File.ReadAllBytes("fx/Lighting.fxo"), false, false)); _fx = new Effect(Device, compiledShader); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } finally { Util.ReleaseCom(ref compiledShader); } _tech = _fx.GetTechniqueByName("LightTech"); _fxWVP = _fx.GetVariableByName("gWorldViewProj").AsMatrix(); _fxWorld = _fx.GetVariableByName("gWorld").AsMatrix(); _fxWIT = _fx.GetVariableByName("gWorldInvTranspose").AsMatrix(); _fxEyePosW = _fx.GetVariableByName("gEyePosW").AsVector(); _fxDirLight = _fx.GetVariableByName("gDirLight"); _fxPointLight = _fx.GetVariableByName("gPointLight"); _fxSpotLight = _fx.GetVariableByName("gSpotLight"); _fxMaterial = _fx.GetVariableByName("gMaterial"); }
/// <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); }
public void TestFullscreenQuad() { BasicShader shader = null; FullScreenQuad quad = null; var game = new DX11Game(); game.InitDirectX(); var device = game.Device; var bytecode = ShaderBytecode.CompileFromFile("../../Common.Core/Shaders/FullScreenQuad.fx", "fx_5_0", ShaderFlags.None, EffectFlags.None); var effect = new Effect(game.Device, bytecode); var technique = effect.GetTechniqueByName("TestQuadTextured"); var pass = technique.GetPassByIndex(0); quad = new FullScreenQuad(game.Device); var diffuseShaderVariable = effect.GetVariableByName("txDiffuse").AsResource(); var texturePath = Wallpaper001_png; var diffuseTexture = Texture2D.FromFile(device, texturePath); var diffuseTextureRv = new ShaderResourceView(device, diffuseTexture); diffuseShaderVariable.SetResource(diffuseTextureRv); var inputLayout = FullScreenQuad.CreateInputLayout(device, pass); game.GameLoopEvent += delegate { pass.Apply(game.Device.ImmediateContext); quad.Draw(inputLayout); }; game.Run(); }
public void TestDirectX11SpecaterCamera() { var keyboard = new SlimDXTWKeyboard(); var dev = new SlimDX.DirectInput.DirectInput(); var kb = new SlimDX.DirectInput.Keyboard(dev); kb.Acquire(); var mouse = new TWMouse(); var m = new SlimDX.DirectInput.Mouse(dev); m.Acquire(); var game = new DX11Form(); game.InitDirectX(); var device = game.Device; var bytecode = ShaderBytecode.CompileFromFile("../../Common.Core/Shaders/MiniTri.fx", "fx_5_0", ShaderFlags.None, EffectFlags.None); var effect = new Effect(device, bytecode); var technique = effect.GetTechniqueByName("RenderTransform"); var pass = technique.GetPassByIndex(0); var layout = new InputLayout(device, pass.Description.Signature, new[] { new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0), new InputElement("TEXCOORD", 0, Format.R32G32_Float, 32, 0) }); var vertexStride = (16 + 16 + 8); var stream = new DataStream(3 * vertexStride, true, true); stream.WriteRange(new[] { new VertexCustom(new Vector4(-1.0f, 0, 0, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector2(0.5f, 0)), new VertexCustom(new Vector4(0f, 1f, 0, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), new Vector2(0f, 1f)), new VertexCustom(new Vector4(1f, 0f, 0, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), new Vector2(1f, 1f)) }); stream.Position = 0; var vertices = new SlimDX.Direct3D11.Buffer(device, stream, new BufferDescription() { BindFlags = BindFlags.VertexBuffer, CpuAccessFlags = CpuAccessFlags.None, OptionFlags = ResourceOptionFlags.None, SizeInBytes = 3 * vertexStride, Usage = ResourceUsage.Default }); stream.Dispose(); //var world = Matrix.Translation(MathHelper.Forward); /*var viewProjection = Matrix.LookAtRH(Vector3.UnitZ * 5, -Vector3.UnitZ, MathHelper.Up) * Matrix.PerspectiveFovRH(MathHelper.PiOver4, 4f / 3f, 0.1f, 1000f);*/ var diffuseShaderVariable = effect.GetVariableByName("txDiffuse").AsResource(); var worldParam = effect.GetVariableByName("world").AsMatrix(); //worldParam.AsMatrix().SetMatrix(world); var viewProjParam = effect.GetVariableBySemantic("viewprojection").AsMatrix(); /*viewProjParam.SetMatrix( * viewProjection);*/ //worldParam.SetMatrix(Matrix.Identity); //effect.GetVariableBySemantic("viewprojection").AsMatrix().SetMatrix(Matrix.Identity); var texturePath = Wallpaper001_png; var diffuseTexture = Texture2D.FromFile(device, texturePath); var diffuseTextureRv = new ShaderResourceView(device, diffuseTexture); diffuseShaderVariable.SetResource(diffuseTextureRv); var rasterizerState = RasterizerState.FromDescription(device, new RasterizerStateDescription() { CullMode = CullMode.None, FillMode = FillMode.Solid }); device.ImmediateContext.Rasterizer.State = rasterizerState; var cam = new SpectaterCamera(); game.GameLoopEvent += delegate { mouse.UpdateMouseState(m.GetCurrentState()); keyboard.UpdateKeyboardState(kb.GetCurrentState()); cam.Update(0.001f, keyboard, mouse); device.ImmediateContext.InputAssembler.InputLayout = layout; device.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; device.ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding (vertices, vertexStride, 0)); for (int i = 0; i < technique.Description.PassCount; ++i) { pass.Apply(device.ImmediateContext); device.ImmediateContext.Draw(3, 0); } viewProjParam.SetMatrix(cam.ViewProjection); worldParam.SetMatrix(Matrix.Identity); if (keyboard.IsKeyDown(Key.Escape)) { game.Exit(); } }; game.Run(); bytecode.Dispose(); effect.Dispose(); layout.Dispose(); vertices.Dispose(); diffuseTexture.Dispose(); diffuseTextureRv.Dispose(); rasterizerState.Dispose(); kb.Dispose(); m.Dispose(); dev.Dispose(); }
public void TestDirectX11SimpleShader() { var game = new DX11Form(); game.InitDirectX(); var device = game.Device; var bytecode = ShaderBytecode.CompileFromFile("../../Common.Core/Shaders/MiniTri.fx", "fx_5_0", ShaderFlags.None, EffectFlags.None); var effect = new Effect(device, bytecode); var technique = effect.GetTechniqueByName("Render"); var pass = technique.GetPassByIndex(0); var layout = new InputLayout(device, pass.Description.Signature, new[] { new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0), new InputElement("TEXCOORD", 0, Format.R32G32_Float, 32, 0) }); var vertexStride = (16 + 16 + 8); var stream = new DataStream(3 * vertexStride, true, true); stream.WriteRange(new[] { new VertexCustom(new Vector4(0.0f, 0.5f, 0.5f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector2(0.5f, 0)), new VertexCustom(new Vector4(0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), new Vector2(0f, 1f)), new VertexCustom(new Vector4(-0.5f, -0.5f, 0.5f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), new Vector2(1f, 1f)) }); stream.Position = 0; var vertices = new SlimDX.Direct3D11.Buffer(device, stream, new BufferDescription() { BindFlags = BindFlags.VertexBuffer, CpuAccessFlags = CpuAccessFlags.None, OptionFlags = ResourceOptionFlags.None, SizeInBytes = 3 * vertexStride, Usage = ResourceUsage.Default }); stream.Dispose(); var diffuseShaderVariable = effect.GetVariableByName("txDiffuse").AsResource(); var texturePath = Wallpaper001_png; var diffuseTexture = Texture2D.FromFile(device, texturePath); var diffuseTextureRv = new ShaderResourceView(device, diffuseTexture); diffuseShaderVariable.SetResource(diffuseTextureRv); game.GameLoopEvent += delegate { device.ImmediateContext.InputAssembler.InputLayout = layout; device.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; device.ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding (vertices, vertexStride, 0)); for (int i = 0; i < technique.Description.PassCount; ++i) { pass.Apply(device.ImmediateContext); device.ImmediateContext.Draw(3, 0); } }; game.Run(); bytecode.Dispose(); effect.Dispose(); layout.Dispose(); vertices.Dispose(); diffuseTexture.Dispose(); diffuseTextureRv.Dispose(); }
// 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 SetLight(int nowCount) { effect.GetVariableByName("matDiffuse").AsVector().Set(new Color4(materials[nowCount].Diffuse)); effect.GetVariableByName("matAmbient").AsVector().Set(new Color4(materials[nowCount].Ambient)); effect.GetVariableByName("matSpecular").AsVector().Set(new Color4(materials[nowCount].Specular)); effect.GetVariableByName("matAlpha").AsScalar().Set(materials[nowCount].Alpha); effect.GetVariableByName("matSpecularity").AsScalar().Set(materials[nowCount].Specularity); }
private void SetBoolean(string name, bool onoff) { effect.GetVariableByName(name).AsScalar().Set(onoff); }
private void BuildFX() { ShaderBytecode compiledShader = null; try { compiledShader = new ShaderBytecode(new DataStream(File.ReadAllBytes("fx/color.fxo"), false, false)); _fx = new Effect(Device, compiledShader); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } finally { Util.ReleaseCom(ref compiledShader); } _tech = _fx.GetTechniqueByName("ColorTech"); _fxWVP = _fx.GetVariableByName("gWorldViewProj").AsMatrix(); }