D3D画矩形

前言:在ID3D11RenderTargetView、ID3D11ShaderResourceView进行shader运算后,必须执行draw、drawIndex才能把数据存在ID3D11ShaderResourceView中

 

#pragma once
#include <d3d11.h>
#include <DirectXMath.h>
#include <wrl/client.h>

// 2个三角形

using namespace DirectX;
class StaticMeshClass
{
public:
    struct VertexType
    {
        XMFLOAT3 position;
        XMFLOAT4 color;
        XMFLOAT2 tex;
    };

public:
    StaticMeshClass();
    ~StaticMeshClass();

    void updateSlicesData(ID3D11DeviceContext *deviceContext);

    bool initVertexBuffer(ID3D11Device *device);
    void updateMeshVertices(ID3D11DeviceContext *deviceContext);

    void render(ID3D11DeviceContext *deviceContext);

private:
    int             m_TriangleMeshCount;
    VertexType*     m_MeshVertices;
    ID3D11Buffer*   m_MeshVertexBuffer;
};

 

#include "StaticMeshClass.h"
#include "DXTrace.h"

StaticMeshClass::StaticMeshClass()
{
    m_TriangleMeshCount = 2;
    m_MeshVertices = 0;
    m_MeshVertexBuffer = 0;
}

StaticMeshClass::~StaticMeshClass()
{
    if (m_MeshVertexBuffer)
    {
        m_MeshVertexBuffer->Release();
        m_MeshVertexBuffer = 0;
    }

    if (m_MeshVertices)
    {
        delete[] m_MeshVertices;
        m_MeshVertices = 0;
    }
}

void StaticMeshClass::updateSlicesData(ID3D11DeviceContext *deviceContext)
{
    if (!m_MeshVertices)
    {
        m_MeshVertices = new VertexType[m_TriangleMeshCount * 3];
    }

    /*
    *   a(-1, 1, 0)                        b(1,  1, 0)
    *   d(-1,-1, 0)                        c(1, -1, 0)
    */
    m_MeshVertices[0].position = XMFLOAT3(-1.0f, 1.0f, 1.0f);		    m_MeshVertices[0].tex = XMFLOAT2(0, 0); // a
    m_MeshVertices[1].position = XMFLOAT3( 1.0f, 1.0f, 1.0f);	        m_MeshVertices[1].tex = XMFLOAT2(1, 0); // b
    m_MeshVertices[2].position = XMFLOAT3( 1.0f, -1.0f, 1.0f);	        m_MeshVertices[2].tex = XMFLOAT2(1, 1); // c

    m_MeshVertices[3].position = XMFLOAT3(-1.0f, 1.0f, 1.0f);	        m_MeshVertices[3].tex = XMFLOAT2(0, 0); // a
    m_MeshVertices[4].position = XMFLOAT3( 1.0f, -1.0f, 1.0f);	        m_MeshVertices[4].tex = XMFLOAT2(1, 1); // b
    m_MeshVertices[5].position = XMFLOAT3(-1.0f, -1.0f, 1.0f);	        m_MeshVertices[5].tex = XMFLOAT2(0, 1); // d

    updateMeshVertices(deviceContext);
}

bool StaticMeshClass::initVertexBuffer(ID3D11Device *device)
{
    D3D11_BUFFER_DESC vertexBufferDesc;
    vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
    vertexBufferDesc.ByteWidth = sizeof(VertexType) * m_TriangleMeshCount * 3;
    vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    vertexBufferDesc.MiscFlags = 0;
    vertexBufferDesc.StructureByteStride = 0;

    HR(device->CreateBuffer(&vertexBufferDesc, NULL, &m_MeshVertexBuffer));

    return true;
}

void StaticMeshClass::updateMeshVertices(ID3D11DeviceContext *deviceContext)
{
    D3D11_MAPPED_SUBRESOURCE mapped;
    deviceContext->Map(m_MeshVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped);
    VertexType *verticesPtr = (VertexType*)mapped.pData;
    memcpy(verticesPtr, (void*)m_MeshVertices, (sizeof(VertexType) * m_TriangleMeshCount * 3));
    deviceContext->Unmap(m_MeshVertexBuffer, 0);
}

void StaticMeshClass::render(ID3D11DeviceContext *deviceContext)
{
    unsigned int stride;
    unsigned int offset;

    stride = sizeof(VertexType);
    offset = 0;

    //input assembler
    deviceContext->IASetVertexBuffers(0, 1, &m_MeshVertexBuffer, &stride, &offset);
    deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    deviceContext->Draw(m_TriangleMeshCount * 3, 0);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值