0

I Have Just Started Learning D3D and my code was working all fine till i implemented the D3D Shader Compiler Stuff to my code.

I am Using the tutorial on DirectXTutorials. if i just copy paste the code from there on to a new project, the program compiles fine.

However i have put my code in different classes unlike the tutorial. It is giving me error when i try to compile my saying: Syntax Error: "TextMetrica" (Compiling Direct3DRenderer.cpp).

Here is the Direct3DRenderer File:

#include "Window.h"
#include "Direct3DRenderer.h"
#include "Vertex.h"

Renderer::Renderer(HWND hw)
{
    OutputDebugString("Direct3D Initializing\n");

    DXGI_SWAP_CHAIN_DESC scd;
    ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));         // ZERO OUT SCD
    scd.BufferCount = 1;                                    // HOW MANY BACKBUFFERS WE WANT
    scd.OutputWindow = hw;                                  // HANDLE TO THE OUTPUT WINDOW
    scd.Windowed = true;                                    // SHOULD WINDOW BE IN WINDOWED MODE BY DEFAULT
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // BUFFER FORMAT
    scd.BufferDesc.Width =  800;                            // BUFFER WIDTH
    scd.BufferDesc.Height = 600;                            // BUFFER HEIGHT
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      // USE SWAP CHAIN AS OUTPUT TARGET
    scd.SampleDesc.Count = 4;                               // MSAA COUNT
    scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;     // FLAGS

    if (D3D11CreateDeviceAndSwapChain(
        NULL,
        D3D_DRIVER_TYPE_HARDWARE,
        NULL,
        NULL,
        NULL,
        NULL,
        D3D11_SDK_VERSION,
        &scd,
        &swapchain,
        &dev,
        NULL,
        &context
    ) == SEVERITY_SUCCESS)
    {
        OutputDebugString("SUCCESS\n");
        // Get The Address of BackBuffer
        ID3D11Texture2D* pbuffer;
        swapchain->GetBuffer(0, _uuidof(ID3D11Texture2D), (LPVOID*)& pbuffer);

        // Create a Render Target COM Object from the buffer
        dev->CreateRenderTargetView(pbuffer, NULL, &RenderTarget);
        pbuffer->Release();

        // Set Our RenderTarget as the back buffer
        context->OMSetRenderTargets(1, &RenderTarget, NULL);

        // Create Our Viewport
        viewport.Height = 800;
        viewport.Width = 600;
        viewport.TopLeftX = 0;
        viewport.TopLeftY = 0;

        context->RSSetViewports(1, &viewport);

        InitPipeline();
        InitGraphics();

    }
    else
    {
        OutputDebugString("ERROR\n");
    }
}
Renderer::~Renderer()
{
    OutputDebugString("Direct3D Cleanup Phase Started.\n");

    swapchain->SetFullscreenState(FALSE, NULL);
    swapchain->Release();
    context->Release();
    RenderTarget->Release();
    VS->Release();
    PS->Release();
    dev->Release();

    OutputDebugString("Direct3D Cleanup Phase Completed.\n");
}

