Beispiel #1
0
        /// <summary>
        /// 描画
        /// </summary>
        public void Draw(GraphicsContext context, int count = 1)
        {
            // 頂点バッファバインド
            context.SetVertexBuffer(0, vertexBuffer_);

            // マテリアル
            material_.Setup(context);
            ShaderManager.SetUniformParams(ref worldMatrix_);

            // 描画
            if (count > 1)
            {
                context.DrawInstanced(0, vertexNum_, 0, count);
            }
            else
            {
                context.Draw(0, vertexNum_);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 描画
        /// </summary>
        public void Draw(GraphicsContext context)
        {
            context.SetVertexBuffer(0, vertexBuffer_);
            context.SetIndexBuffer(indexBuffer_);

            for (int i = 0; i < nodes_.Length; i++)
            {
                if (nodes_[i].Subsets == null)
                {
                    continue;
                }
                foreach (var s in nodes_[i].Subsets)
                {
                    materials_[s.materialIndex].Setup(context);
                    ShaderManager.SetUniformParams(ref worldMatrix_);

                    context.DrawIndexed(s.startIndex, s.endIndex - s.startIndex);
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// GPUにセットアップをかける
        /// </summary>
        public void Setup(GraphicsContext context)
        {
            // シェーダ
            ShaderManager.BindShader(context, shader_inst_);

            // マテリアルパラメータ
            ShaderManager.SetMaterialParam(this);

            // テクスチャ
            for (int i = 0; i < psShaderViews_.Length; i++)
            {
                if (psShaderViews_[i] == null)
                {
                    break;
                }
                context.SetShaderResourcePS(i, psShaderViews_[i]);
                Texture tex = psShaderViews_[i] as Texture;
                if (tex != null)
                {
                    GraphicsCore.SetSamplerStatePS(i, tex.AddressingModeU, tex.AddressingModeV);
                }
            }
            for (int i = 0; i < vsShaderViews_.Length; i++)
            {
                if (vsShaderViews_[i] == null)
                {
                    break;
                }
                context.SetShaderResourceVS(i, vsShaderViews_[i]);
                Texture tex = vsShaderViews_[i] as Texture;
                if (tex != null)
                {
                    GraphicsCore.SetSamplerStateVS(i, tex.AddressingModeU, tex.AddressingModeV);
                }
            }

            // レンダーステート
            GraphicsCore.SetDepthState(DepthState);
            GraphicsCore.SetBlendState(BlendState);
        }
Beispiel #4
0
 /// <summary>
 /// シェーダ切替
 /// </summary>
 /// <param name="id"></param>
 public void ChangeShader(uint id)
 {
     shader_inst_ = ShaderManager.FindShader(id, shader_inst_.NeedVertexAttr);
 }
Beispiel #5
0
 /// <summary>
 /// シェーダ切替
 /// </summary>
 /// <param name="name"></param>
 public void SetShader(string name)
 {
     shader_inst_ = ShaderManager.FindShader(name, shader_inst_.NeedVertexAttr);
 }
Beispiel #6
0
 /// <summary>
 /// IDからシェーダセット
 /// </summary>
 /// <param name="id"></param>
 /// <param name="vertex_attr"></param>
 public void SetShader(uint id, uint vertex_attr)
 {
     shader_inst_ = ShaderManager.FindShader(id, vertex_attr);
 }
Beispiel #7
0
 /// <summary>
 /// 名前からシェーダセット
 /// </summary>
 /// <param name="name"></param>
 /// <param name="vertex_attr"></param>
 public void SetShader(string name, uint vertex_attr)
 {
     shader_inst_ = ShaderManager.FindShader(name, vertex_attr);
 }
Beispiel #8
0
        /// <summary>
        ///
        /// </summary>
        public ToneMap()
        {
            // サイズによってテクスチャを作り替える、ということをしたくないので
            // FullHD想定でテクスチャを作成しておく
            int w = 1920;
            int h = 1080;

            avgBuffer_ = new Texture[6];
            var desc = new Texture.InitDesc()
            {
                bindFlag = TextureBuffer.BindFlag.IsRenderTarget,
                width    = w / 4,
                height   = h / 4,
                format   = SlimDX.DXGI.Format.R16_Float,
            };

            avgBuffer_[0] = new Texture(desc);
            desc.width    = w / 16;
            desc.height   = h / 16;
            avgBuffer_[1] = new Texture(desc);
            desc.width    = w / 32;
            desc.height   = h / 32;
            avgBuffer_[2] = new Texture(desc);
            desc.width    = w / 64;
            desc.height   = h / 64;
            avgBuffer_[3] = new Texture(desc);
            desc.width    = w / 128;
            desc.height   = h / 128;
            avgBuffer_[4] = new Texture(desc);
            desc.width    = w / 256;
            desc.height   = h / 256;
            avgBuffer_[5] = new Texture(desc);
            frameBuffer_  = new GraphicsCore.FrameBuffer()
            {
                color_buffer_  = new Texture[1],
                depth_stencil_ = null,
            };

            var uavDesc_ = new Texture.InitDesc {
                bindFlag = TextureBuffer.BindFlag.IsUnorderedAccess | TextureBuffer.BindFlag.IsRenderTarget,
                width    = 1,
                height   = 1,
                format   = SlimDX.DXGI.Format.R32_Float,                // RWとして使うためには32bitにする必要がある
            };

            luminanceAvg_ = new Texture(uavDesc_);

            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("Downsample4x4CalcLuminance", (uint)Shader.VertexAttr.TEXCOORD0);
            prim_.AddRect(ref rect);
            prim_.GetMaterial().DepthState = RenderState.DepthState.None;

            downSample4Lum_ = ShaderManager.FindShader("Downsample4x4CalcLuminance", (uint)Shader.VertexAttr.TEXCOORD0);
            downSample4_    = ShaderManager.FindShader("Downsample4x4Luminance", (uint)Shader.VertexAttr.TEXCOORD0);
            downSample2_    = ShaderManager.FindShader("Downsample2x2Luminance", (uint)Shader.VertexAttr.TEXCOORD0);
            toneMap_        = ShaderManager.FindShader("ToneMap", (uint)Shader.VertexAttr.TEXCOORD0);
            resolveGamma_   = ShaderManager.FindShader("ResolveGamma", (uint)Shader.VertexAttr.TEXCOORD0);

            ComputeShader.InitDesc shaderDesc = new ComputeShader.InitDesc {
                file_name    = "asset/shader/ToneMap.fx",
                id           = 0,
                is_byte_code = false,
                main         = "FinalCalculateAverageLuminance",
            };
            lumResolveShader_ = new ComputeShader(shaderDesc);
            lumResolveShader_.SetUAVs(new Texture[] { luminanceAvg_ });
            lumResolveShader_.SetResources(new Texture[] { avgBuffer_[5] });
            initBuffer_ = false;

            KeyValue = 0.2f;
            Shader.SetConstantBufferUpdateFunc("CB_ToneMap", (s, i) => {
                dynamic cb = i;
                if (cb.g_keyValue != KeyValue)
                {
                    cb.g_keyValue = KeyValue;
                    return(true);
                }
                return(false);
            });
        }