2014-09-27 3 views
0

DirectX 엔진을 설정했는데 문제가 없지만 그릴 필요가있는 개체가 표시되지 않고 문제가있는 곳을 찾을 수 없습니다. 코드를 통해 자습서 엔진을 검색했지만 여전히 작동하지 않습니다. 누구든지 내 코드에서 문제를 볼 수 있습니까? 이미 도움을 주셔서 감사합니다. 추신. 모든 헤더 파일에 대해 걱정하지 마라.이 파일은 그렇지 않다. 하여 코드 내가 가지고 DX 책에서 저를 생각 나게한다하더라도, 당신이 효과를 사용하여 사용하지 않는 코드를보고 있지만, 효과 부분 ("다이렉트 X 11과 3D 게임 프로그래밍")를 사용하지 않고에서DirectX App이 그려지지 않습니다.

#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); 
} 
+0

도움을 희망, 당신은 이미 오류를 발견하지 못한 경우

,이 시도? 오류 검사 및 코드 처리를 추가하십시오. 또한 리터럴 인'bd.ByteWidth = 176'은 의심스러워 보입니다. C++ 코드와 HLSL 코드 사이의 상수 버퍼 선언이 일치하지 않을 수도 있습니다. – MooseBoys

+0

내 코드에 작은 문제가 있음을 알았습니다. 'D3DX11CompileFromFile'함수가 내 HLSL 코드와 일치하지 않지만 HLSL과 관련된 문제는 찾을 수 없습니다. – PVermillion

+0

새로운 오류가 발견되었습니다. 다른 응용 프로그램을 실행 중이므로 내 응용 프로그램이 내 것을 끌어 오지 않는 것 같습니다. 내 프로젝트가 여러 개의 cpp로 구성되어 있기 때문에 새로운 프로젝트가 아닌 것 같습니다. 이제 엔트리 포인트를 찾을 수 없다는 오류가 발생합니다. – PVermillion

답변

0

.

로 돌아 가기 효과를 사용하지 않으므로 wvp 매트릭스를 조 변경해야합니다. 효과는 자동으로 수행하므로 수행 할 필요가 없습니다. 또한 왜 구조체에 wvp 행렬을 저장합니까? 당신은 그것을 필요로하지 않지만 필요하다면 ...

bd.ByteWidth = 176;의 경우 bd.ByteWidth = sizeof(XMFLOAT4X4)을 더 잘 사용해야합니다 (단지 1 개의 float4x4 매트릭스가있는 경우에만 해당). 이것의 장점은 입니다. 항상 정확한 결과를 제공합니다.)

내가 확실 모든 호출이 성공되어 있습니까

+0

모두 잘 작동합니다. 고맙습니다. 추신. 이 코드는이 책에서 수정되었습니다. – PVermillion

+0

나는 그것을 알고 있었다, D 나는 그것을 항상 사용하고있다.) – Rakete1111

+0

당신은 이것에 대해 경험이 있습니까? 나는 전체 플랫폼에 대해 더 많이 배우고 그것이 정확히 어떻게 작동 하는지를 알고 싶습니다. 왜냐하면 많은 정보를 모았고 실제로 수집하고 있기 때문입니다. 나는 그것에 대해 더 많은 것을 배우고 싶다. – PVermillion