void Renderer::InitPipeline()
{
    // Compile Shaders from file
    D3DX11CompileFromFile("shaders.shader", 0, 0, "VShader", "vs_4_0", 0, 0, 0, &compiled_vs, 0, 0);
    D3DX11CompileFromFile("shaders.shader", 0, 0, "PShader", "ps_4_0", 0, 0, 0, &compiled_ps, 0, 0);

    // Convert Compiled Shaders to COM Shader Objects
    dev->CreateVertexShader(compiled_vs->GetBufferPointer(), compiled_vs->GetBufferSize(), NULL, &VS);
    dev->CreatePixelShader(compiled_ps->GetBufferPointer(), compiled_ps->GetBufferSize(), NULL, &PS);

    // Sets the shaders to the device / Activates the shader
    context->VSSetShader(VS, 0, 0);
    context->PSSetShader(PS, 0, 0);

    // Create the Input Layout
    D3D11_INPUT_ELEMENT_DESC VertexElementDesc[] = {
        {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
        {"COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}
    };

    dev->CreateInputLayout(VertexElementDesc, 2, compiled_vs->GetBufferPointer(), compiled_vs->GetBufferSize(), &InputLayout);
    context->IASetInputLayout(InputLayout);
}

void Renderer::InitGraphics() {
    // Create Buffer so we can duplicate data from system memory to graphics memory
    ZeroMemory(&VBufferDesc, sizeof(VBufferDesc));

    VBufferDesc.ByteWidth = sizeof(Vertex) * 3;
    VBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
    VBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    VBufferDesc.Usage = D3D11_USAGE_DYNAMIC;

    dev->CreateBuffer(&VBufferDesc, NULL, &VBuffer);

    Vertex OurVertices[] =
    {
        {0.0f, 0.5f, 0.0f,      D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
        {0.45f, -0.5, 0.0f,     D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)},
        {-0.45f, -0.5f, 0.0f,   D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f)}
    };

    // we need to map to avoid issues
    D3D11_MAPPED_SUBRESOURCE mapRes;

    context->Map(VBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mapRes);
    memcpy(mapRes.pData, OurVertices, sizeof(OurVertices));
    context->Unmap(VBuffer, NULL);
}

void Renderer::RenderFrame()
{
    context->ClearRenderTargetView(RenderTarget, D3DXCOLOR(0.2, 0.4, 0.6, 1.0));

    // We can do the rendering here

    UINT stride = sizeof(Vertex);
    UINT offset = 0;
    context->IASetVertexBuffers(0, 1, &VBuffer, &stride, &offset);
    context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    context->Draw(3, 0);

    // Swap Buffer
    swapchain->Present(0, 0);

}

The TEXTMETRICA Identifier error is actually in D3DX10Core.h. i have peeked in the definition and that file seems to be giving me the error. this identifier's definition should be in gdi file.

I have added the include paths and lib paths to the directx(June 2010) SDK and also tried specifying d3dx10.lib, d3dx11.lib, d3d11.lib in the project's addition dependency on the all configurations setting. I am new so i dont know what i am doing wrong. if any more code is required please comment about it.

  • @AdrianMole - it's perfectly OK to use the `A` functions and structs in a Unicode build. It's just that `TEXTMETRIC` without an explicit `W` or `A` qualifier will result in either TEXTMETRICW or TEXTMETRICA being assumed via typedef. – selbie Jan 02 '20 at 08:39
  • 1
    The likely solution is that the OP just needs to `#include ` before all other header files. Not the same as the `"Window.h"` thing referenced at the top of the OP's current file. – selbie Jan 02 '20 at 08:40
  • @selbie the window.h has the windows.h include in it. – SupremeDeity Jan 02 '20 at 08:43
  • If you can provide an [mcve], I can solve this for you. – selbie Jan 02 '20 at 08:43
  • @selbie Indeed - my mistake (too much hot sunshine). – Adrian Mole Jan 02 '20 at 08:44
  • @selbie :P ok so i was using a modified version of windows with tonnes of defines for removing useless stuff and that was messing with it. This is the file i was using [Modified window from chilliengine](https://github.com/planetchili/hw3d/blob/master/hw3d/ChiliWin.h). i will make sure not to use those imports. – SupremeDeity Jan 02 '20 at 08:49

1 Answers1

0

Keep in mind that most of the Internet tutorials for DirectX 11 are a bit outdated. In particular, you don't actually need the legacy DirectX SDK. See this blog post, this one, and this one.

If using VS 2015/2017/2019 and you still want to use the legacy DirectX SDK, then you have to set up the include/lib paths in a particular way or you'll get problems. The details on Microsoft Docs.

You are welcome to use these older tutorials with some caveats, but you should also take a look at DirectX Tool Kit for some more 'modern' tutorials.

UPDATE: One other option for using the legacy D3DX9, D3DX10, and D3DX11 utility libraries is to use the Microsoft.DXSDK.D3DX NuGet package. This removes many of the quirks around mixing it with the modern Windows SDK and Visual C++ toolsets. It also includes the redistributable binaries with a simple side-by-side license instead of having to use legacy DXSETUP. That said, the binaries themselves are still quite ancient, have known bugs, and are no longer supported, so YMMV. See this blog post.

Chuck Walbourn
  • 38,259
  • 2
  • 58
  • 81
  • Thanks for this. I have the DirectX Sdk june 2010 downloaded and it includes all that i should need. I will read the other blog posts if i need to. i have the libs and stuff all setup already and have rendered a triangle for now to check if it works. do give me docs for tutorials as the one that i was using requires a premium membership to continue forward. I ill definitely use the DirectX Tool Kit guide that you provided. – SupremeDeity Jan 08 '20 at 09:32