Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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();
        }
Exemple #3
0
 /// <summary>
 ///
 /// </summary>
 public void Dispose()
 {
     blurPrim_.Dispose();
     shadowMap_.Dispose();
     foreach (var o in blurMap_)
     {
         o.Dispose();
     }
 }
Exemple #4
0
 /// <summary>
 ///
 /// </summary>
 public void Dispose()
 {
     foreach (var t in avgBuffer_)
     {
         t.Dispose();
     }
     luminanceAvg_.Dispose();
     prim_.Dispose();
     lumResolveShader_.Dispose();
 }
 static public void Dispose()
 {
     prim_.Dispose();
 }