syntax error: identifier 'TEXTMETRICA' in D3DX10Core

136 views Asked by At

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.

1

There are 1 answers

1
Chuck Walbourn On

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.