DirectX应用程序不会绘制

亿万

我已经设置了DirectX引擎,并且一切似乎都很好,但是它不会向我显示它需要绘制的对象,而且我也找不到问题所在。我已经使用我的教程引擎搜索了代码,但仍然无法正常工作。谁能在我的代码中看到问题?感谢您的帮助。ps。不用担心头文件全部起作用,只有此文件不起作用。

#include "AppFramework.h"

struct Vertex
{
    XMFLOAT3 Pos;
    XMFLOAT4 Color;
};

struct CBUFFER{ XMMATRIX Final; };

class BoxApp : public Framework_App
{
public:
    BoxApp(HINSTANCE hInstance);
    ~BoxApp();

bool Init();
void OnResize();
void UpdateScene(float dt);
void DrawScene();

void OnMouseDown(WPARAM btnState, int x, int y);
void OnMouseUp(WPARAM btnState, int x, int y);
void OnMouseMove(WPARAM btnState, int x, int y);

private:
    void BuildGeometryBuffers();
    void BuildFX();

private:
    ID3D11Buffer* mBoxVB;
    ID3D11Buffer* mBoxIB;
    ID3D11Buffer* mBoxCB;
    ID3D11VertexShader* pVS;
    ID3D11PixelShader* pPS;

ID3D11InputLayout* mInputLayout;

XMFLOAT4X4 mWorld;
XMFLOAT4X4 mView;
XMFLOAT4X4 mProj;

float mTheta;
float mPhi;
float mRadius;

POINT mLastMousePos;
};
int WINAPI Main(HINSTANCE hInstance, HINSTANCE prevInstance,
    PSTR cmdLine, int showCmd)
{
    BoxApp theApp(hInstance);

    if (!theApp.Init())
        return 0;

    return theApp.App_Run();
}

BoxApp::BoxApp(HINSTANCE hInstance)
: Framework_App(hInstance), mBoxVB(0), mBoxIB(0), pVS(0), pPS(0), mInputLayout(0),
mTheta(1.5f*MathTools::HalfTau), mPhi(0.25f*MathTools::HalfTau), mRadius(5.0f)
{
mLastMousePos.x = 0;
mLastMousePos.y = 0;

XMMATRIX I = XMMatrixIdentity();
XMStoreFloat4x4(&mWorld, I);
XMStoreFloat4x4(&mView, I);
XMStoreFloat4x4(&mProj, I);
}

BoxApp::~BoxApp()
{
    ReleaseCOM(mBoxVB);
    ReleaseCOM(mBoxIB);
    ReleaseCOM(mBoxCB);
    ReleaseCOM(pVS);
    ReleaseCOM(pPS);
    ReleaseCOM(mInputLayout);




  }
    bool BoxApp::Init()
    {
        if (!Framework_App::App_Init())
            return false;

        BuildGeometryBuffers();
        BuildFX();
return true;
}
void BoxApp::OnResize()
{
    Framework_App::OnResize();

    XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathTools::HalfTau, AspectRatio(), 1.0f, 1000.0f);
    XMStoreFloat4x4(&mProj, P);
}
void BoxApp::UpdateScene(float dt)
{
    float x = mRadius*sinf(mPhi)*cosf(mTheta);
    float z = mRadius*sinf(mPhi)*sinf(mTheta);
    float y = mRadius*cosf(mPhi);

    // Build the view matrix.
    XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);
    XMVECTOR target = XMVectorZero();
    XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);

    XMMATRIX V = XMMatrixLookAtLH(pos, target, up);
    XMStoreFloat4x4(&mView, V);
}

