Browse Source

fix POSITION format (ImDrawVert::pos is 2D, not 4D)

the inputlayout incorrectly described the POSITION attribute as being
4D, while ImDrawVert::pos is 2D. This went unnoticed because the buffer
binding has a stride of sizeof(ImDrawVert) and the POSITION is treated
as a float2 in the vertex shader. If you switch POSITION to float4 in
the vertex shader (and actually use the z/w in the matrix
multiplication) then everything become wacky-looking since it's
interpreting the texture coordinates as z/w. On a similar note: It's
weird that the projection matrix takes z and w into consideration when
those don't exist in the shader due to positions being float2s.
Nicolas Guillemot 10 years ago
parent
commit
509ac33abe
1 changed files with 3 additions and 3 deletions
  1. 3 3
      examples/directx11_example/imgui_impl_dx11.cpp

+ 3 - 3
examples/directx11_example/imgui_impl_dx11.cpp

@@ -328,9 +328,9 @@ bool    ImGui_ImplDX11_CreateDeviceObjects()
 
 
         // Create the input layout
         // Create the input layout
         D3D11_INPUT_ELEMENT_DESC localLayout[] = {
         D3D11_INPUT_ELEMENT_DESC localLayout[] = {
-            { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
-            { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,       0, (size_t)(&((ImDrawVert*)0)->uv),  D3D11_INPUT_PER_VERTEX_DATA, 0 },
-            { "COLOR",    0, DXGI_FORMAT_R8G8B8A8_UNORM,     0, (size_t)(&((ImDrawVert*)0)->col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
+            { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT,   0, (size_t)(&((ImDrawVert*)0)->pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
+            { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,   0, (size_t)(&((ImDrawVert*)0)->uv),  D3D11_INPUT_PER_VERTEX_DATA, 0 },
+            { "COLOR",    0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
         };
         };
 
 
         if (g_pd3dDevice->CreateInputLayout(localLayout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)
         if (g_pd3dDevice->CreateInputLayout(localLayout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)