2016-06-30 2 views
1

В настоящее время я работаю над проектом, но моя проблема заключается в том, что мой шейдер Vertex получает неверные данные, поэтому мои значения позиции уже не такие, как я установил их в начале.HLSL Vertex Shader получает неправильный ввод

Так вот где я определяю положение/якорь моего Sprite

struct SpriteVertex 
{ 
    DirectX::XMFLOAT3 position;  
    float radius;     
    int textureIndex;   
}; 

    //Sprite renderer 
    vector<SpriteVertex> sprite_vertices; 
    SpriteVertex current; 
    current.position.x = 0; 
    current.position.y = 0; 
    current.position.z = 0; 
    current.radius = 100; 
    current.textureIndex = 0; 
    sprite_vertices.push_back(current); 



    g_SpriteRenderer->renderSprites(pd3dImmediateContext, sprite_vertices, g_camera); 

Так что в моем SpriteRenderer классе у меня есть метод создания, где я настроить расположение входных и создать пустой буфер вершин.

HRESULT SpriteRenderer::create(ID3D11Device* pDevice) 
{ 
    cout << "Spriterender Create has been called" << endl; 

    HRESULT hr; 


    D3D11_BUFFER_DESC bd; 
    ZeroMemory(&bd, sizeof(bd)); 
    bd.Usage = D3D11_USAGE_DEFAULT; 
    bd.ByteWidth = 1024 * sizeof(SpriteVertex); 
    bd.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
    bd.CPUAccessFlags = 0; 
    bd.MiscFlags = 0; 

    V(pDevice->CreateBuffer(&bd , nullptr, &m_pVertexBuffer)); 

    const D3D11_INPUT_ELEMENT_DESC layout[] ={ 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "RADIUS", 0, DXGI_FORMAT_R32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEXTUREINDEX",0,DXGI_FORMAT_R32_SINT,0,D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } 
    }; 

    UINT numEements = sizeof(layout)/sizeof(layout[0]); 

    D3DX11_PASS_DESC pd; 
    V_RETURN(m_pEffect->GetTechniqueByName("Render")->GetPassByName("SpritePass")->GetDesc(&pd)); 

    V_RETURN(pDevice->CreateInputLayout(layout, numEements, pd.pIAInputSignature, pd.IAInputSignatureSize, &m_pInputLayout)); 


    return S_OK; 
} 

И у меня есть метод визуализации, который заполняет буфер и, как предполагается, чтобы сделать его шейдера я кодированной:

void SpriteRenderer::renderSprites(ID3D11DeviceContext* context, const std::vector<SpriteVertex>& sprites, const CFirstPersonCamera& camera) 
{ 
//cout << "SpriterenderrenderSprites has been called" << endl; 

D3D11_BOX box; 
box.left = 0; box.right = sprites.size()*sizeof(SpriteVertex); 
box.top = 0; box.bottom = 1; 
box.front = 0; box.back = 1; 

context->UpdateSubresource(m_pVertexBuffer,0,&box,&sprites[0],0,0); 

const UINT size = sizeof(SpriteVertex); 

context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); 
context->IASetInputLayout(m_pInputLayout); 
context->IASetVertexBuffers(0, 0, &m_pVertexBuffer, &size, nullptr); 

//setting shader resouirces 
DirectX::XMMATRIX worldviewProj =camera.GetViewMatrix()*camera.GetProjMatrix(); 
m_pEffect->GetVariableByName("g_ViewProjection")->AsMatrix()->SetMatrix((float*) &worldviewProj); 
m_pEffect->GetVariableByName("g_cameraRight")->AsVector()->SetFloatVector((float*) &camera.GetWorldRight()); 
m_pEffect->GetVariableByName("g_cameraUP")->AsVector()->SetFloatVector((float*)&camera.GetWorldUp()); 

m_pEffect->GetTechniqueByName("Render")->GetPassByName("SpritePass")->Apply(0,context); 
context->Draw(size,0); 

}

Так что моя большая проблема, что когда я отладки шейдеры, которые мой внутренний радиус позиции и т. д. даже близко к тому, что я хочу:

Debug VS

Я пытаюсь исправить это сейчас навсегда, любая помощь будет действительно оценена.

EDIT: HLSL код может помочь =)

//-------------------------------------------------------------------------------------- 
// Shader resources 
//-------------------------------------------------------------------------------------- 



//-------------------------------------------------------------------------------------- 
// Constant buffers 
//-------------------------------------------------------------------------------------- 
cbuffer cbCOnstant 
{ 
    matrix g_ViewProjection; 
    float4 g_cameraRight; 
    float4 g_cameraUP; 
}; 