void BoxApp::DrawScene()
{
    MainDevContext->ClearRenderTargetView(mRenderTargetView, reinterpret_cast<const float*>(&Colors::LightSteelBlue));
    MainDevContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

MainDevContext->IASetInputLayout(mInputLayout);
MainDevContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

UINT stride = sizeof(Vertex);
UINT offset = 0;
MainDevContext->IASetVertexBuffers(0, 1, &mBoxVB, &stride, &offset);
MainDevContext->IASetIndexBuffer(mBoxIB, DXGI_FORMAT_R32_UINT, 0);

XMMATRIX world = XMLoadFloat4x4(&mWorld);
XMMATRIX view = XMLoadFloat4x4(&mView);
XMMATRIX proj = XMLoadFloat4x4(&mProj);
XMMATRIX worldViewProj = world*view*proj;

CBUFFER cBuffer;
cBuffer.Final = worldViewProj;

MainDevContext->UpdateSubresource(mBoxCB, 0, 0, &cBuffer, 0, 0);
MainDevContext->DrawIndexed(36, 0, 0);

mSwapChain->Present(0, 0);
}

void BoxApp::OnMouseDown(WPARAM btnState, int x, int y)
{
    mLastMousePos.x = x;
    mLastMousePos.y = y;

    SetCapture(FrmeWrkMainWnd);
}

void BoxApp::OnMouseUp(WPARAM btnState, int x, int y)
{
    ReleaseCapture();
}
void BoxApp::OnMouseMove(WPARAM btnState, int x, int y)
{
    if ((btnState & MK_LBUTTON) != 0)
    {
        // Make each pixel correspond to a quarter of a degree.
        float dx = XMConvertToRadians(0.25f*static_cast<float>(x - mLastMousePos.x));
        float dy = XMConvertToRadians(0.25f*static_cast<float>(y - mLastMousePos.y));

        // Update angles based on input to orbit camera around box.
        mTheta += dx;
        mPhi += dy;

        // Restrict the angle mPhi.
        mPhi = MathTools::Clamp(mPhi, 0.1f, MathTools::HalfTau - 0.1f);
    }
    else if ((btnState & MK_RBUTTON) != 0)
    {
        // Make each pixel correspond to 0.005 unit in the scene.
        float dx = 0.005f*static_cast<float>(x - mLastMousePos.x);
        float dy = 0.005f*static_cast<float>(y - mLastMousePos.y);

        // Update the camera radius based on input.
        mRadius += dx - dy;

        // Restrict the radius.
        mRadius = MathTools::Clamp(mRadius, 3.0f, 15.0f);
    }

    mLastMousePos.x = x;
    mLastMousePos.y = y;
}
void BoxApp::BuildGeometryBuffers()
{
    // Create vertex buffer
    Vertex vertices[] =
    {
        { XMFLOAT3(-1.0f, -1.0f, -1.0f), (const float*)&Colors::White },
        { XMFLOAT3(-1.0f, +1.0f, -1.0f), (const float*)&Colors::Black },
        { XMFLOAT3(+1.0f, +1.0f, -1.0f), (const float*)&Colors::Red },
        { XMFLOAT3(+1.0f, -1.0f, -1.0f), (const float*)&Colors::Green },
        { XMFLOAT3(-1.0f, -1.0f, +1.0f), (const float*)&Colors::Blue },
        { XMFLOAT3(-1.0f, +1.0f, +1.0f), (const float*)&Colors::Yellow },
        { XMFLOAT3(+1.0f, +1.0f, +1.0f), (const float*)&Colors::Cyan },
        { XMFLOAT3(+1.0f, -1.0f, +1.0f), (const float*)&Colors::Magneta }
    };

    D3D11_BUFFER_DESC vbd;
    vbd.Usage = D3D11_USAGE_IMMUTABLE;
    vbd.ByteWidth = sizeof(Vertex)* 8;
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    vbd.StructureByteStride = 0;
    D3D11_SUBRESOURCE_DATA vinitData;
    vinitData.pSysMem = vertices;
    MainD3DDevice->CreateBuffer(&vbd, &vinitData, &mBoxVB);

// Create the index buffer

UINT indices[] = {
    // front face
    0, 1, 2,
    0, 2, 3,

    // back face
    4, 6, 5,
    4, 7, 6,

    // left face
    4, 5, 1,
    4, 1, 0,

    // right face
    3, 2, 6,
    3, 6, 7,

    // top face
    1, 5, 6,
    1, 6, 2,

    // bottom face
    4, 0, 3,
    4, 3, 7
};

D3D11_BUFFER_DESC ibd;
ibd.Usage = D3D11_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(UINT)* 36;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
ibd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = indices;
MainD3DDevice->CreateBuffer(&ibd, &iinitData, &mBoxIB);
}
void BoxApp::BuildFX()
{

ID3D10Blob* VS;
ID3D10Blob* PS;
D3DX11CompileFromFile((LPSTR)"mColor.shader",0,0, "VSshader", "vs_4_0", 0, 0, 0, &VS, 0, 0);
D3DX11CompileFromFile((LPSTR)"mColor.shader", 0, 0, "PSshader", "ps_4_0", 0, 0, 0, &PS, 0, 0);
MainD3DDevice->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
MainD3DDevice->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);
MainDevContext->VSSetShader(pVS, 0, 0);
MainDevContext->PSSetShader(pPS, 0, 0);

