0

C++ と DirectX を使用して、次のコードで動作する三角形を描画しようとしています。

Renderer.h

#pragma once

#include "DirectX.h"
#include "Camera.h"
#include "OBJMesh.h"

class Renderer : public DirectX
{
public:
    Renderer(std::string windowTitle, int x, int y, unsigned int windowWidth, unsigned int windowHeight, bool fullscreen);
    ~Renderer();

    void Update();
    void Render();

protected:
    OBJMesh* modelMesh;
    Camera* camera;
    VERTEX vertices[3];
};

Renderer.cpp

#include "Renderer.h"

Renderer::Renderer(std::string windowTitle, int x, int y, unsigned int windowWidth, unsigned int windowHeight, bool fullscreen) : DirectX(windowTitle, x, y, windowWidth, windowHeight, fullscreen)
{
    //camera = new Camera(Vector3(0.0f, -100.0f, 5000.0f), 0.0f, 0.0f);
    camera = new Camera(0.0f, 0.0f, D3DXVECTOR3(0.0f, 0.0f, 10.0f));
    OBJMesh* modelMesh = new OBJMesh("../Models/Tank/destroyedTank.obj");

    VERTEX v1, v2, v3;

    v1.x = 0.0f;
    v1.y = -1.0f;
    v1.z = 0.5f;
    v1.color = D3DCOLOR_XRGB(0, 0, 255);

    v2.x = 1.0f;
    v2.y = 1.0f;
    v2.z = 0.5f;
    v2.color = D3DCOLOR_XRGB(0, 255, 0);

    v3.x = -1.0f;
    v3.y = 1.0f;
    v3.z = 0.5f;
    v3.color = D3DCOLOR_XRGB(255, 0, 0);

    vertices[0] = v1;
    vertices[1] = v2;
    vertices[2] = v3;

    device->CreateVertexBuffer(3 * sizeof(VERTEX), 0, VERTEXFORMAT, D3DPOOL_MANAGED, &vertexBuffer, NULL);

    VOID* lockingAd;

    vertexBuffer->Lock(0, 0, (void**)&lockingAd, 0);
    memcpy(lockingAd, vertices, sizeof(vertices));
    vertexBuffer->Unlock();

    device->SetRenderState(D3DRS_LIGHTING, FALSE); //turn off lighting - DirectX needs to know this :(
    device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); //turns off face culling (for now)
}

Renderer::~Renderer()
{
    delete camera;
}

void Renderer::Update()
{
    window->Update();

    float msec = Window::GetGameTimer()->GetFrameTime();

    camera->Update(msec);
}

void Renderer::Render()
{
    device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(40, 40, 40), 1.0f, 0);

    device->BeginScene(); //Must be used as it tells DirectX we're starting to draw stuff.

    D3DXMATRIX worldMat;
    D3DXMatrixTranslation(&worldMat, 0.0f, 0.0f, 0.0f);
    device->SetTransform(D3DTS_WORLD, &worldMat);

    device->SetTransform(D3DTS_VIEW, &camera->BuildViewMatrix());

    D3DXMATRIX projMatrix;
    D3DXMatrixPerspectiveFovLH( &projMatrix,
                                D3DXToRadian(45),
                                (float)width/(float)height,
                                1.0f,
                                10000.0f);
    device->SetTransform(D3DTS_PROJECTION, &projMatrix);

    device->SetFVF(VERTEXFORMAT);
    device->SetStreamSource(0, vertexBuffer, 0, sizeof(VERTEX));
    device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

    device->EndScene(); //Thank you for waiting, I have finished drawing stuff on the screen, please handle the rest Mr DirectX.

    device->Present(NULL, NULL, NULL, NULL);
}

しかし、VERTEX* verticesヘッダー ファイルとvertices = new VERTEX[3]cpp ファイルで vertices 配列を に変更すると、何も描画されません...なぜですか? どうすればこれを修正できますか?

4

1 に答える 1

1

これがあなたの問題かどうかはわかりませんが、これは問題のある行のようです:

memcpy( lockingAd, vertices, sizeof(vertices) );

ここで、verticesタイプがVERTEX[3]andの場合、これは異なることを行いVERTEX*ます。最初のケースではsizeof、 は配列のサイズを返しますが、2 番目のケースでは単にマシン上のポインターのサイズを返します。これを修正するには (固定数の要素がある場合3)、それをに変更する必要があります。続く:

memcpy( lockingAd, vertices, sizeof(VERTEX) * 3 );
于 2013-06-13T20:16:19.683 に答える