2014-10-25 4 views
0

Ok! 여기에 간다. 내 코드를 업데이트했습니다. 그러나 완벽한 코드를 디버깅 한 후에도 문제를 발견 할 수 없습니다. 버텍스 및 인덱스 버퍼 생성과 클래스 그리기 호출을 중심으로 여러 개의 중단 점을 설정했습니다.DirectX 11 : 모델이 모델에서 렌더링되지 않음

테스트 용으로 임시 vtest 구조체를 만들었습니다. 그것은 정의를 전달합니다.

struct vtest{ 
    XMFLOAT3 Vertex; 
    XMFLOAT4 Color; 
}; 

적절한 IA 추상화 링크 :

DeviceContext->Map(g_vBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &MappedResource); 
:

D3D11_BUFFER_DESC BufferDescription; 
ZeroMemory(&BufferDescription, sizeof(BufferDescription)); 

BufferDescription.Usage = D3D11_USAGE_DYNAMIC; 
BufferDescription.ByteWidth = sizeof(vtest) * sz_vBuffer; 
BufferDescription.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
BufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
BufferDescription.MiscFlags = 0; 

D3D11_SUBRESOURCE_DATA SRData; 
ZeroMemory(&SRData, sizeof(SRData)); 
SRData.pSysMem = test; 
SRData.SysMemPitch = 0; 
SRData.SysMemSlicePitch = 0; 

hr = Device->CreateBuffer(&BufferDescription, &SRData, &g_vBuffer); 
D3D11_MAPPED_SUBRESOURCE MappedResource; 
ZeroMemory(&MappedResource, sizeof(MappedResource)); 

vtest 구조체 적절한 채우고 (a (HRESULT) S_OK를 반환 모두)

D3D11_INPUT_ELEMENT_DESC InputElementDesc[] = { 
     { "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 }, 
}; 

은 또한 (HRESULT) S_OK으로 성공합니다. 같은 초기화

지수 (지수 DWORD 1 차원 배열).

D3D11_BUFFER_DESC iBufferDescription; 
ZeroMemory(&iBufferDescription, sizeof(iBufferDescription)); 

iBufferDescription.Usage = D3D11_USAGE_DEFAULT; 
iBufferDescription.ByteWidth = sizeof(DWORD)*sz_iBuffer; 
iBufferDescription.BindFlags = D3D11_BIND_INDEX_BUFFER; 
iBufferDescription.CPUAccessFlags = NULL; 
iBufferDescription.MiscFlags = 0; 

D3D11_SUBRESOURCE_DATA iSRData; 
iSRData.pSysMem = Indices; 

hr = direct3D.Device->CreateBuffer(&iBufferDescription, &iSRData, &g_iBuffer); 

Set... 호출이 draw() 호출되는 IA :

DeviceContext->IASetVertexBuffers(0, 1, &g_vBuffer, &stride, &Offset); 
DeviceContext->IASetIndexBuffer(g_iBuffer, DXGI_FORMAT_R32_UINT, 0); 

기타 설정 (편집 : 수정 구성을 표시하는 값).

D3D11_RASTERIZER_DESC DrawStyleState; 
DrawStyleState.AntialiasedLineEnable = false; 
DrawStyleState.CullMode = D3D11_CULL_NONE; 
DrawStyleState.DepthBias = 0; 
DrawStyleState.FillMode = D3D11_FILL_SOLID; 
DrawStyleState.DepthClipEnable = false; 
DrawStyleState.MultisampleEnable = true; 
DrawStyleState.FrontCounterClockwise = false; 
DrawStyleState.ScissorEnable = false; 

내 깊이 스텐실 코드.

D3D11_TEXTURE2D_DESC DepthStenDescription; 
ZeroMemory(&DepthStenDescription, sizeof(D3D11_TEXTURE2D_DESC)); 

DepthStenDescription.Width = cWidth; 
DepthStenDescription.Height = cHeight; 
DepthStenDescription.MipLevels = 0; 
DepthStenDescription.ArraySize = 1; 
DepthStenDescription.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; 
DepthStenDescription.SampleDesc.Count = 1; 
DepthStenDescription.SampleDesc.Quality = 0; 
DepthStenDescription.Usage = D3D11_USAGE_DEFAULT; 
DepthStenDescription.BindFlags = D3D11_BIND_DEPTH_STENCIL; 
DepthStenDescription.CPUAccessFlags = 0; 
DepthStenDescription.MiscFlags = 0; 

D3D11_DEPTH_STENCIL_VIEW_DESC DSVDesc; 
ZeroMemory(&DSVDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC)); 
DSVDesc.Format = DSVDesc.Format; 
DSVDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 
DSVDesc.Texture2D.MipSlice = 0; 

