vertexBufferDesc.ByteWidth问题

问题描述 投票:0回答:1

问题是我试图使用位图纹理在屏幕上绘制的字符串,即使我在渲染循环中更新了字符串,它的长度也被其初始值所限制,... >>

我正在尝试使用位图纹理实现一个简单的字体渲染器,到目前为止,我已经成功地显示了位图纹理中的字形,我尝试使用不同长度的字符串进行初始化,但是问题仍然存在。

我怀疑是vertexBufferDesc.ByteWidth,当我使用map和unmap函数动态更新顶点缓冲区时,它没有得到更新以更正更新的字节长度...

bool GlyphClass::Initialize(ID3D11Device* device, HWND hwnd, int screenWidth, int screenHeight, WCHAR* path)
{
    bool result;
    m_GlyphWidthData.open("Font/AgencyFBFont_64x64_width.txt");
    while (1)
    {
        if (m_GlyphWidthData.eof())
        {
            break;
        }

        int tmp = 0;
        m_GlyphWidthData >> tmp;
        if (tmp != 0)
        {
            m_GlyphWidth.push_back(tmp);
        }
    }
    m_GlyphWidthData.close();

    m_GlyphCharacter = 'A';
    m_StringToDraw = "TEXTTEST@xyz";//

    m_fontTextureShader = new TextureShaderClass;
    if (!m_fontTextureShader)
    {
        return false;
    }

    result = m_fontTextureShader->Initialize(device, hwnd);
    if (!result)
    {
        MessageBox(hwnd, L"Could not initialize font texture shader object!", L"Error", MB_OK);
        return false;
    }

    m_ScreenWidth = screenWidth;
    m_ScreenHeight = screenHeight;

    result = InitializeBuffers(device);
    if (!result)
    {
        return false;
    }

    result = LoadTexture(device, path);
    if (!result)
    {
        return false;
    }



    return true;

}

bool GlyphClass::InitializeBuffers(ID3D11Device* device)
{
    VertexType* vertices;
    unsigned long* indices;
    D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc;
    D3D11_SUBRESOURCE_DATA vertexData, indexData;
    HRESULT result;
    int i;

    m_VertexCount = 6;

    m_IndexCount = m_VertexCount * m_MaxCharInLine;

    vertices = new VertexType[m_VertexCount];
    if (!vertices)
    {
        return false;
    }

    indices = new unsigned long[m_IndexCount];
    if (!indices)
    {
        return false;
    }

    memset(vertices, 0, sizeof(VertexType) * m_VertexCount);

    for (i = 0; i < m_IndexCount; i++)
    {
        indices[i] = i;
    }

    vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
    vertexBufferDesc.ByteWidth = sizeof(VertexType) * m_VertexCount * m_StringToDraw.length();
    vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    vertexBufferDesc.MiscFlags = 0;
    vertexBufferDesc.StructureByteStride = 0;

    vertexData.pSysMem = vertices;
    vertexData.SysMemPitch = 0;
    vertexData.SysMemSlicePitch = 0;

    result = device->CreateBuffer(&vertexBufferDesc, &vertexData, &m_VertexBuffer);
    if (FAILED(result))
    {
        return false;
    }

    indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    indexBufferDesc.ByteWidth = sizeof(unsigned long) * m_IndexCount;
    indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    indexBufferDesc.CPUAccessFlags = 0;
    indexBufferDesc.MiscFlags = 0;
    indexBufferDesc.StructureByteStride = 0;

    indexData.pSysMem = indices;
    indexData.SysMemPitch = 0;
    indexData.SysMemSlicePitch = 0;

    result = device->CreateBuffer(&indexBufferDesc, &indexData, &m_IndexBuffer);
    if (FAILED(result))
    {
        return false;
    }

    delete[] vertices;
    vertices = 0;

    delete[] indices;
    indices = 0;

    return true;


}




bool GlyphClass::UpdateBuffers(ID3D11DeviceContext* context, int posX, int posY)
{
    m_StringToDraw = userInputString != "" ? userInputString : "STRING 555@xyz0123456789";

    VertexType* vertices;
    D3D11_MAPPED_SUBRESOURCE mappedResource;
    VertexType* vertexPtr;
    HRESULT hr;

    vertices = new VertexType[m_VertexCount * m_StringToDraw.length()];
    if (!vertices)
    {
        return false;
    }

    // Initialize vertex array to zeros at first.
    memset(vertices, 0, sizeof(VertexType) * m_VertexCount * m_StringToDraw.length() );

    float posXOffset = (float)posX;
    float posYOffset = (float)posY;

    for ( int i = 0; i < m_StringToDraw.length(); i++ )
    {
        int cx = m_StringToDraw[i] % 16;
        int cy = m_StringToDraw[i] / 16;

        float tex_left = (float)cx * (1.f / 16.f);
        float tex_top = (float)cy * (1.f / 16.f);
        float tex_right = tex_left + (1.f / 16.f) * ((float)m_GlyphWidth[m_StringToDraw[i]] / 64.f);
        float tex_bottom = tex_top + (1.f / 16.f);

        int totalCharWidth = 64;

        float left = (float)((float)(m_ScreenWidth / 2.f) * -1) + posXOffset;
        float right = left + (float)m_GlyphWidth[m_StringToDraw[i]];
        float top = (float)(m_ScreenHeight / 2.f) - posYOffset;
        float bottom = top - (float)totalCharWidth;

        //triangle 1 - clockwise
        vertices[0 + m_VertexCount * i].position = Vector3(left, top, 0.f);
        vertices[0 + m_VertexCount * i].texture = Vector2(tex_left, tex_top);

        vertices[1 + m_VertexCount * i].position = Vector3(right, bottom, 0.f);
        vertices[1 + m_VertexCount * i].texture = Vector2(tex_right, tex_bottom);

        vertices[2 + m_VertexCount * i].position = Vector3(left, bottom, 0.f);
        vertices[2 + m_VertexCount * i].texture = Vector2(tex_left, tex_bottom);

        //triangle + i 2
        vertices[3 + m_VertexCount * i].position = Vector3(left, top, 0.f);
        vertices[3 + m_VertexCount * i].texture = Vector2(tex_left, tex_top);

        vertices[4 + m_VertexCount * i].position = Vector3(right, top, 0.f);
        vertices[4 + m_VertexCount * i].texture = Vector2(tex_right, tex_top);

        vertices[5 + m_VertexCount * i].position = Vector3(right, bottom, 0.f);
        vertices[5 + m_VertexCount * i].texture = Vector2(tex_right, tex_bottom);

        posXOffset += m_GlyphWidth[m_StringToDraw[i]];

    }


    hr = context->Map(m_VertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
    if (FAILED(hr))
    {
        return false;
    }

    vertexPtr = (VertexType*)mappedResource.pData;
    int bufferSize = sizeof(VertexType) * m_VertexCount * m_StringToDraw.length();
    memcpy(vertexPtr, (void*)vertices, bufferSize);

    D3D11_BUFFER_DESC tmpDesc;
    m_VertexBuffer->GetDesc(&tmpDesc);

    context->Unmap(m_VertexBuffer, 0);

    delete[] vertices;
    vertices = 0;

    return true;

}

字符串m_StringToDraw应该更改,并且顶点缓冲区应该绘制所有更新的字符串

问题是我尝试使用位图纹理在屏幕上绘制的字符串,即使我在渲染循环中更新了字符串,它的长度也被其初始化的上限所限制,... >

任何一个?....................................

c++ directx-11
1个回答
0
投票

任何一个?....................................

© www.soinside.com 2019 - 2024. All rights reserved.