HLSL Vertex Shader получает неверный ввод

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

Вот где я определяю позицию / привязку моего спрайта.

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 у меня есть метод create, в котором я настраиваю макет ввода и создаю пустой буфер вершин.

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);  

}

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

Отладка VS

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

РЕДАКТИРОВАТЬ: код 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);
    }
}

person x3lq    schedule 30.06.2016    source источник


Ответы (1)


Ваша привязка буфера вершин ниже неверна:

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

Вторые аргументы ID3D11DeviceContext :: IASetVertexBuffers - это номер буфера для связывания, здесь он должен быть один, а смещения должны быть действительными:

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

В качестве общего совета вам следует включить устройство отладки при создании с флагом D3D11_CREATE_DEVICE_DEBUG и искать любое сообщение в выводе. В Windows 10 вам, возможно, придется сначала установить его, следуя инструкциям Microsoft по установке отладочного устройства < / а>

person galop1n    schedule 30.06.2016
comment
Прежде всего СПАСИБО за помощь, но если я изменю его на 1, все выйдет из строя, и я получаю сообщение об ошибке в выходном нарушении доступа чтения. С 0 работает нормально. ; ( - person x3lq; 30.06.2016
comment
У меня уже установлена ​​отладка, как я могу ее использовать? разве это не #include debug.h - person x3lq; 30.06.2016
comment
Когда вы вызываете D3D11CreateDevice, вы устанавливаете флаг, который я вам дал, в соответствующем аргументе флага вызова. И если он выйдет из строя, это потому, что вам также нужно указать указатель для смещения 0 в последнем аргументе. - person galop1n; 30.06.2016
comment
idk, если я все понял правильно, но хорошо; D Хорошо изменил все, не сделал смещение правильно, sry; D теперь я получаю новую ошибку, но я исправил ее, она уже РАБОТАЕТ !!! ты обалденный - person x3lq; 30.06.2016
comment
Вторая ошибка для людей, сталкивающихся с той же проблемой: при создании bd.bindflag также неверен, должен быть D3D11_BIND_VERTEX_BUFFER - person x3lq; 30.06.2016