Example #1
0
        /// <summary>
        /// キューブマップにレンダリング
        /// </summary>
        void RenderCubeMap()
        {
            var context = GraphicsCore.ImmediateContext;

            // コンスタントバッファ更新定義
            bool isInit = false;

            Shader.SetConstantBufferUpdateFunc("CB_LightParam", (s, i) => {
                if (!isInit)
                {
                    dynamic cb = i;
                    cb.g_directionalLightDir       = lightMgr_.DirectionalLightDir;
                    cb.g_directionalLightIntensity = lightMgr_.DirectionalLightIntensity;
                    cb.g_shadowMatrix = Matrix.Transpose(shadowMap_.Camera.ViewProjectionMatrix);
                    isInit            = true;
                    return(true);
                }
                return(false);
            });

            // モデルのシェーダ差し換え
            Func <Shader, Shader> overrideFunc = (o) => {
                return(ShaderManager.FindShader("ForwardRender", (uint)(Shader.VertexAttr.NORMAL | Shader.VertexAttr.TEXCOORD0) & o.NeedVertexAttr));
            };

            // 描画アクション
            Action func = () => {
                // TODO:要クリア
                //context.ClearRenderTarget(new Color4(1, 0, 0, 0));
                //context.ClearDepthStencil();
                int shadowMapBindingPoint = 4;
                context.SetShaderResourcePS(shadowMapBindingPoint, shadowMap_.Map);
                GraphicsCore.SetSamplerStatePS(shadowMapBindingPoint, shadowMap_.Map.AddressingModeU, shadowMap_.Map.AddressingModeV);
                ShaderManager.UserShaderBindHandler += overrideFunc;
                SceneDraw(context);
                ShaderManager.UserShaderBindHandler -= overrideFunc;
            };

            //globalCapture_.Capture(func, 3);

            if (localCapture_.Count > 0)
            {
                foreach (var c in localCapture_)
                {
                    c.Capture(context, func, 2);
                }

                int        size   = cubeMapInfo_.numZ * cubeMapInfo_.numY * cubeMapInfo_.numX * 4 * 2;
                DataStream data_r = new DataStream(size, true, true);
                DataStream data_g = new DataStream(size, true, true);
                DataStream data_b = new DataStream(size, true, true);
                for (int z = 0; z < cubeMapInfo_.numZ; z++)
                {
                    for (int y = 0; y < cubeMapInfo_.numY; y++)
                    {
                        for (int x = 0; x < cubeMapInfo_.numX; x++)
                        {
                            int index = (z * cubeMapInfo_.numY * cubeMapInfo_.numX) + (y * cubeMapInfo_.numX) + x;
                            var coef  = localCapture_[index].SHCoef;
                            for (int i = 0; i < 4; i++)
                            {
                                data_r.Write(Lib.Math.CPf32Tof16(coef[i].X));
                                data_g.Write(Lib.Math.CPf32Tof16(coef[i].Y));
                                data_b.Write(Lib.Math.CPf32Tof16(coef[i].Z));
                                //data_r.Write(coef[i].X);
                                //data_g.Write(coef[i].Y);
                                //data_b.Write(coef[i].Z);
                            }
                        }
                    }
                }

                var giTexDesc = new Texture.InitDesc()
                {
                    bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                    width    = cubeMapInfo_.numX,
                    height   = cubeMapInfo_.numY,
                    depth    = cubeMapInfo_.numZ,
                    format   = SlimDX.DXGI.Format.R16G16B16A16_Float,
                    //format = SlimDX.DXGI.Format.R32G32B32A32_Float,
                };
                giTexDesc.initStream = data_r;
                giTextures_[0]       = new Texture(giTexDesc);
                giTextures_[0].SaveFile("asset/gitex_r.dds");
                giTexDesc.initStream = data_g;
                giTextures_[1]       = new Texture(giTexDesc);
                giTextures_[1].SaveFile("asset/gitex_g.dds");
                giTexDesc.initStream = data_b;
                giTextures_[2]       = new Texture(giTexDesc);
                giTextures_[2].SaveFile("asset/gitex_b.dds");
                csMgr_.SetResources(6, giTextures_[0]);
                csMgr_.SetResources(7, giTextures_[1]);
                csMgr_.SetResources(8, giTextures_[2]);
            }
        }
