Не отображается треугольник при выводе в Direct3D 10.1

Тема в разделе "WASM.DirectX", создана пользователем s3dworld, 22 окт 2011.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго утра!

    Решил попрактиковаться в Direct3D 10.1. Вывод без матрицу удался, но как решил использовать преобразования, так треугольник перестал появляться на экране, хотя координаты устанавливаю такие, что он должен был бы показаться. Чтобы Вы смогли мне помочь, расскажу как я всё это делаю.

    У меня есть два шейдера: вершинный и пиксельный (геометрический я не использую). Вот код вершинного шейдера:

    Код (Text):
    1. cbuffer ConstantBuffer
    2. {
    3.     float4x4 mWVP;
    4. };
    5.  
    6. struct VS_Input
    7. {
    8.     float3 pos : POSITION;
    9.     float4 color : COLOR;
    10. };
    11.  
    12. struct VS_Output
    13. {
    14.     float4 pos : SV_POSITION;
    15.     float4 color : COLOR0;
    16. };
    17.  
    18. VS_Output main(VS_Input _input)
    19. {
    20.     VS_Output output;
    21.    
    22.     output.pos=mul(float4(_input.pos,1.0f),mWVP);
    23.     output.color=_input.color;
    24.    
    25.     return output;
    26. }
    А вот код пиксельного шейдера:

    Код (Text):
    1. struct PS_Input
    2. {
    3.     float4 pos : SV_POSITION;
    4.     float4 color : COLOR0;
    5. };
    6.  
    7. struct PS_Output
    8. {
    9.     float4 color : SV_Target;
    10. };
    11.  
    12. PS_Output main(PS_Input _input)
    13. {  
    14.     PS_Output output;
    15.    
    16.     output.color=_input.color;
    17.    
    18.     return output;
    19. }
    Как видите, ничего сверхъестественного. Просто вывожу то что дали. Шейдеры я компилирую во время запуска программы:

    Код (Text):
    1. // Объявление в описании класса
    2. ID3D10Blob* blobVertexShader;
    3. ID3D10Blob* blobPixelShader;
    4.  
    5. // Реализация в одной из функций класса
    6. D3DX10CompileFromFile(L"00.vs",0,0,"main","vs_4_1",0,0,0,&blobVertexShader,0,0);
    7. D3DX10CompileFromFile(L"00.ps",0,0,"main","ps_4_1",0,0,0,&blobPixelShader,0,0);
    Для сокращения кода я не привожу код на проверку ошибок, но в коде программы он у меня есть и достаточно хороший. Вот создаю шейдеры:

    Код (Text):
    1. device->CreateVertexShader(blobVertexShader->GetBufferPointer(),blobVertexShader->GetBufferSize(),&vertexShader);
    2. device->CreatePixelShader(blobPixelShader->GetBufferPointer(),blobPixelShader->GetBufferSize(),&pixelShader);
    В программе у меня есть две структуры, описывающие вершину и константный буфер:

    Код (Text):
    1. struct SimpleVertex
    2. {
    3.     D3DXVECTOR3 pos;
    4.     D3DXCOLOR color;
    5. };
    6.  
    7. struct ConstantBuffer
    8. {
    9.     D3DXMATRIX mWVP;
    10. };
    А вот тут я создаю входной слой с форматом вершины для шейдера:

    Код (Text):
    1. // Объявление в описании класса
    2. ID3D10InputLayout* inputLayout;
    3.  
    4. // Реализация в одной из функций класса
    5. D3D10_INPUT_ELEMENT_DESC layout[] =
    6. {
    7.     {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D10_INPUT_PER_VERTEX_DATA,0},
    8.     {"COLOR",0,DXGI_FORMAT_R32G32B32A32_FLOAT,0,12,D3D10_INPUT_PER_VERTEX_DATA,0}
    9. };
    10.  
    11. UINT numElements=sizeof(layout)/sizeof(layout[0]);
    12.  
    13. device->CreateInputLayout(layout,numElements,blobVertexShader->GetBufferPointer(),blobVertexShader->GetBufferSize(),&inputLayout);
    14. device->IASetInputLayout(inputLayout);
    Далее я создаю буфер который будет хранить вершины:

    Код (Text):
    1. // Объявление в описании класса
    2. ID3D10Buffer* buffer;
    3.  
    4. // Реализация в одной из функций класса
    5. SimpleVertex vertices[]=
    6. {
    7.     {D3DXVECTOR3(-2.0f,0.0f,10.0f),D3DXCOLOR(1.0f,0.0f,0.0f,1.0f)},
    8.     {D3DXVECTOR3( 0.0f,5.0f,10.0f),D3DXCOLOR(1.0f,1.0f,0.0f,1.0f)},
    9.     {D3DXVECTOR3( 2.5f,0.0f,10.0f),D3DXCOLOR(0.0f,1.0f,0.0f,1.0f)}
    10. };
    11.  
    12. D3D10_BUFFER_DESC bufferDesc;
    13.  
    14. memset(&bufferDesc,0,sizeof(D3D10_BUFFER_DESC));
    15.  
    16. bufferDesc.ByteWidth=sizeof(SimpleVertex)*3;
    17. bufferDesc.Usage=D3D10_USAGE_DEFAULT;
    18. bufferDesc.BindFlags=D3D10_BIND_VERTEX_BUFFER;
    19.  
    20. D3D10_SUBRESOURCE_DATA subresourceData;
    21.  
    22. memset(&subresourceData,0,sizeof(D3D10_SUBRESOURCE_DATA));
    23.  
    24. subresourceData.pSysMem=vertices;
    25.  
    26. device->CreateBuffer(&bufferDesc,&subresourceData,&buffer);
    27.  
    28. UINT stride=sizeof(SimpleVertex);
    29. UINT offset=0;
    30.  
    31. device->IASetVertexBuffers(0,1,&buffer,&stride,&offset);
    32. device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    Далее я создаю 3 матрицы:

    Код (Text):
    1. // Объявление в описании класса
    2. D3DXMATRIX mWorld;
    3. D3DXMATRIX mView;
    4. D3DXMATRIX mProjection;
    5.  
    6. // Реализация в одной из функций класса
    7. D3DXMatrixIdentity(&mWorld);
    8. D3DXMatrixLookAtLH(&mView,&D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,0.0f,1.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
    9. D3DXMatrixPerspectiveLH(&mProjection,(float)800,(float)600,0.1f,100.0f);
    Сами видите что камера стоит в точке (0,0,0) и смотрит в точку (0,0,1), следовательно ей будет видно и всё за точкой (0,0,1). Далее создаю буфер, который буфет передаваться в шейдер (константный буфер):

    Код (Text):
    1. // Объявление в описании класса
    2. ID3D10Buffer* constantBuffer;
    3.  
    4. // Реализация в одной из функций класса
    5. ConstantBuffer structConstantBuffer;
    6.  
    7. structConstantBuffer.mWVP=mWorld*mView*mProjection;
    8.  
    9. memset(&bufferDesc,0,sizeof(D3D10_BUFFER_DESC));
    10.  
    11. bufferDesc.ByteWidth        = sizeof(ConstantBuffer);
    12. bufferDesc.Usage            = D3D10_USAGE_DYNAMIC;
    13. bufferDesc.BindFlags        = D3D10_BIND_CONSTANT_BUFFER;
    14. bufferDesc.CPUAccessFlags   = D3D10_CPU_ACCESS_WRITE;
    15. bufferDesc.MiscFlags        = 0;
    16.  
    17. memset(&subresourceData,0,sizeof(D3D10_SUBRESOURCE_DATA));
    18.  
    19. subresourceData.pSysMem=&structConstantBuffer;
    20.  
    21. device->CreateBuffer(&bufferDesc,&subresourceData,&constantBuffer);
    Вот собственно и всё. Я привёл Вам код, отвечающий за создания всего этого добра (без учёта кода инициализации работы с самим устройством). А вот этот код выполняется циклически, так как это код рисования:

    Код (Text):
    1. float color[4]={0.1f,0.3f,0.6f,1.0f};
    2.  
    3. device->ClearRenderTargetView(renderTargetView,color);
    4. device->ClearDepthStencilView(depthStencilView,D3D10_CLEAR_DEPTH,1.0f,0);
    5.  
    6. device->VSSetConstantBuffers(0,1,&constantBuffer);
    7.  
    8. device->VSSetShader(vertexShader);
    9. device->GSSetShader(0);
    10. device->PSSetShader(pixelShader);
    11.  
    12. device->Draw(3,0);
    13.  
    14. swapChain->Present(0,0);
    В результате я не вижу треугольник на экране. Но если в вершинном шейдере сделать вот так:

    Код (Text):
    1. VS_Output main(VS_Input _input)
    2. {
    3.     VS_Output output;
    4.    
    5.     output.pos=float4(_input.pos,1.0f);
    6.     output.color=_input.color;
    7.    
    8.     return output;
    9. }
    А вершины объявить вот так:

    Код (Text):
    1. SimpleVertex vertices[]=
    2. {
    3.     {D3DXVECTOR3(-1.0f,-1.0f,0.5f),D3DXCOLOR(1.0f,0.0f,0.0f,1.0f)},
    4.     {D3DXVECTOR3(-1.0f, 1.0f,0.5f),D3DXCOLOR(1.0f,1.0f,0.0f,1.0f)},
    5.     {D3DXVECTOR3( 1.5f, 1.0f,0.5f),D3DXCOLOR 0.0f,1.0f,0.0f,1.0f)}
    6. };
    Тогда треугольник отобразится, но это уже без матриц, а просто в экранных координатах. Что я делаю не так?
     
  2. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    23
    Адрес:
    Воронеж
    Возможно, из-за порядка вершин. Получается, что камера смотрит на обратную сторону треугольника. Попробуй установить D3D10_CULL_NONE