Quellcode durchsuchen

Examples: DirectX11: moved shader to be close to its usage location,

omar vor 10 Jahren
Ursprung
Commit
2e5b81627f
3 geänderte Dateien mit 122 neuen und 125 gelöschten Zeilen
  1. 44 47
      examples/directx11_example/main.cpp
  2. 76 76
      examples/opengl3_example/main.cpp
  3. 2 2
      examples/opengl_example/main.cpp

+ 44 - 47
examples/directx11_example/main.cpp

@@ -13,9 +13,6 @@
 
 
 #pragma warning (disable: 4996)     // 'This function or variable may be unsafe': strdup
 #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 HWND                     hWnd;
 static ID3D11Device*            g_pd3dDevice = NULL;
 static ID3D11Device*            g_pd3dDevice = NULL;
 static ID3D11DeviceContext*     g_pd3dDeviceImmediateContext = NULL;
 static ID3D11DeviceContext*     g_pd3dDeviceImmediateContext = NULL;
@@ -222,6 +219,34 @@ HRESULT InitDeviceD3D(HWND hWnd)
 
 
     // Create the vertex shader
     // 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);
         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!
         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;
             return E_FAIL;
@@ -252,6 +277,22 @@ HRESULT InitDeviceD3D(HWND hWnd)
 
 
     // Create the pixel shader
     // 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);
         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!
         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;
             return E_FAIL;
@@ -563,47 +604,3 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
 
 
     return 0;
     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;\
-}";

+ 76 - 76
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);
     glUniform1i(texture_location, 0);
     glUniformMatrix4fv(ortho_location, 1, GL_FALSE, &ortho_projection[0][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;
     size_t total_vtx_count = 0;
     for (int n = 0; n < cmd_lists_count; n++)
     for (int n = 0; n < cmd_lists_count; n++)
         total_vtx_count += cmd_lists[n]->vtx_buffer.size();
         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);
         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);
     unsigned char* buffer_data = (unsigned char*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
     if (!buffer_data)
     if (!buffer_data)
         return;
         return;
@@ -101,7 +101,7 @@ static void ImImpl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_c
         cmd_offset = vtx_offset;
         cmd_offset = vtx_offset;
     }
     }
 
 
-	// Restore modified state
+    // Restore modified state
     glBindVertexArray(0);
     glBindVertexArray(0);
     glUseProgram(0);
     glUseProgram(0);
     glDisable(GL_SCISSOR_TEST);
     glDisable(GL_SCISSOR_TEST);
@@ -179,30 +179,30 @@ void InitGL()
         fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
         fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
 
 
     const GLchar *vertex_shader =
     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 =
     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();
     shader_handle = glCreateProgram();
     vert_handle = glCreateShader(GL_VERTEX_SHADER);
     vert_handle = glCreateShader(GL_VERTEX_SHADER);
@@ -241,12 +241,12 @@ void InitGL()
 
 
 void InitImGui()
 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();
     ImGuiIO& io = ImGui::GetIO();
     io.DisplaySize = ImVec2((float)display_w, (float)display_h);  // Display size, in pixels. For clamping windows positions.
     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())
     // (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())
     double mouse_x, mouse_y;
     double mouse_x, mouse_y;
     glfwGetCursorPos(window, &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
     // Start the frame
     ImGui::NewFrame();
     ImGui::NewFrame();
@@ -323,46 +323,46 @@ int main(int argc, char** argv)
         glfwPollEvents();
         glfwPollEvents();
         UpdateImGui();
         UpdateImGui();
 
 
-		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");
-
-			// 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();
-		}
-
-		// 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
+        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");
+
+            // 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();
+        }
+
+        // 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);
         glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
         glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
         glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
         glClear(GL_COLOR_BUFFER_BIT);
         glClear(GL_COLOR_BUFFER_BIT);
@@ -370,7 +370,7 @@ int main(int argc, char** argv)
         glfwSwapBuffers(window);
         glfwSwapBuffers(window);
     }
     }
 
 
-	// Cleanup
+    // Cleanup
     if (vao_handle) glDeleteVertexArrays(1, &vao_handle);
     if (vao_handle) glDeleteVertexArrays(1, &vao_handle);
     if (vbo_handle) glDeleteBuffers(1, &vbo_handle);
     if (vbo_handle) glDeleteBuffers(1, &vbo_handle);
     glDetachShader(shader_handle, vert_handle);
     glDetachShader(shader_handle, vert_handle);
@@ -383,4 +383,4 @@ int main(int argc, char** argv)
     glfwTerminate();
     glfwTerminate();
 
 
     return 0;
     return 0;
-}
+}

+ 2 - 2
examples/opengl_example/main.cpp

@@ -305,9 +305,9 @@ int main(int argc, char** argv)
         glfwSwapBuffers(window);
         glfwSwapBuffers(window);
     }
     }
 
 
-	// Cleanup
+    // Cleanup
     ImGui::Shutdown();
     ImGui::Shutdown();
     glfwTerminate();
     glfwTerminate();
 
 
-	return 0;
+    return 0;
 }
 }