ich lerne mich zur Zeit in DirectX 11 und bin schon recht früh auf ein mir unverständliches Problem gestoßen. Ich möchte mir etwas Geometrie erzeugen um mir eine Box zu bauen. Für den bisherigen Code habe ich mir hauptächlich die Samples aus dem SDK angesehen.
Beim kompilieren bekomme ich die Fehlermeldung "Error Code: E_INVALIDARG (0x80070057) Calling: pd3dDevice -> CreateBuffer(&Desc, NULL, &g_pcbPerFrame)"
Ich poste hier im Anschluss mal die CreateDevice und die Framerender, da sich darin ja der Fehler befinden sollte. (ich habe die Stelle unterstrichen, ich hoffe es ist sonst leserlich)
Es wäre wirklich super wenn mir jemand weiterhelfen könnte, bisher konnte das niemand.
Mit freundlichen Grüßen
Code: Alles auswählen
HRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext )
{
HRESULT hr;
ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext();
V_RETURN( g_DialogResourceManager.OnD3D11CreateDevice( pd3dDevice, pd3dImmediateContext ) );
V_RETURN( g_D3DSettingsDlg.OnD3D11CreateDevice( pd3dDevice ) );
ID3DBlob* pBlobVS = NULL;
ID3DBlob* pBlobPS = NULL;
V_RETURN( CompileShaderFromFile( L"Shader.hlsl", "DrawVS", "vs_5_0", &pBlobVS ) );
V_RETURN( CompileShaderFromFile( L"Shader.hlsl", "DrawPS", "ps_5_0", &pBlobPS ) );
V_RETURN( pd3dDevice->CreateVertexShader( pBlobVS->GetBufferPointer(), pBlobVS->GetBufferSize(), NULL, &g_pVertexShader ) );
V_RETURN( pd3dDevice->CreatePixelShader( pBlobPS->GetBufferPointer(), pBlobPS->GetBufferSize(), NULL, &g_pPixelShader ) );
const D3D11_INPUT_ELEMENT_DESC patchlayout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "WORLDPOS", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
V_RETURN( pd3dDevice->CreateInputLayout( patchlayout, ARRAYSIZE( patchlayout ), pBlobVS->GetBufferPointer(),
pBlobVS->GetBufferSize(), &g_pPatchLayout ) );
SAFE_RELEASE( pBlobVS );
SAFE_RELEASE( pBlobPS );
D3D11_BUFFER_DESC Desc;
Desc.Usage = D3D11_USAGE_DYNAMIC;
Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
Desc.MiscFlags = 0;
Desc.ByteWidth = sizeof( CB_PER_FRAME_CONSTANTS );
[u]V_RETURN( pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbPerFrame ) );[/u]
D3D11_RASTERIZER_DESC RasterDesc;
ZeroMemory( &RasterDesc, sizeof(D3D11_RASTERIZER_DESC) );
RasterDesc.FillMode = D3D11_FILL_SOLID;
RasterDesc.CullMode = D3D11_CULL_NONE;
RasterDesc.DepthClipEnable = TRUE;
V_RETURN( pd3dDevice->CreateRasterizerState( &RasterDesc, &g_pRasterizerStateSolid ) );
RasterDesc.FillMode = D3D11_FILL_WIREFRAME;
V_RETURN( pd3dDevice->CreateRasterizerState( &RasterDesc, &g_pRasterizerStateWireframe ) );
D3D11_BUFFER_DESC vbDesc;
ZeroMemory( &vbDesc, sizeof(D3D11_BUFFER_DESC) );
vbDesc.ByteWidth = sizeof(MESH_CONTROL_POINT) * (ARRAYSIZE(g_Cornell));
vbDesc.Usage = D3D11_USAGE_DEFAULT;
vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA vbInitData;
ZeroMemory( &vbInitData, sizeof(vbInitData) );
vbInitData.pSysMem = g_Cornell;
V_RETURN( pd3dDevice->CreateBuffer( &vbDesc, &vbInitData, &g_pControlPointVB ) );
return S_OK;
}
Code: Alles auswählen
void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext,
double fTime, float fElapsedTime, void* pUserContext )
{
if( g_D3DSettingsDlg.IsActive() )
{
g_D3DSettingsDlg.OnRender( fElapsedTime );
return;
}
D3DXMATRIX mViewProjection;
D3DXMATRIX mProj = *g_Camera.GetProjMatrix();
D3DXMATRIX mView = *g_Camera.GetViewMatrix();
mViewProjection = mView * mProj;
D3D11_MAPPED_SUBRESOURCE MappedResource;
pd3dImmediateContext->Map( g_pcbPerFrame, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource );
CB_PER_FRAME_CONSTANTS* pData = ( CB_PER_FRAME_CONSTANTS* )MappedResource.pData;
D3DXMatrixTranspose( &pData->mViewProjection, &mViewProjection );
pData->vCameraPosWorld = *( g_Camera.GetEyePt() );
pd3dImmediateContext->Unmap( g_pcbPerFrame, 0 );
float ClearColor[4] = { 0.05f, 0.05f, 0.05f, 0.0f };
ID3D11RenderTargetView* pRTV = DXUTGetD3D11RenderTargetView();
pd3dImmediateContext->ClearRenderTargetView( pRTV, ClearColor );
ID3D11DepthStencilView* pDSV = DXUTGetD3D11DepthStencilView();
pd3dImmediateContext->ClearDepthStencilView( pDSV, D3D11_CLEAR_DEPTH, 1.0, 0 );
pd3dImmediateContext->RSSetState( g_pRasterizerStateSolid );
pd3dImmediateContext->VSSetConstantBuffers( g_iBindPerFrame, 1, &g_pcbPerFrame );
pd3dImmediateContext->PSSetConstantBuffers( g_iBindPerFrame, 1, &g_pcbPerFrame );
pd3dImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
pd3dImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );
if( g_bDrawWires )
{
pd3dImmediateContext->RSSetState( g_pRasterizerStateWireframe );
}
pd3dImmediateContext->IASetInputLayout( g_pPatchLayout );
UINT Stride = sizeof( MESH_CONTROL_POINT );
UINT Offset = 0;
pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pControlPointVB, &Stride, &Offset );
pd3dImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
pd3dImmediateContext->Draw( ARRAYSIZE(g_Cornell), 0 );
pd3dImmediateContext->RSSetState( g_pRasterizerStateSolid );
}