/// <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_); } }
/// <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); } } }
/// <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); }
/// <summary> /// シェーダ切替 /// </summary> /// <param name="id"></param> public void ChangeShader(uint id) { shader_inst_ = ShaderManager.FindShader(id, shader_inst_.NeedVertexAttr); }
/// <summary> /// シェーダ切替 /// </summary> /// <param name="name"></param> public void SetShader(string name) { shader_inst_ = ShaderManager.FindShader(name, shader_inst_.NeedVertexAttr); }
/// <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); }
/// <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); }
/// <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); }); }