/// <summary> /// BRDFで使用するLUTを生成する(UE4方式) /// </summary> public static Texture CreateBRDFLookUpTable(GraphicsContext context, int w, int h) { var tex = new Texture(new Texture.InitDesc { bindFlag = TextureBuffer.BindFlag.IsRenderTarget, width = w, height = h, format = SlimDX.DXGI.Format.R16G16_Float, }); Lib.Rect rect = new Lib.Rect(new Vector3(-1.0f, 1.0f, 0.0f), new Vector3(1.0f, -1.0f, 0.0f)); var prim = new Prim("GenerateBRDF_LUT", (uint)Shader.VertexAttr.TEXCOORD0); prim.AddRect(ref rect); prim.GetMaterial().DepthState = RenderState.DepthState.None; GraphicsCore.FrameBuffer frameBuffer = new GraphicsCore.FrameBuffer(); frameBuffer.color_buffer_ = new Texture[1] { tex }; context.SetRenderTargets(frameBuffer.color_buffer_, null); prim.Draw(context); prim.Dispose(); return(tex); }
/// <summary> /// PBR用プレフィルタキューブマップを作成する /// </summary> /// <param name="output"></param> /// <param name="source"></param> public static void PrefilterRadiance(Texture output, Texture source) { Lib.Rect rect = new Lib.Rect(new Vector3(-1.0f, 1.0f, 0.0f), new Vector3(1.0f, -1.0f, 0.0f)); var prim = new Prim("PrefilterRadianceMap", (uint)Shader.VertexAttr.TEXCOORD0); prim.AddRect(ref rect); prim.GetMaterial().DepthState = RenderState.DepthState.None; prim.GetMaterial().SetShaderViewPS(0, source); int miplevel = 1; int size = source.Width; while (size > 1) { size = size >> 1; miplevel++; } // テクスチャを再生成 output.Dispose(); output.Initialize(new Texture.InitDesc() { bindFlag = TextureBuffer.BindFlag.IsRenderTarget, optionFlags = ResourceOptionFlags.TextureCube, width = source.Width, height = source.Height, mips = miplevel, format = SlimDX.DXGI.Format.R16G16B16A16_Float, }); GraphicsCore.FrameBuffer frameBuffer = new GraphicsCore.FrameBuffer(); frameBuffer.color_buffer_ = new Texture[1] { output }; frameBuffer.is_array_buffer_ = true; // 描画 for (int m = 0; m < miplevel; m++) { for (int i = 0; i < 6; i++) { // コンスタントバッファ Shader.SetConstantBufferUpdateFunc("CB_PrefilterCubeMap", (s, inst) => { dynamic cb = inst; cb.g_face = (float)i; cb.g_mipLevel = (float)m; cb.g_maxMipLevel = (float)miplevel; return(true); }); frameBuffer.array_buffer_index_ = m * 6 + i; // TODO: //GraphicsCore.BeginRender(frameBuffer); //prim.Draw(); //GraphicsCore.EndRender(); } } prim.Dispose(); }
/// <summary> /// /// </summary> public void Dispose() { blurPrim_.Dispose(); shadowMap_.Dispose(); foreach (var o in blurMap_) { o.Dispose(); } }
/// <summary> /// /// </summary> public void Dispose() { foreach (var t in avgBuffer_) { t.Dispose(); } luminanceAvg_.Dispose(); prim_.Dispose(); lumResolveShader_.Dispose(); }
static public void Dispose() { prim_.Dispose(); }