//============================================================ // <T>开始当前渲染过程。</T> // // @param region 区域 // @param target 是否为最终目标 //============================================================ public override void Begin(FDxRegion region) { _device.SetRenderTarget(_depthTexture, _targets); _depthTexture.Clear(); _textureFlags.Clear(0, 0, 0, 0); _textureColor.Clear(0, 0, 0, 0); }
//============================================================ public void Export3d2(FDrGeometry geometry, string filename) { SIntSize size = new SIntSize(1024, 1024); Form form = new Form(); FDxDevice3D device = RDxCore.Adapter.CreateDevice(form.Handle, size.Width, size.Height); device.ModeWireFrame = false; // 设置几何体 FDxRegion region = new FDxRegion(); FDsNormalGeometry normalGeometry = new FDsNormalGeometry(); normalGeometry.Device = device; normalGeometry.LoadResource(geometry); region.Renderables.Push(normalGeometry); // 设置目标 FDxBufferedTexture texture = new FDxBufferedTexture(); texture.Device = device; texture.Create(size.Width, size.Height); device.SetRenderTarget(texture); // 绘制结果 FDxTechnique technique = RDxCore.TechniqueConsole.Get(device, "normal.map"); technique.Draw(region); // 保存内容 texture.SaveFile(filename); // 创建设备 // QNormalMapForm form = new QNormalMapForm(); // form.geometry = geometry; // Application.Run(form); }
//============================================================ public override void DrawRenderable(FDxRegion region, FDxRenderable renderable, FDxEffect effect) { // 是否为UI对象 if (!renderable.IsUi) { return; } // 设置输入数据缓冲 _device.NativeDevice.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _device.NativeDevice.InputAssembler.SetVertexBuffers(0, renderable.VertexBuffer.NativeBuffers); _device.NativeDevice.InputAssembler.SetIndexBuffer(renderable.FaceBuffer.NativeBuffer, Format.R32_UInt, 0); // 设置渲染对象参数 FDxGeometry geometry = renderable as FDxGeometry; FDxMaterial material = geometry.Material; effect.NativeEffect.GetVariableByName("_flags").AsVector().Set(new Vector4(renderable.Id, 0, 0, 0)); effect.NativeEffect.GetVariableByName("_status").AsVector().Set(new Vector4(renderable.IsSelected ? 1 : 0, 0, 0, 0)); effect.SetMatrix("_modelMatrix", renderable.ModelMatrix); effect.SetNativeMatrix("_viewMatrix", region.Camera.Matrix.Native); effect.SetNativeMatrix("_projectionMatrix", region.Camera.Viewport.Matrix); effect.NativeEffect.GetVariableByName("_cameraPosition").AsVector().Set(new Vector3(region.Camera.Position.X, region.Camera.Position.Y, region.Camera.Position.Z)); effect.NativeEffect.GetVariableByName("_lightPosition").AsVector().Set(new Vector3(region.LightDirectional.Position.X, region.LightDirectional.Position.Y, region.LightDirectional.Position.Z)); effect.NativeEffect.GetVariableByName("_ambientColor").AsVector().Set(new Vector4(material.AmbientColor.R, material.AmbientColor.G, material.AmbientColor.B, material.AmbientColor.A)); effect.NativeEffect.GetVariableByName("_diffuseColor").AsVector().Set(new Vector4(material.DiffuseColor.R, material.DiffuseColor.G, material.DiffuseColor.B, material.DiffuseColor.A)); effect.NativeEffect.GetVariableByName("_specularColor").AsVector().Set(new Vector4(material.SpecularColor.R, material.SpecularColor.G, material.SpecularColor.B, material.SpecularColor.A)); // 提交效果设置 effect.NativePass.Apply(_device.NativeDevice); // 绘制几何体 _device.NativeDevice.DrawIndexed(renderable.FaceBuffer.count, 0, 0); }
//============================================================ public void ExportMerge(FDrModel model) { SIntSize size = new SIntSize(_width, _height); Form form = new Form(); FDxDevice3D device = RDxCore.Adapter.CreateDevice(form.Handle, size.Width, size.Height); device.ModeWireFrame = false; // 设置几何体 FDxRegion region = new FDxRegion(); // 设置目标 FDxBufferedTexture texture = new FDxBufferedTexture(); texture.Device = device; texture.Create(size.Width, size.Height); device.SetRenderTarget(texture); // 渲染几何体 FDxTechnique technique = RDxCore.TechniqueConsole.Get(device, "light.map"); int index = 0; foreach (INamePair <FDrGeometry> pair in model.Mesh.GeometryDictionary) { FDrLightGeometry geometry = new FDrLightGeometry(); geometry.Device = device; geometry.LoadResource(pair.Value); region.Renderables.Clear(); region.Renderables.Push(geometry); // 绘制结果 technique.Draw(region); // 保存内容 texture.SaveFile(model.Directory + "/" + RInt.Pad(index, 3) + ".png"); index++; } }
//============================================================ public override void DrawRenderable(FDxRegion region, FDxRenderable renderable, FDxEffect effect) { // 设置顶点缓冲 FDxGeometry geometry = renderable as FDxGeometry; effect.NativeEffect.GetVariableByName("_modelMatrix").AsMatrix().SetMatrix(renderable.Matrix.Native); effect.NativeEffect.GetVariableByName("_viewMatrix").AsMatrix().SetMatrix(region.Camera.Matrix.Native); effect.NativeEffect.GetVariableByName("_projectionMatrix").AsMatrix().SetMatrix(region.Camera.Viewport.Matrix); effect.NativeEffect.GetVariableByName("_cameraPosition").AsVector().Set(new Vector3(region.Camera.Position.X, region.Camera.Position.Y, region.Camera.Position.Z)); effect.NativeEffect.GetVariableByName("_lightPosition").AsVector().Set(new Vector3(region.LightDirectional.Position.X, region.LightDirectional.Position.Y, region.LightDirectional.Position.Z)); effect.NativeEffect.GetVariableByName("_lightDirection").AsVector().Set(new Vector3(region.LightDirectional.Camera.Direction.X, region.LightDirectional.Camera.Direction.Y, region.LightDirectional.Camera.Direction.Z)); _device.NativeDevice.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _device.NativeDevice.InputAssembler.SetVertexBuffers(0, renderable.VertexBuffer.NativeBuffers); _device.NativeDevice.InputAssembler.SetIndexBuffer(renderable.FaceBuffer.NativeBuffer, Format.R32_UInt, 0); int textureCount = geometry.Material.Textures.Count; for (int i = 0; i < textureCount; i++) { FDxTexture texture = geometry.Material.Textures[i]; if (null != texture) { string textureName = "_texture" + RString.FirstUpper(texture.TypeName); effect.NativeEffect.GetVariableByName(textureName).AsResource().SetResource(texture.NativeResource); } } effect.NativePass.Apply(_device.NativeDevice); _device.NativeDevice.DrawIndexed(renderable.FaceBuffer.count, 0, 0); }
//============================================================ // <T>开始当前渲染过程。</T> // // @param region 区域 // @param target 是否为最终目标 //============================================================ public override void Begin(FDxRegion region) { _device.ModeWireFrame = true; //_device.SetRenderTarget(_depthTexture, _lineTexture); //_depthTexture.Clear(); _device.NativeDevice.OutputMerger.SetTargets(_device.NativeDevice.OutputMerger.GetDepthStencilView(), _lineTexture.NativeTarget); _lineTexture.Clear(0, 0, 0, 1); }
//============================================================ // <T>绘制区域内所有节点集合。</T> // // @param p:region 区域 //============================================================ public virtual void Draw(FDxRegion region) { // 开始处理 Begin(region); // 绘制处理 DrawRegion(region); // 结束处理 End(region); }
//============================================================ // <T>开始当前渲染过程。</T> // // @param region 区域 // @param target 是否为最终目标 //============================================================ public override void Begin(FDxRegion region) { _device.SetRenderTarget(_depthTexture, _targets); _depthTexture.Clear(); _textureFlags.Clear(0, 0, 0, 0); _textureColor.Clear(region.BackgroundColor); _texturePosition.Clear(1, 1, 1, 0); _textureNormal.Clear(1, 1, 1, 0); _textureSelected.Clear(0, 0, 0, 0); }
//============================================================ public FDxBufferedTexture ExportTexture(string importFileName) { // 获得图片大小 Bitmap bmp = new Bitmap(importFileName); _size.Set(bmp.Width, bmp.Height); bmp.Dispose(); // 生成目标 Form form = new Form(); FDxDevice3D device = RDxCore.Adapter.CreateDevice(form.Handle, _size.Width, _size.Height); device.ModeWireFrame = false; // 设置几何体 FDxRegion region = new FDxRegion(); // 渲染几何体 FDxTechnique technique = RDxCore.TechniqueConsole.Get(device, "growing"); FDrGrowingGeometry geometry = new FDrGrowingGeometry(); geometry.Device = device; geometry.LoadResource(); // 绘制结果 region.Renderables.Push(geometry); // 设置目标 FDxBufferedTexture texture = new FDxBufferedTexture(); texture.Device = device; texture.Create(_size.Width, _size.Height); // 绘制目标 FDxTexture originTexture = new FDxTexture(); originTexture.Device = device; originTexture.LoadFile(importFileName); geometry.Material.Textures.Push(originTexture); // 绘制目标 FDxTexture importTexture = new FDxTexture(); importTexture.Device = device; importTexture.LoadFile(importFileName); geometry.Material.Textures.Push(importTexture); MemoryStream stream = new MemoryStream(); for (int n = 0; n < _borderCount; n++) { device.SetRenderTarget(texture); // 绘制目标 technique.Draw(region); device.SetRenderTarget(); // 复制渲染目标为开始 //importTexture.CopyFrom(texture); texture.SaveStream(stream); importTexture.LoadStream(stream); } // 保存内容 return(texture); }
//============================================================ // <T>绘制区域内所有节点集合。</T> // // @param p:region 区域 //============================================================ public override void DrawRenderable(FDxRegion region, FDxRenderable renderable, FDxEffect effect) { // 设置顶点缓冲 FDxGeometry geometry = renderable as FDxGeometry; _device.NativeDevice.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _device.NativeDevice.InputAssembler.SetVertexBuffers(0, renderable.VertexBuffer.NativeBuffers); _device.NativeDevice.InputAssembler.SetIndexBuffer(renderable.FaceBuffer.NativeBuffer, Format.R32_UInt, 0); effect.NativePass.Apply(_device.NativeDevice); _device.NativeDevice.DrawIndexed(renderable.FaceBuffer.count, 0, 0); }
//============================================================ // <T>绘制区域内所有节点集合。</T> // // @param region 区域 // @param nodes 节点集合 //============================================================ public virtual void Draw(FDxRegion region) { _total++; int count = _passes.Count; for (int n = 0; n < count; n++) { // 获得渲染过程 FDxPass pass = _passes[n]; // 渲染当前过程 pass.Draw(region); } }
//============================================================ // <T>绘制区域内所有节点集合。</T> // // @param p:region 区域 //============================================================ public override void DrawRenderable(FDxRegion region, FDxRenderable renderable, FDxEffect effect) { // 设置顶点缓冲 FDxGeometry geometry = renderable as FDxGeometry; effect.NativeEffect.GetVariableByName("_modelMatrix").AsMatrix().SetMatrix(renderable.Matrix.Native); effect.NativeEffect.GetVariableByName("_viewMatrix").AsMatrix().SetMatrix(region.Camera.Matrix.Native); effect.NativeEffect.GetVariableByName("_projectionMatrix").AsMatrix().SetMatrix(region.Camera.Viewport.Matrix); _device.NativeDevice.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _device.NativeDevice.InputAssembler.SetVertexBuffers(0, renderable.VertexBuffer.NativeBuffers); _device.NativeDevice.InputAssembler.SetIndexBuffer(renderable.FaceBuffer.NativeBuffer, Format.R32_UInt, 0); effect.NativePass.Apply(_device.NativeDevice); _device.NativeDevice.DrawIndexed(renderable.FaceBuffer.count, 0, 0); }
//============================================================ public override void DrawRenderable(FDxRegion region, FDxRenderable renderable, FDxEffect effect) { if (renderable.IsUi) { return; } // 设置输入数据缓冲 _device.NativeDevice.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _device.NativeDevice.InputAssembler.SetVertexBuffers(0, renderable.VertexBuffer.NativeBuffers); _device.NativeDevice.InputAssembler.SetIndexBuffer(renderable.FaceBuffer.NativeBuffer, Format.R32_UInt, 0); // 设置渲染对象参数 Vector4 flags = new Vector4(renderable.IsSelected ? 1 : 0, renderable.IsUi ? 1 : 0, 0, 0); // 设置渲染对象参数 FDxGeometry geometry = renderable as FDxGeometry; FDxMaterial material = geometry.Material; effect.NativeEffect.GetVariableByName("_flags").AsVector().Set(new Vector4(renderable.Id, 0, 0, 0)); effect.NativeEffect.GetVariableByName("_status").AsVector().Set(flags); effect.SetMatrix("_modelMatrix", renderable.ModelMatrix); effect.SetNativeMatrix("_viewMatrix", region.Camera.Matrix.Native); effect.SetNativeMatrix("_projectionMatrix", region.Camera.Viewport.Matrix); effect.NativeEffect.GetVariableByName("_projectionMatrix").AsMatrix().SetMatrix(region.Camera.Viewport.Matrix); effect.NativeEffect.GetVariableByName("_cameraPosition").AsVector().Set(new Vector3(region.Camera.Position.X, region.Camera.Position.Y, region.Camera.Position.Z)); effect.NativeEffect.GetVariableByName("_lightPosition").AsVector().Set(new Vector3(region.LightDirectional.Position.X, region.LightDirectional.Position.Y, region.LightDirectional.Position.Z)); effect.NativeEffect.GetVariableByName("_lightDirection").AsVector().Set(new Vector3(region.LightDirectional.Camera.Direction.X, region.LightDirectional.Camera.Direction.Y, region.LightDirectional.Camera.Direction.Z)); // 设置渲染材质参数 effect.NativeEffect.GetVariableByName("_ambientColor").AsVector().Set(new Vector4(material.AmbientColor.R, material.AmbientColor.G, material.AmbientColor.B, material.AmbientColor.A)); effect.NativeEffect.GetVariableByName("_diffuseColor").AsVector().Set(new Vector4(material.DiffuseColor.R, material.DiffuseColor.G, material.DiffuseColor.B, material.DiffuseColor.A)); effect.NativeEffect.GetVariableByName("_specularColor").AsVector().Set(new Vector4(material.SpecularColor.R, material.SpecularColor.G, material.SpecularColor.B, material.SpecularColor.A)); // 设置纹理列表 int textureCount = geometry.Material.Textures.Count; for (int i = 0; i < textureCount; i++) { FDxTexture texture = geometry.Material.Textures[i]; if (null != texture) { string textureName = "_texture" + RString.FirstUpper(texture.TypeName); effect.NativeEffect.GetVariableByName(textureName).AsResource().SetResource(texture.NativeResource); } } // 提交效果设置 effect.NativePass.Apply(_device.NativeDevice); // 绘制几何体 _device.NativeDevice.DrawIndexed(renderable.FaceBuffer.count, 0, 0); }
//============================================================ // <T>绘制区域内所有节点集合。</T> // // @param p:region 区域 //============================================================ public override void DrawRenderable(FDxRegion region, FDxRenderable renderable, FDxEffect effect) { // 设置顶点缓冲 FDxGeometry geometry = renderable as FDxGeometry; _device.NativeDevice.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _device.NativeDevice.InputAssembler.SetVertexBuffers(0, renderable.VertexBuffer.NativeBuffers); _device.NativeDevice.InputAssembler.SetIndexBuffer(renderable.FaceBuffer.NativeBuffer, Format.R32_UInt, 0); FDxTexture orignTexture = renderable.Material.Textures[0]; FDxTexture texture = renderable.Material.Textures[1]; effect.NativeEffect.GetVariableByName("_textureSize").AsVector().Set(new Vector2(texture.Size.Width, texture.Size.Height)); effect.NativeEffect.GetVariableByName("_textureOrigin").AsResource().SetResource(orignTexture.NativeResource); effect.NativeEffect.GetVariableByName("_textureColor").AsResource().SetResource(texture.NativeResource); effect.NativePass.Apply(_device.NativeDevice); _device.NativeDevice.DrawIndexed(renderable.FaceBuffer.count, 0, 0); }
//============================================================ public int HitTest(FDxRegion region, int x, int y) { // 绘制结果 _passDesign.Draw(region); _passUi.Draw(region); // 计算位置 int renderableId = 0; int cx = (int)((float)x / _device.Size.Width * _buffer.Size.Width); int cy = (int)((float)y / _device.Size.Height * _buffer.Size.Height); // 测试物件选中 _device.NativeDevice.CopyResource(_passDesign.TextureFlags.NativeTexture, _buffer.NativeTexture); DataRectangle designData = _buffer.NativeTexture.AsSurface().Map(SlimDX.DXGI.MapFlags.Read); unsafe { int *pData = (int *)designData.Data.DataPointer.ToPointer(); pData += 4 * (_buffer.Size.Width * cy + cx); int r = *pData++; int g = *pData++; int b = *pData++; int a = *pData++; renderableId = r; } _buffer.NativeTexture.AsSurface().Unmap(); // 测试物件选中 _device.NativeDevice.CopyResource(_passUi.TextureFlags.NativeTexture, _buffer.NativeTexture); DataRectangle uiData = _buffer.NativeTexture.AsSurface().Map(SlimDX.DXGI.MapFlags.Read); unsafe { int *pData = (int *)uiData.Data.DataPointer.ToPointer(); pData += 4 * (_buffer.Size.Width * cy + cx); int r = *pData++; int g = *pData++; int b = *pData++; int a = *pData++; if (r > 0) { renderableId = r; } } _buffer.NativeTexture.AsSurface().Unmap(); return(renderableId); }
//============================================================ public override void DrawRegion(FDxRegion region) { _device.Program = _program; // 设置输入数据信息 _device.NativeDevice.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; _device.NativeDevice.InputAssembler.SetVertexBuffers(0, _rectangle.VertexBuffer.NativeBuffers); _device.NativeDevice.InputAssembler.SetIndexBuffer(_rectangle.FaceBuffer.NativeBuffer, Format.R32_UInt, 0); // 绑定纹理列表 _program.NativeEffect.GetVariableByName("_textureFlags").AsResource().SetResource(_textureFlags.NativeResource); _program.NativeEffect.GetVariableByName("_textureColor").AsResource().SetResource(_textureColor.NativeResource); _program.NativeEffect.GetVariableByName("_textureColorUi").AsResource().SetResource(_textureColorUi.NativeResource); _program.NativeEffect.GetVariableByName("_texturePosition").AsResource().SetResource(_texturePosition.NativeResource); _program.NativeEffect.GetVariableByName("_textureNormal").AsResource().SetResource(_textureNormal.NativeResource); _program.NativeEffect.GetVariableByName("_textureSelected").AsResource().SetResource(_textureSelected.NativeResource); // 提交效果设置 _program.NativePass.Apply(_device.NativeDevice); // 绘制几何体 _device.NativeDevice.DrawIndexed(_rectangle.FaceBuffer.count, 0, 0); }
//============================================================ // <T>绘制区域内所有节点集合。</T> // // @param p:region 区域 //============================================================ public virtual void DrawRegion(FDxRegion region) { // 绘制处理 FDxRenderableCollection renderables = region.Renderables; int count = renderables.Count; for (int n = 0; n < count; n++) { FDxRenderable renderable = renderables[n]; // 设置程序 FDxProgram program = renderable.Programs.Find(_name); if (null == program) { program = RDxCore.EffectConsole.Get(_device, _name); renderable.Programs.Set(_name, program); } _device.Program = program; // 设置顶点缓冲 DrawRenderable(region, renderable, program as FDxEffect); } }
private void QNormalMapForm_Load(object sender, EventArgs e) { device = RDxCore.Adapter.CreateDevice(Handle, 1024, 1024); // 设置几何体 region = new FDxRegion(); FDsNormalGeometry normalGeometry = new FDsNormalGeometry(); normalGeometry.Device = device; normalGeometry.LoadResource(geometry); region.Renderables.Push(normalGeometry); // 设置目标 FDxBufferedTexture texture = new FDxBufferedTexture(); texture.Device = device; texture.Create(1024, 1024); //device.SetRenderTarget(texture); // 绘制结果 technique = RDxCore.TechniqueConsole.Get(device, "normal.map"); // 保存内容 //texture.SaveFile(filename); timer1.Enabled = true; }
//============================================================ // <T>开始当前渲染过程。</T> // // @param region 区域 // @param target 是否为最终目标 //============================================================ public override void Begin(FDxRegion region) { _device.Clear(0.0f, 0.0f, 0.0f, 0.0f); //_device.ModeDouble = false; }
//============================================================ public virtual void delayUpdate(FDxRegion region) { }
//============================================================ // <T>结束当前渲染过程。</T> // // @param region 区域 //============================================================ public virtual void End(FDxRegion region) { }
//============================================================ // <T>开始当前渲染过程。</T> // // @param region 区域 // @param target 是否为最终目标 //============================================================ public override void Begin(FDxRegion region) { _device.Clear(0.0f, 0.0f, 0.0f, 0.0f); }
//============================================================ // <T>开始当前渲染过程。</T> // // @param region 区域 // @param target 是否为最终目标 //============================================================ public virtual void Begin(FDxRegion region) { _device.SetRenderTarget(); _device.Clear(0.0f, 0.0f, 0.0f, 1.0f); }
//============================================================ // <T>开始当前渲染过程。</T> // // @param region 区域 // @param target 是否为最终目标 //============================================================ public override void Begin(FDxRegion region) { _device.ModeWireFrame = false; _device.SetRenderTarget(); _device.Clear(0.0f, 0.0f, 0.0f, 1.0f); }
//============================================================ // <T>更新技术信息。</T> //============================================================ public virtual void update(FDxRegion region) { }