mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Examples: DirectX11: moved shader to be close to its usage location,
This commit is contained in:
		| @@ -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;\ |  | ||||||
| }"; |  | ||||||
|   | |||||||
| @@ -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" |         "#version 330\n" | ||||||
| 		"uniform mat4 ortho;\n" |         "uniform mat4 ortho;\n" | ||||||
| 		"in vec2 Position;\n" |         "in vec2 Position;\n" | ||||||
| 		"in vec2 UV;\n" |         "in vec2 UV;\n" | ||||||
| 		"in vec4 Colour;\n" |         "in vec4 Colour;\n" | ||||||
| 		"out vec2 Frag_UV;\n" |         "out vec2 Frag_UV;\n" | ||||||
| 		"out vec4 Frag_Colour;\n" |         "out vec4 Frag_Colour;\n" | ||||||
| 		"void main()\n" |         "void main()\n" | ||||||
| 		"{\n" |         "{\n" | ||||||
| 		"	Frag_UV = UV;\n" |         "	Frag_UV = UV;\n" | ||||||
| 		"	Frag_Colour = Colour;\n" |         "	Frag_Colour = Colour;\n" | ||||||
| 		"	gl_Position = ortho*vec4(Position.xy,0,1);\n" |         "	gl_Position = ortho*vec4(Position.xy,0,1);\n" | ||||||
| 		"}\n"; |         "}\n"; | ||||||
|  |  | ||||||
|     const GLchar* fragment_shader = |     const GLchar* fragment_shader = | ||||||
| 		"#version 330\n" |         "#version 330\n" | ||||||
| 		"uniform sampler2D Texture;\n" |         "uniform sampler2D Texture;\n" | ||||||
| 		"in vec2 Frag_UV;\n" |         "in vec2 Frag_UV;\n" | ||||||
| 		"in vec4 Frag_Colour;\n" |         "in vec4 Frag_Colour;\n" | ||||||
| 		"out vec4 FragColor;\n" |         "out vec4 FragColor;\n" | ||||||
| 		"void main()\n" |         "void main()\n" | ||||||
| 		"{\n" |         "{\n" | ||||||
| 		"	FragColor = Frag_Colour * texture( Texture, Frag_UV.st);\n" |         "	FragColor = Frag_Colour * texture( Texture, Frag_UV.st);\n" | ||||||
| 		"}\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 w, h; | ||||||
| 	int display_w, display_h; |     int display_w, display_h; | ||||||
| 	glfwGetWindowSize(window, &w, &h); |     glfwGetWindowSize(window, &w, &h); | ||||||
| 	glfwGetFramebufferSize(window, &display_w, &display_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.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; |     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.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[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.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_test_window = true; | ||||||
| 		static bool show_another_window = false; |         static bool show_another_window = false; | ||||||
|  |  | ||||||
| 		// 1. Show a simple 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" |         // Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug" | ||||||
| 		{ |         { | ||||||
| 			static float f; |             static float f; | ||||||
| 			ImGui::Text("Hello, world!"); |             ImGui::Text("Hello, world!"); | ||||||
| 			ImGui::SliderFloat("float", &f, 0.0f, 1.0f); |             ImGui::SliderFloat("float", &f, 0.0f, 1.0f); | ||||||
| 			show_test_window ^= ImGui::Button("Test Window"); |             show_test_window ^= ImGui::Button("Test Window"); | ||||||
| 			show_another_window ^= ImGui::Button("Another Window"); |             show_another_window ^= ImGui::Button("Another Window"); | ||||||
|  |  | ||||||
| 			// Calculate and show frame rate |             // Calculate and show frame rate | ||||||
| 			static float ms_per_frame[120] = { 0 }; |             static float ms_per_frame[120] = { 0 }; | ||||||
| 			static int ms_per_frame_idx = 0; |             static int ms_per_frame_idx = 0; | ||||||
| 			static float ms_per_frame_accum = 0.0f; |             static float ms_per_frame_accum = 0.0f; | ||||||
| 			ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx]; |             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[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f; | ||||||
| 			ms_per_frame_accum += ms_per_frame[ms_per_frame_idx]; |             ms_per_frame_accum += ms_per_frame[ms_per_frame_idx]; | ||||||
| 			ms_per_frame_idx = (ms_per_frame_idx + 1) % 120; |             ms_per_frame_idx = (ms_per_frame_idx + 1) % 120; | ||||||
| 			const float ms_per_frame_avg = ms_per_frame_accum / 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); |             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 |         // 2. Show another simple window, this time using an explicit Begin/End pair | ||||||
| 		if (show_another_window) |         if (show_another_window) | ||||||
| 		{ |         { | ||||||
| 			ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100)); |             ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100)); | ||||||
| 			ImGui::Text("Hello"); |             ImGui::Text("Hello"); | ||||||
| 			ImGui::End(); |             ImGui::End(); | ||||||
| 		} |         } | ||||||
|  |  | ||||||
| 		// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow() |         // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow() | ||||||
| 		if (show_test_window) |         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::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); |             ImGui::ShowTestWindow(&show_test_window); | ||||||
| 		} |         } | ||||||
|          |          | ||||||
| 		// Rendering |         // 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); | ||||||
|   | |||||||
| @@ -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; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user