前言:在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);
}