2013-06-22 2 views
1

방금 ​​DirectX 11에서 시작 했으므로 문제가 발생했습니다. 다음 코드 (즉, 경우 (FAILED (결과) 문을 유발하지 않습니다)를 사용하여도움 꼭두각시 쉐이더 생성시 잘못된 인수 오류 이해

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

VOut VS_Main(float4 pos : POSITION, float4 color : COLOR) 
{ 
VOut output; 

output.position = pos; 
output.color = color; 

return output; 
} 


float4 PS_Main(float4 pos : SV_POSITION, float4 color : COLOR) : SV_TARGET 
{ 
return color; 
} 

: 나는 HSDL 파일에 매우 간단한 쉐이더를로드하고있어

bool PathfindingDemoBase::CompileD3DShader(char* filePath, char* entry, char* shaderModel, ID3DBlob** buffer){ 
DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS; 

#if defined(DEBUG) || defined(_DEBUG) 
shaderFlags |= D3DCOMPILE_DEBUG; 
#endif 

ID3DBlob* errorBuffer = 0; 
HRESULT result; 

result = D3DX11CompileFromFile(filePath, 0, 0, entry, shaderModel, 
    0, 0, 0, buffer, &errorBuffer, 0); 

if(FAILED(result)){ 
    if(errorBuffer != 0){ 
     OutputDebugStringA((char*)errorBuffer->GetBufferPointer()); 
     errorBuffer->Release(); 
    } 

    return false; 
} 

if(errorBuffer != 0){ 
    errorBuffer->Release(); 
} 

return true; 
} 

을하지만 무슨 일이 일어날 않습니다 LoadContent 기능에, 주석 라인 (// < ---)는 "E_INVALIDARG"결과를 (d3dResult에서) 트리거하지만 vsBuffer-> 호출은 null이 반환되지 않습니다/

bool AStarDemo::LoadContent(){ 
ID3D10Blob* vsBuffer = 0; 
bool compileResult = CompileD3DShader("ReturnColor.hlsl", "VS_Main", "vs_5_0", &vsBuffer); 

if(compileResult == false){ 
    MessageBox(0, "Error loading vertex shader!", "Compile Error", MB_OK); 
    return false; 
} 

HRESULT d3dResult; 

d3dResult = d3dDevice->CreateVertexShader(vsBuffer->GetBufferPointer(), 
    vsBuffer->GetBufferSize(), 0, &returnColorVS); 
//actually set the vertex shader 
d3dContext->VSSetShader(returnColorVS, 0, 0); 

if(FAILED(d3dResult)){ 
    if(vsBuffer){ 
     vsBuffer->Release(); 
    } 

    return false; 
} 

D3D11_INPUT_ELEMENT_DESC solidColorLayout[] ={ 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 } 
}; 

unsigned int totalLayoutElements = ARRAYSIZE(solidColorLayout); 

d3dResult = d3dDevice->CreateInputLayout(solidColorLayout, totalLayoutElements, 
    vsBuffer->GetBufferPointer(), vsBuffer->GetBufferSize(), &inputLayout); 

vsBuffer->Release(); 

if(FAILED(d3dResult)){ 
    return false; 
} 

ID3D10Blob* psBuffer = 0; 
compileResult = CompileD3DShader("ReturnColor.hlsl", "PS_Main", "ps_5_0", &psBuffer); 
//actually set the pixel shader 
d3dContext->PSSetShader(returnColorPS, 0, 0); 

if(compileResult == false){ 
    MessageBox(0, "Error loading pixel shader!", "Compile Error", MB_OK); 
    return false; 
} 

d3dResult = d3dDevice->CreatePixelShader(psBuffer->GetBufferPointer(), 
    psBuffer->GetBufferSize(), 0, &returnColorPS); 

psBuffer->Release(); 

if(FAILED(d3dResult)){ 
    return false; 
} 

Vertex vertices[4 * TOTAL_NUMBER_GRID_SQUARES]; 
gridSquares = new GridSquare[TOTAL_NUMBER_GRID_SQUARES]; 
//for each grid square 
for(int i = 0; i < TOTAL_NUMBER_GRID_SQUARES; i++){ 

    XMFLOAT4 color = ((i%2) == 0) ? GREEN : RED; 

    //create a grid square object 
    GridSquare gs; 
    gs.TopLeft = Vertex(XMFLOAT3(0.5f * i, 0.5f * i, Z_LEVEL), 
         color); 
    gs.TopRight = Vertex(XMFLOAT3(0.5f * i, -0.5f * i, Z_LEVEL), 
         color); 
    gs.BottomRight = Vertex(XMFLOAT3(-0.5f * i, -0.5f * i, Z_LEVEL), 
         color); 
    gs.BottomLeft = Vertex(XMFLOAT3(-0.5f * i, 0.5f * i, Z_LEVEL), 
         color); 

    gs.type = ((i%2) == 0) ? prey : hunter; 

    gridSquares[i] = gs; 

    vertices[4*i] = gs.TopLeft; 
    vertices[(4*i)+1] = gs.TopRight; 
    vertices[(4*i)+2] = gs.BottomRight; 
    vertices[(4*i)+3] = gs.BottomLeft; 
} 

D3D11_BUFFER_DESC vertexDesc; 
ZeroMemory(&vertexDesc, sizeof(vertexDesc)); 
vertexDesc.Usage = D3D11_USAGE_DYNAMIC; 
vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
vertexDesc.ByteWidth = 4 * TOTAL_NUMBER_GRID_SQUARES * sizeof(Vertex); 
vertexDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 

D3D11_SUBRESOURCE_DATA resourceData; 
ZeroMemory(&resourceData, sizeof(resourceData)); 
resourceData.pSysMem = vertices; 

d3dResult = d3dDevice->CreateBuffer(&vertexDesc, &resourceData, &vertexBuffer); 

if(FAILED(d3dResult)){ 
    return false; 
} 

return true; 
} 

모든 advi ce 크게 감사하겠습니다! :)

+0

는 귀하의 의견 레이아웃이 셰이더의 입력 레이아웃과 일치하지 않습니다. 그것들은 항상 일치해야합니다. 그렇지 않으면 디버그 레이어가 불평하고 셰이더가 잘못 렌더링됩니다. – Alex

답변

2

분명히 "ps_5_0"와 "vs_5_0"을 사용하여 몇 가지 문제가 내 컴퓨터에 DirectX 11

를 실행하더라도이됩니다의 비트 주위에 파고 후 답을 찾을 수 또 다른 문제는 여기에 언급
+1

명확성을 위해 : ps_5_0을 ps_4_0으로 변경하십시오 (vs와 유사 함). – robor78