Example #2
0
        /// <summary>
        /// レンダーターゲット初期化
        /// </summary>
        void InitializeTarget()
        {
            // deferred用MRTバッファ
            gbufferDesc_ = new Texture.InitDesc[] {
                new Texture.InitDesc()
                {
                    bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                    width    = MyRenderer.TargetWidth,
                    height   = MyRenderer.TargetHeight,
                    format   = SlimDX.DXGI.Format.R8G8B8A8_UNorm,
                },
                new Texture.InitDesc()
                {
                    bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                    width    = MyRenderer.TargetWidth,
                    height   = MyRenderer.TargetHeight,
                    format   = SlimDX.DXGI.Format.R8G8B8A8_UNorm,
                },
            };
            gbuffers_ = new Texture[gbufferDesc_.Length];
            for (int i = 0; i < gbuffers_.Length; i++)
            {
                gbuffers_[i] = new Texture(gbufferDesc_[i]);
            }
            gBufferBinder_ = new MyRenderer.FrameBuffer();
            gBufferBinder_.color_buffer_  = gbuffers_;
            gBufferBinder_.depth_stencil_ = MyRenderer.DefaultDepthBuffer;

            hdrResolveDesc_ = new Texture.InitDesc()
            {
                bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                width    = MyRenderer.TargetWidth,
                height   = MyRenderer.TargetHeight,
                format   = SlimDX.DXGI.Format.R8G8B8A8_UNorm,
            };
            hdrResolveBuffer_ = new Texture(hdrResolveDesc_);

            hdrResultBuffer_ = new MyRenderer.FrameBuffer();
            hdrResultBuffer_.color_buffer_  = new Texture[] { hdrResolveBuffer_ };
            hdrResultBuffer_.depth_stencil_ = null;

            // アンチなし用プリム
            Lib.Rect rect = new Lib.Rect(new Vector3(-1.0f, 1.0f, 0.0f), new Vector3(1.0f, -1.0f, 0.0f));
            prim_ = new Prim("Outline", (uint)Shader.VertexAttr.TEXCOORD0);
            prim_.AddRect(ref rect);
            prim_.GetMaterial().SetShaderViewPS(0, gbuffers_[0]);
            prim_.GetMaterial().DepthState = RenderState.DepthState.None;

            // FXAA
            fxaaPrim_ = new Prim("FXAA", (uint)Shader.VertexAttr.TEXCOORD0);
            fxaaPrim_.AddRect(ref rect);
            fxaaPrim_.GetMaterial().SetShaderViewPS(0, hdrResolveBuffer_);
            fxaaPrim_.GetMaterial().DepthState = RenderState.DepthState.None;

            // ラインスプライト
            lineSpriteMaterial_ = new Material();
            lineSpriteMaterial_.SetShader("LineSprite", 0);
            lineTexture_ = new Texture("asset/texture/circle32x32_2.png");

            Lib.Shader.SetConstantBufferUpdateFunc("CB_LineSprite", (o, e) => {
                dynamic cb       = e;
                cb.g_screenScale = new Vector4(hdrResolveBuffer_.Width, hdrResolveBuffer_.Height, 1.0f / hdrResolveBuffer_.Width, 1.0f / hdrResolveBuffer_.Height);
                return(true);
            });

            // デバッグ表示用
            debugViewList_ = new Texture[] {
                hdrResolveBuffer_,
                gbuffers_[0],
                gbuffers_[1],
            };
        }
