예제 #1
0
        public bool Bake(TextureCube texture, RenderWrap renderWrap, ref object tag)
        {
            var tex = renderWrap.GetTex2D(Source);

            if (tex == null || tex.Status != GraphicsObjectStatus.loaded)
            {
                return(false);
            }
            renderWrap.SetRootSignature("Csu");
            int width  = texture.width;
            int height = texture.height;
            var writer = renderWrap.Writer;

            writer.Write(width);
            writer.Write(height);
            writer.SetCBV(0);
            renderWrap.SetSRVs(new string[] { Source });
            renderWrap.SetUAV(texture, 0, 0);
            renderWrap.Dispatch("ConvertToCube.hlsl", null, width / 8, height / 8, 6);
            for (int i = 1; i < texture.mipLevels; i++)
            {
                int mipPow = 1 << i;
                renderWrap.SetSRVLim(texture, i - 1, 0);
                renderWrap.SetUAV(texture, i, 0);
                writer.Write(width / mipPow);
                writer.Write(height / mipPow);
                writer.Write(i - 1);
                writer.SetCBV(0);
                renderWrap.Dispatch("GenerateCubeMipMap.hlsl", null, width / mipPow / 8, height / mipPow / 8, 6);
            }
            return(true);
        }
예제 #2
0
        public void Execute(RenderWrap renderWrap)
        {
            var texInput  = renderWrap.GetRenderTexture2D(input);
            var texOutput = renderWrap.GetRenderTexture2D(output);
            int width     = texInput.width;
            int height    = texInput.height;

            renderWrap.SetRootSignature(rs);


            renderWrap.SetSRV(texInput, 0);
            renderWrap.SetUAV(texOutput, 0, 0);
            var writer = renderWrap.Writer;

            writer.Write(width);
            writer.Write(height);
            writer.SetCBV(0);
            renderWrap.Dispatch(shader, null, (width + 15) / 16, (height + 15) / 16);

            int x = width;
            int y = height;

            for (int i = 1; i < 9; i++)
            {
                x = (x + 1) / 2;
                y = (y + 1) / 2;

                writer.Write(x);
                writer.Write(y);
                writer.SetCBV(0);
                renderWrap.SetSRVLim(texOutput, i - 1, 0);
                renderWrap.SetUAV(texOutput, i, 0);
                renderWrap.Dispatch(shader, null, (x + 15) / 16, (y + 15) / 16);
            }
        }