having troubles with the following line
HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB));
it appears the CreateBuffer method is having troubles reading &mVB. mVB is defined in box.h and looks like this
ID3D10Buffer* mVB;
Below is the code it its entirety. this is all files that mVB is in.
//Box.cpp
#include "Box.h"
#include "Vertex.h"
#include <vector>
Box::Box()
: mNumVertices(0), mNumFaces(0), md3dDevice(0), mVB(0), mIB(0)
{
}
Box::~Box()
{
ReleaseCOM(mVB);
ReleaseCOM(mIB);
}
float Box::getHeight(float x, float z)const
{
return 0.3f*(z*sinf(0.1f*x) + x*cosf(0.1f*z));
}
void Box::init(ID3D10Device* device, float m, float n, float dx)
{
md3dDevice = device;
mNumVertices = m*n;
mNumFaces = 12;
float halfWidth = (n-1)*dx*0.5f;
float halfDepth = (m-1)*dx*0.5f;
std::vector<Vertex> vertices(mNumVertices);
for(DWORD i = 0; i < m; ++i)
{
float z = halfDepth - (i * dx);
for(DWORD j = 0; j < n; ++j)
{
float x = -halfWidth + (j* dx);
float y = getHeight(x,z);
vertices[i*n+j].pos = D3DXVECTOR3(x, y, z);
if(y < -10.0f)
vertices[i*n+j].color = BEACH_SAND;
else if( y < 5.0f)
vertices[i*n+j].color = LIGHT_YELLOW_GREEN;
else if (y < 12.0f)
vertices[i*n+j].color = DARK_YELLOW_GREEN;
else if (y < 20.0f)
vertices[i*n+j].color = DARKBROWN;
else
vertices[i*n+j].color = WHITE;
}
}
D3D10_BUFFER_DESC vbd;
vbd.Usage = D3D10_USAGE_IMMUTABLE;
vbd.ByteWidth = sizeof(Vertex) * mNumVertices;
vbd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA vinitData;
vinitData.pSysMem = &vertices;
HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB));
//create the index buffer
std::vector<DWORD> indices(mNumFaces*3); // 3 indices per face
int k = 0;
for(DWORD i = 0; i < m-1; ++i)
{
for(DWORD j = 0; j < n-1; ++j)
{
indices[k] = i*n+j;
indices[k+1] = i*n+j+1;
indices[k+2] = (i*1)*n+j;
indices[k+3] = (i*1)*n+j;
indices[k+4] 开发者_StackOverflow中文版 = i*n+j+1;
indices[k+5] = (i*1)*n+j+1;
k+= 6;
}
}
D3D10_BUFFER_DESC ibd;
ibd.Usage = D3D10_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(DWORD) * mNumFaces*3;
ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = &indices;
HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mIB));
}
void Box::Draw()
{
UINT stride = sizeof(Vertex);
UINT offset = 0;
md3dDevice->IASetVertexBuffers(0, 1, &mVB, &stride, &offset);
md3dDevice->IASetIndexBuffer(mIB, DXGI_FORMAT_R32_UINT, 0);
md3dDevice->DrawIndexed(mNumFaces*3, 0 , 0);
}
//Box.h
#ifndef _BOX_H
#define _BOX_H
#include "d3dUtil.h"
Box.h
class Box {
public:
Box();
~Box();
void init(ID3D10Device* device, float m, float n, float dx);
void Draw();
float getHeight(float x, float z)const;
private:
DWORD mNumVertices;
DWORD mNumFaces;
ID3D10Device* md3dDevice;
ID3D10Buffer* mVB;
ID3D10Buffer* mIB;
};
#endif
[EDIT] Arguements being passed for m and n dx is
m = 129, n = 129, dx = 1.0f (they are all floats)
m and n stand for rows and columns perspectively. dx is the width and height.
Thanks again for the help
If you want a pointer to the data array of a vector, you should use &vec[0]
. If you use &vec
it will give you a pointer to the vector object, which might contain all kinds management structures/... that have nothing to do with the data you inserted into the vector.
The data itself is stored at continuous memory starting at &vec[0]
, so use that when you initialize your D3D structures.
精彩评论