Example #3
0
        /// <summary>
        /// レンダーターゲット初期化
        /// </summary>
        void InitializeTarget()
        {
            // deferred用MRTバッファ
            gbufferDesc_ = new Texture.InitDesc[] {
                new Texture.InitDesc()
                {
                    bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                    width    = GraphicsCore.TargetWidth,
                    height   = GraphicsCore.TargetHeight,
                    format   = SlimDX.DXGI.Format.R16G16B16A16_Float,
                },
                new Texture.InitDesc()
                {
                    bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                    width    = GraphicsCore.TargetWidth,
                    height   = GraphicsCore.TargetHeight,
                    format   = SlimDX.DXGI.Format.R8G8B8A8_UNorm,
                },
                new Texture.InitDesc()
                {
                    bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                    width    = GraphicsCore.TargetWidth,
                    height   = GraphicsCore.TargetHeight,
                    format   = SlimDX.DXGI.Format.R8G8B8A8_UNorm,
                },
            };
            gbuffers_ = new Texture[gbufferDesc_.Length];
            for (int i = 0; i < gbuffers_.Length; i++)
            {
                gbuffers_[i] = new Texture(gbufferDesc_[i]);
            }
            deferredBuffer_ = new GraphicsCore.FrameBuffer();
            deferredBuffer_.color_buffer_  = gbuffers_;
            deferredBuffer_.depth_stencil_ = GraphicsCore.DefaultDepthBuffer;

            uavDesc_ = new Texture.InitDesc {
                bindFlag = TextureBuffer.BindFlag.IsRenderTarget | TextureBuffer.BindFlag.IsUnorderedAccess,
                width    = GraphicsCore.TargetWidth,
                height   = GraphicsCore.TargetHeight,
                format   = SlimDX.DXGI.Format.R16G16B16A16_Float,
            };
            uav_ = new Texture(uavDesc_);
            csMgr_.SetUAVs(new Texture[] { uav_ });
            var bufs = new IShaderView[] { gbuffers_[0], gbuffers_[1], gbuffers_[2], GraphicsCore.DefaultDepthBuffer, lightMgr_.LightBuffer, shadowMap_.Map };

            csMgr_.SetResources(bufs);

            hdrResolveDesc_ = new Texture.InitDesc()
            {
                bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                width    = GraphicsCore.TargetWidth,
                height   = GraphicsCore.TargetHeight,
                format   = SlimDX.DXGI.Format.R8G8B8A8_UNorm,
            };
            hdrResolveBuffer_ = new Texture(hdrResolveDesc_);

            forwardBuffer_ = new GraphicsCore.FrameBuffer();
            forwardBuffer_.color_buffer_  = new Texture[] { uav_ };
            forwardBuffer_.depth_stencil_ = GraphicsCore.DefaultDepthBuffer;

            hdrResultBuffer_ = new GraphicsCore.FrameBuffer();
            hdrResultBuffer_.color_buffer_  = new Texture[] { hdrResolveBuffer_ };
            hdrResultBuffer_.depth_stencil_ = null;

            // キューブマップ
            int cubeSize = 128;

            globalCapture_ = new ReflectionCapture(cubeSize, new Vector3(0, 3, 0));
            localCapture_  = new List <ReflectionCapture>();
            giTextures_    = new Texture[3];
            if (System.IO.File.Exists("asset/gitex_r.dds"))
            {
                giTextures_[0] = new Texture("asset/gitex_r.dds");
                giTextures_[1] = new Texture("asset/gitex_g.dds");
                giTextures_[2] = new Texture("asset/gitex_b.dds");
                csMgr_.SetResources(6, giTextures_[0]);
                csMgr_.SetResources(7, giTextures_[1]);
                csMgr_.SetResources(8, giTextures_[2]);
                cubeMapRenderEnable_ = false;
            }

            // グリッド上で生成
            if (cubeMapRenderEnable_)
            {
                Vector3 bounds = cubeMapInfo_.boundingMax - cubeMapInfo_.boundingMin;
                for (int z = 0; z < cubeMapInfo_.numZ; z++)
                {
                    for (int y = 0; y < cubeMapInfo_.numY; y++)
                    {
                        for (int x = 0; x < cubeMapInfo_.numX; x++)
                        {
                            Vector3 add = new Vector3(bounds.X * ((float)x / (cubeMapInfo_.numX - 1)),
                                                      bounds.Y * ((float)y / (cubeMapInfo_.numY - 1)),
                                                      bounds.Z * ((float)z / (cubeMapInfo_.numZ - 1))
                                                      );
                            Vector3 pos = cubeMapInfo_.boundingMin + add;
                            localCapture_.Add(new ReflectionCapture(cubeSize, pos));
                        }
                    }
                }
            }

            // アンチなし用プリム
            Lib.Rect rect = new Lib.Rect(new Vector3(-1.0f, 1.0f, 0.0f), new Vector3(1.0f, -1.0f, 0.0f));
            prim_ = new Prim("Direct", (uint)Shader.VertexAttr.TEXCOORD0);
            prim_.AddRect(ref rect);
            prim_.GetMaterial().SetShaderViewPS(0, gbuffers_[0]);
            prim_.GetMaterial().DepthState = RenderState.DepthState.None;

            // FXAA
            fxaaPrim_ = new Prim("FXAA", (uint)Shader.VertexAttr.TEXCOORD0);
            fxaaPrim_.AddRect(ref rect);
            fxaaPrim_.GetMaterial().SetShaderViewPS(0, hdrResolveBuffer_);
            fxaaPrim_.GetMaterial().DepthState = RenderState.DepthState.None;

            // デバッグ表示用
            debugViewList_ = new Texture[] {
                hdrResolveBuffer_,
                gbuffers_[0],
                gbuffers_[1],
                gbuffers_[2],
                shadowMap_.Map,
                toneMap_.LuminanceAvgTexture,
            };
        }