синтаксическая ошибка: идентификатор «TEXTMETRICA» в D3DX10Core

Я только что начал изучать D3D, и мой код работал нормально, пока я не внедрил компилятор шейдеров D3D в свой код.

Я использую учебник по DirectXTutorials. если я просто скопирую и вставлю код оттуда в новый проект, программа скомпилируется нормально.

Однако я поместил свой код в разные классы, в отличие от учебника. Это дает мне ошибку, когда я пытаюсь скомпилировать свое высказывание: Синтаксическая ошибка: «TextMetrica» (компиляция Direct3DRenderer.cpp).

Вот файл Direct3DRenderer:

#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);

}

Ошибка идентификатора TEXTMETRICA на самом деле находится в файле D3DX10Core.h. я заглянул в определение, и этот файл, кажется, дает мне ошибку. определение этого идентификатора должно быть в файле gdi.

Я добавил пути включения и пути lib в SDK directx (июнь 2010 г.), а также попытался указать d3dx10.lib, d3dx11.lib, d3d11.lib в дополнительной зависимости проекта от всех параметров конфигурации. Я новичок, поэтому я не знаю, что я делаю неправильно. если требуется еще какой-либо код, прокомментируйте его.


person SupremeDeity    schedule 02.01.2020    source источник
comment
@AdrianMole - совершенно нормально использовать функции и структуры A в сборке Unicode. Просто TEXTMETRIC без явного квалификатора W или A приведет к тому, что либо TEXTMETRICW, либо TEXTMETRICA предполагается через typedef.   -  person selbie    schedule 02.01.2020
comment
Вероятным решением является то, что OP просто нужно #include <windows.h> перед всеми другими файлами заголовков. Не то же самое, что вещь "Window.h", указанная в верхней части текущего файла OP.   -  person selbie    schedule 02.01.2020
comment
@selbie в window.h включен windows.h.   -  person SupremeDeity    schedule 02.01.2020
comment
Если вы можете предоставить минимальный воспроизводимый пример, я могу решить это для вас.   -  person selbie    schedule 02.01.2020
comment
@selbie Действительно - моя ошибка (слишком много жаркого солнца).   -  person Adrian Mole    schedule 02.01.2020
comment
@selbie: Хорошо, поэтому я использовал модифицированную версию Windows с кучей определений для удаления бесполезных вещей, и это было связано с этим. Это файл, который я использовал Измененное окно от chilliengine. я позабочусь о том, чтобы не использовать этот импорт.   -  person SupremeDeity    schedule 02.01.2020


Ответы (1)


Имейте в виду, что большинство руководств по DirectX 11 в Интернете немного устарели. В частности, вам фактически не нужен устаревший DirectX SDK. См. эту запись в блоге, вот этот и этот.

Если вы используете VS 2015/2017/2019 и все еще хотите использовать устаревший DirectX SDK, вам необходимо настроить пути include/lib определенным образом, иначе у вас возникнут проблемы. Подробности на Документы Microsoft.

Вы можете использовать эти старые руководства с некоторыми оговорками, но вам также следует ознакомиться с Набор инструментов DirectX для более «современных» руководств.

ОБНОВЛЕНИЕ. Еще один вариант использования устаревших служебных библиотек D3DX9, D3DX10 и D3DX11 — использовать Microsoft.DXSDK.D3DX пакет NuGet. Это устраняет многие причуды, связанные с его смешиванием с современными наборами инструментов Windows SDK и Visual C++. Он также включает распространяемые двоичные файлы с простой параллельной лицензией вместо использования устаревшего DXSETUP. Тем не менее, сами двоичные файлы все еще довольно древние, содержат известные ошибки и больше не поддерживаются, поэтому YMMV. См. эту запись в блоге.

person Chuck Walbourn    schedule 02.01.2020
comment
Спасибо за это. У меня загружен DirectX Sdk от июня 2010 года, и он включает в себя все, что мне нужно. Я буду читать другие сообщения в блоге, если мне нужно. У меня есть библиотеки и прочее, все уже настроено, и сейчас я отрендерил треугольник, чтобы проверить, работает ли он. дайте мне документы для руководств, так как тот, который я использовал, требует премиум-членства, чтобы продолжить. Я обязательно воспользуюсь предоставленным вами руководством по набору инструментов DirectX. - person SupremeDeity; 08.01.2020