D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};
MainD3DDevice->CreateInputLayout(vertexDesc, 2, VS->GetBufferPointer(), VS->GetBufferSize() ,&mInputLayout);
MainDevContext->IASetInputLayout(mInputLayout);
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));

bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = 176;
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;

MainD3DDevice->CreateBuffer(&bd, NULL, &mBoxCB);
MainDevContext->VSSetConstantBuffers(0, 1, &mBoxCB);
}
火箭1111

从代码的角度来看,即使代码从我拥有的DX书中提醒了我,也没有使用Effects,但是没有Effects部分(“使用DirectX 11进行3D游戏编程”)。

回到主题,由于您没有使用效果,因此必须转置wvp矩阵。效果会自动为您执行此操作,因此您不必这样做。另外,为什么还要将wvp矩阵存储在结构中?您不必这样做,但是如果您需要...

对于,bd.ByteWidth = 176;您最好使用bd.ByteWidth = sizeof(XMFLOAT4X4)(仅当您只有1个float4x4矩阵时; D)。这样做的好处是它总是可以提供准确的结果。

如果您还没有发现错误,请尝试此;)

希望我能帮上忙

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在授予root权限之前,应用程序布局不会绘制\拒绝

来自分类Dev

绘制功能导致应用程序滞后

来自分类Dev

在Android imageView上绘制应用程序

来自分类Dev

使用 Unity 绘制应用程序

来自分类Dev

将Blender模型导入DirectX 11.2 C ++应用程序

来自分类Dev

将Blender模型导入DirectX 11.2 C ++应用程序

来自分类Dev

从DirectX 11.2应用程序打开或创建文件

来自分类Dev

QT应用程序不会退出

来自分类Dev

Azure不会覆盖应用程序设置

来自分类Dev

我的应用程序不会显示ActionBar

来自分类Dev

Fabric不会让应用程序运行

来自分类Dev

AndroidStudio 不会更改应用程序

来自分类Dev

DirectX 11:运行简单的DirectX应用程序时运行时崩溃

来自分类Dev

Xamarin不会崩溃就不会部署应用程序

来自分类Dev

如何绘制叠加窗口Winform应用程序C#

来自分类Dev

在Android中绘制其他应用程序

来自分类Dev

应用程序输入规范:绘制方法的输入数据

来自分类Dev

在应用程序启动C#处绘制Cross

来自分类Dev

python pyqt matplotlib计算GUI应用程序绘制错误

来自分类Dev

用于绘制Codename One应用程序来源的工具

来自分类Dev

多个group_by闪亮的应用程序进行绘制

来自分类Dev

在Android应用程序中更改可绘制(PNG)

来自分类Dev

绘制Android中的其他应用程序

来自分类Dev

无法在Windows Forms应用程序的groupbox控件内绘制

来自分类Dev

Swing应用程序未在JPanel中绘制JComponent

来自分类Dev

CGContextFillEllipseInRect绘制点超过1000卡住了应用程序

来自分类Dev

在Windows窗体应用程序中绘制形状

来自分类Dev

python pyqt matplotlib计算GUI应用程序绘制错误

来自分类Dev

在WPF应用程序中绘制图形

Related 相关文章

热门标签

归档