/// <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]); } }
/// <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], }; }
/// <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, }; }