From 2e5b81627f3de9791d483240d3f8bc1599afc7bb Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 3 Dec 2014 18:46:13 +0000 Subject: [PATCH] Examples: DirectX11: moved shader to be close to its usage location, --- examples/directx11_example/main.cpp | 91 +++++++++--------- examples/opengl3_example/main.cpp | 144 ++++++++++++++-------------- examples/opengl_example/main.cpp | 4 +- 3 files changed, 118 insertions(+), 121 deletions(-) diff --git a/examples/directx11_example/main.cpp b/examples/directx11_example/main.cpp index 95b02920..c6ec87f8 100644 --- a/examples/directx11_example/main.cpp +++ b/examples/directx11_example/main.cpp @@ -13,9 +13,6 @@ #pragma warning (disable: 4996) // 'This function or variable may be unsafe': strdup -extern const char* vertexShader; // Implemented at the bottom -extern const char* pixelShader; - static HWND hWnd; static ID3D11Device* g_pd3dDevice = NULL; static ID3D11DeviceContext* g_pd3dDeviceImmediateContext = NULL; @@ -222,6 +219,34 @@ HRESULT InitDeviceD3D(HWND hWnd) // Create the vertex shader { + static const char* vertexShader = + "cbuffer vertexBuffer : register(c0) \ + {\ + float4x4 ProjectionMatrix; \ + };\ + struct VS_INPUT\ + {\ + float2 pos : POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + PS_INPUT main(VS_INPUT input)\ + {\ + PS_INPUT output;\ + output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\ + output.col = input.col;\ + output.uv = input.uv;\ + return output;\ + }"; + D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_5_0", 0, 0, &g_pVertexShaderBlob, NULL); if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! return E_FAIL; @@ -252,6 +277,22 @@ HRESULT InitDeviceD3D(HWND hWnd) // Create the pixel shader { + static const char* pixelShader = + "struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + sampler sampler0;\ + Texture2D texture0;\ + \ + float4 main(PS_INPUT input) : SV_Target\ + {\ + float4 out_col = texture0.Sample(sampler0, input.uv);\ + return input.col * out_col;\ + }"; + D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_5_0", 0, 0, &g_pPixelShaderBlob, NULL); if (g_pPixelShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! return E_FAIL; @@ -563,47 +604,3 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int) return 0; } - -static const char* vertexShader = "\ -cbuffer vertexBuffer : register(c0) \ -{\ - float4x4 ProjectionMatrix; \ -};\ -struct VS_INPUT\ -{\ - float2 pos : POSITION;\ - float4 col : COLOR0;\ - float2 uv : TEXCOORD0;\ -};\ -\ -struct PS_INPUT\ -{\ - float4 pos : SV_POSITION;\ - float4 col : COLOR0;\ - float2 uv : TEXCOORD0;\ -};\ -\ -PS_INPUT main(VS_INPUT input)\ -{\ - PS_INPUT output;\ - output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\ - output.col = input.col;\ - output.uv = input.uv;\ - return output;\ -}"; - -static const char* pixelShader = "\ -struct PS_INPUT\ -{\ - float4 pos : SV_POSITION;\ - float4 col : COLOR0;\ - float2 uv : TEXCOORD0;\ -};\ -sampler sampler0;\ -Texture2D texture0;\ -\ -float4 main(PS_INPUT input) : SV_Target\ -{\ - float4 out_col = texture0.Sample(sampler0, input.uv);\ - return input.col * out_col;\ -}"; diff --git a/examples/opengl3_example/main.cpp b/examples/opengl3_example/main.cpp index 21e959ac..d1adae7b 100644 --- a/examples/opengl3_example/main.cpp +++ b/examples/opengl3_example/main.cpp @@ -60,7 +60,7 @@ static void ImImpl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_c glUniform1i(texture_location, 0); glUniformMatrix4fv(ortho_location, 1, GL_FALSE, &ortho_projection[0][0]); - // Grow our buffer according to what we need + // Grow our buffer according to what we need size_t total_vtx_count = 0; for (int n = 0; n < cmd_lists_count; n++) total_vtx_count += cmd_lists[n]->vtx_buffer.size(); @@ -72,7 +72,7 @@ static void ImImpl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_c glBufferData(GL_ARRAY_BUFFER, neededBufferSize, NULL, GL_STREAM_DRAW); } - // Copy and convert all vertices into a single contiguous buffer + // Copy and convert all vertices into a single contiguous buffer unsigned char* buffer_data = (unsigned char*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); if (!buffer_data) return; @@ -101,7 +101,7 @@ static void ImImpl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_c cmd_offset = vtx_offset; } - // Restore modified state + // Restore modified state glBindVertexArray(0); glUseProgram(0); glDisable(GL_SCISSOR_TEST); @@ -179,30 +179,30 @@ void InitGL() fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); const GLchar *vertex_shader = - "#version 330\n" - "uniform mat4 ortho;\n" - "in vec2 Position;\n" - "in vec2 UV;\n" - "in vec4 Colour;\n" - "out vec2 Frag_UV;\n" - "out vec4 Frag_Colour;\n" - "void main()\n" - "{\n" - " Frag_UV = UV;\n" - " Frag_Colour = Colour;\n" - " gl_Position = ortho*vec4(Position.xy,0,1);\n" - "}\n"; + "#version 330\n" + "uniform mat4 ortho;\n" + "in vec2 Position;\n" + "in vec2 UV;\n" + "in vec4 Colour;\n" + "out vec2 Frag_UV;\n" + "out vec4 Frag_Colour;\n" + "void main()\n" + "{\n" + " Frag_UV = UV;\n" + " Frag_Colour = Colour;\n" + " gl_Position = ortho*vec4(Position.xy,0,1);\n" + "}\n"; const GLchar* fragment_shader = - "#version 330\n" - "uniform sampler2D Texture;\n" - "in vec2 Frag_UV;\n" - "in vec4 Frag_Colour;\n" - "out vec4 FragColor;\n" - "void main()\n" - "{\n" - " FragColor = Frag_Colour * texture( Texture, Frag_UV.st);\n" - "}\n"; + "#version 330\n" + "uniform sampler2D Texture;\n" + "in vec2 Frag_UV;\n" + "in vec4 Frag_Colour;\n" + "out vec4 FragColor;\n" + "void main()\n" + "{\n" + " FragColor = Frag_Colour * texture( Texture, Frag_UV.st);\n" + "}\n"; shader_handle = glCreateProgram(); vert_handle = glCreateShader(GL_VERTEX_SHADER); @@ -241,12 +241,12 @@ void InitGL() void InitImGui() { - int w, h; - int display_w, display_h; - glfwGetWindowSize(window, &w, &h); - glfwGetFramebufferSize(window, &display_w, &display_h); - mousePosScale.x = (float)display_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates. - mousePosScale.y = (float)display_h / h; + int w, h; + int display_w, display_h; + glfwGetWindowSize(window, &w, &h); + glfwGetFramebufferSize(window, &display_w, &display_h); + mousePosScale.x = (float)display_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates. + mousePosScale.y = (float)display_h / h; ImGuiIO& io = ImGui::GetIO(); io.DisplaySize = ImVec2((float)display_w, (float)display_h); // Display size, in pixels. For clamping windows positions. @@ -302,9 +302,9 @@ void UpdateImGui() // (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents()) double mouse_x, mouse_y; glfwGetCursorPos(window, &mouse_x, &mouse_y); - io.MousePos = ImVec2((float)mouse_x * mousePosScale.x, (float)mouse_y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) - io.MouseDown[0] = mousePressed[0] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. - io.MouseDown[1] = mousePressed[1] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0; + io.MousePos = ImVec2((float)mouse_x * mousePosScale.x, (float)mouse_y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) + io.MouseDown[0] = mousePressed[0] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. + io.MouseDown[1] = mousePressed[1] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0; // Start the frame ImGui::NewFrame(); @@ -323,46 +323,46 @@ int main(int argc, char** argv) glfwPollEvents(); UpdateImGui(); - static bool show_test_window = true; - static bool show_another_window = false; + static bool show_test_window = true; + static bool show_another_window = false; - // 1. Show a simple window - // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug" - { - static float f; - ImGui::Text("Hello, world!"); - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); - show_test_window ^= ImGui::Button("Test Window"); - show_another_window ^= ImGui::Button("Another Window"); + // 1. Show a simple window + // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug" + { + static float f; + ImGui::Text("Hello, world!"); + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); + show_test_window ^= ImGui::Button("Test Window"); + show_another_window ^= ImGui::Button("Another Window"); - // Calculate and show frame rate - static float ms_per_frame[120] = { 0 }; - static int ms_per_frame_idx = 0; - static float ms_per_frame_accum = 0.0f; - ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx]; - ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f; - ms_per_frame_accum += ms_per_frame[ms_per_frame_idx]; - ms_per_frame_idx = (ms_per_frame_idx + 1) % 120; - const float ms_per_frame_avg = ms_per_frame_accum / 120; - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg); - } + // Calculate and show frame rate + static float ms_per_frame[120] = { 0 }; + static int ms_per_frame_idx = 0; + static float ms_per_frame_accum = 0.0f; + ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx]; + ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f; + ms_per_frame_accum += ms_per_frame[ms_per_frame_idx]; + ms_per_frame_idx = (ms_per_frame_idx + 1) % 120; + const float ms_per_frame_avg = ms_per_frame_accum / 120; + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg); + } - // 2. Show another simple window, this time using an explicit Begin/End pair - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100)); - ImGui::Text("Hello"); - ImGui::End(); - } + // 2. Show another simple window, this time using an explicit Begin/End pair + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100)); + ImGui::Text("Hello"); + ImGui::End(); + } - // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow() - if (show_test_window) - { - ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call this, because positions are saved in .ini file. Here we just want to make the demo initial state a bit more friendly! - ImGui::ShowTestWindow(&show_test_window); - } - - // Rendering + // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow() + if (show_test_window) + { + ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call this, because positions are saved in .ini file. Here we just want to make the demo initial state a bit more friendly! + ImGui::ShowTestWindow(&show_test_window); + } + + // Rendering glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); glClearColor(0.8f, 0.6f, 0.6f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); @@ -370,7 +370,7 @@ int main(int argc, char** argv) glfwSwapBuffers(window); } - // Cleanup + // Cleanup if (vao_handle) glDeleteVertexArrays(1, &vao_handle); if (vbo_handle) glDeleteBuffers(1, &vbo_handle); glDetachShader(shader_handle, vert_handle); @@ -383,4 +383,4 @@ int main(int argc, char** argv) glfwTerminate(); return 0; -} \ No newline at end of file +} diff --git a/examples/opengl_example/main.cpp b/examples/opengl_example/main.cpp index 6247f893..db116123 100644 --- a/examples/opengl_example/main.cpp +++ b/examples/opengl_example/main.cpp @@ -305,9 +305,9 @@ int main(int argc, char** argv) glfwSwapBuffers(window); } - // Cleanup + // Cleanup ImGui::Shutdown(); glfwTerminate(); - return 0; + return 0; }