//-------------------------------------------------------------------------------------- 
// Structs 
//-------------------------------------------------------------------------------------- 
struct SpriteVertex 
{ 
    float3 POSITION : POSITION; 
    float RADIUS: RADIUS; 
    int TEXIN : TEXTUREINDEX; 
}; 

struct PSVertex 
{ 
    float4 POSITION : SV_Position; 
    int TEXIN : TEXTUREINDEX; 
}; 

//-------------------------------------------------------------------------------------- 
// Rasterizer states 
//-------------------------------------------------------------------------------------- 
RasterizerState rsCullNone 
{ 
    CullMode = None; 
}; 

//-------------------------------------------------------------------------------------- 
// DepthStates 
//-------------------------------------------------------------------------------------- 
DepthStencilState EnableDepth 
{ 
    DepthEnable = TRUE; 
    DepthWriteMask = ALL; 
    DepthFunc = LESS_EQUAL; 
}; 
BlendState NoBlending 
{ 
    AlphaToCoverageEnable = FALSE; 
    BlendEnable[0] = FALSE; 
}; 


//-------------------------------------------------------------------------------------- 
// Shaders 
//-------------------------------------------------------------------------------------- 
SpriteVertex DummyVS(SpriteVertex Input) 
{  
    return Input; 
} 

[maxvertexcount(4)] 
void SpriteGS(point SpriteVertex vertex[1], inout TriangleStream<PSVertex> stream){ 

    PSVertex input; 
    input.TEXIN = vertex[0].TEXIN; 


    //bottom left 
    input.POSITION = mul(float4(vertex[0].POSITION,1) - vertex[0].RADIUS * g_cameraRight - vertex[0].RADIUS * g_cameraUP, g_ViewProjection); 
    stream.Append(input); 

    //top left 

    input.POSITION = mul(float4(vertex[0].POSITION,1) - vertex[0].RADIUS * g_cameraRight + vertex[0].RADIUS * g_cameraUP, g_ViewProjection); 
    stream.Append(input); 

    //top right 
    input.POSITION = mul(float4(vertex[0].POSITION,1) + vertex[0].RADIUS * g_cameraRight + vertex[0].RADIUS * g_cameraUP, g_ViewProjection); 
    stream.Append(input); 

     //bot right 

    input.POSITION = mul(float4(vertex[0].POSITION,1) + vertex[0].RADIUS * g_cameraRight - vertex[0].RADIUS * g_cameraUP, g_ViewProjection); 
    stream.Append(input); 

} 



float4 DummyPS(PSVertex input) : SV_Target0 
{ 
return float4(1, 1, 0, 1); 
} 

//-------------------------------------------------------------------------------------- 
// Techniques 
//-------------------------------------------------------------------------------------- 
technique11 Render 
{ 
    pass SpritePass 
    { 
     SetVertexShader(CompileShader(vs_5_0, DummyVS())); 
     SetGeometryShader(CompileShader(gs_5_0, SpriteGS())); 
     SetPixelShader(CompileShader(ps_5_0, DummyPS())); 

     SetRasterizerState(rsCullNone); 
     SetDepthStencilState(EnableDepth,0); 
     SetBlendState(NoBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); 
    } 
} 

ответ

1

Ваше связывание буфера вершин ниже неправильно:

context->IASetVertexBuffers(0, 0, &m_pVertexBuffer, &size, nullptr); 

The Seconde аргументы ID3D11DeviceContext::IASetVertexBuffers является количество буфера для связывания, он должен быть одним здесь, а смещения должны быть действительными:

UINT offset = 0; 
context->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &size, &offset); 

В качестве гена ral advice, вы должны включить устройство отладки при создании с флагом D3D11_CREATE_DEVICE_DEBUG и искать любое сообщение на выходе. В Windows 10 вам, возможно, придется установить его в первую очередь в соответствии с инструкциями Microsoft. installing the debug device

+0

Прежде всего, СПАСИБО за помощь, но если я изменю ее на 1, все это произойдет сбой, и я получаю сообщение об ошибке на выходе с нарушением доступа к чтению. С 0 работает нормально. ; ( – x3lq

+0

У меня уже установлен Debug, так как я могу использовать его? Не так ли #include «debug.h» – x3lq

+0

Когда вы вызываете D3D11CreateDevice, вы устанавливаете флаг, который я дал вам в соответствующем аргументе флага вызова И если он падает, это связано с тем, что вам также нужно указать указатель на смещение 0 в последнем аргументе. – galop1n