그리고 마지막으로, 내 엔티티 클래스 draw() 방법 :

void Entity::Draw(){ 
    UINT stride = sizeof(vtest); 
    UINT Offset = 0; 

    ObjectSpace = XMMatrixIdentity(); 
    m_Scale = Scale(); 
    m_Rotation = Rotate(); 
    m_Translate = Translate(); 

    ObjectSpace = m_Scale*m_Rotation*m_Translate; 
    mWVP = ObjectSpace*direct3D.mView*direct3D.mProjection; 

    LocalWorld.mWorldVP = XMMatrixTranspose(wWVP); 

    DeviceContext->UpdateSubresource(direct3D.MatrixBuffer, 0, NULL, &LocalWorld, 0, 0); 
    DeviceContext->VSSetConstantBuffers(0, 1, &direct3D.MatrixBuffer); 

    DeviceContext->IASetVertexBuffers(0, 1, &g_vBuffer, &stride, &Offset); 
    DeviceContext->IASetIndexBuffer(g_iBuffer, DXGI_FORMAT_R32_UINT, 0); 
    DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

    DeviceContext->DrawIndexed(e_Asset.sz_Index, 0, 0); 
} 

코드는 컴파일하고, 백 버퍼가 제대로 제시하지만 모델. 다이렉트 기능 Blank buffer

초기화는 비주얼 스튜디오의 DirectX 디버깅 도구가 내 .hlsl 파일에 잘못 될 수 있음을 산출하여, Banex의 제안에서

DirectX Debugger 업데이트 ... 너무 잘 될 것 같다. Vertex Black Hole Shader of Division by Zero.

내 쉐이더 정말 간단하고, 정말 높이 요/PIX 통과 파일로 작동하기 때문에 나는, 쉐이더 초기화시 잘못 될 수도 생각

다음 .hlsl 파일을 검사하고 더 디버깅을 수행 한 후

+1

Visual Studio 그래픽 디버거를 사용하여 프로그램을 디버깅하여 파이프 라인의 각 단계에서 진행중인 작업을 분석 할 수 있습니다. – Banex

+0

감사! 조금 더 깊게 파낼 수있어 ...DirectX 디버깅 도구의 강력한 세트! (그냥 등장, hehe) 기능을 디버깅에 작은 cramming 세션을 통해가는 - 게시/업데이 트됩니다. –

+0

전체 (vslog) 기능을 사용하려면 (Windows) 업데이트해야하지만, 조사 할 리소스가 몇 개 있습니다. 조금 후에 게시물을 업데이트합니다. –

답변

0

; 설정 output.position = position;을 월드 행렬로 곱하기보다는 모델을 화면에 그려, 잘못된 행렬 계산을 암시하여 상수 버퍼에 저장된 극한 워프 또는 널 값을 발생시킵니다.

cbuffer ConstantBuffer:register(b0) 
{ 
    float4x4 WVP; 
} 

struct VOut 
{ 
    float4 position : SV_POSITION; 
    float4 color : COLOR; 
}; 

VOut VShader(float4 position : POSITION, float4 color : COLOR) 
{ 
    VOut output; 
    output.position = position;// mul(position, WVP); 
    output.color = color; 

    return output; 
} 


float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET 
{ 
    return color; 
}