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