2015-10-05 281 views
1

我正在尝试direct3D,所以我画了一些三角形,这工作得很好,它画了3个黄色三角形。顶点颜色无法正常工作

但是现在我正在尝试制作三角形,其中每个顶点具有不同的颜色并在三角形内插入颜色。屏幕上显示的是三角形各边的三个三角形有不同的颜色,但在三角形内部,一切都是白色的。

我留下了一些代码,我认为这与问题无关,如果有一个功能,你认为问题可能会发生,只需询问我将编辑帖子。

这是我得到的,你可以看到,只有三角形的边得到一个颜色: http://puu.sh/kzuSn/4c8d0b01f0.png

这是我用它来创建三角形的代码。

CPP文件:

#include "TrianglePosCol2D.h" 

struct VertexPosCol 
{ 
    XMFLOAT3 Position; 
    XMFLOAT4 Color; 
}; 

TrianglePosCol2D::TrianglePosCol2D(ID3D11Device* pD3DDevice) 
    :m_pD3DDevice(pD3DDevice) 
    ,m_pVertexLayout(nullptr) 
    ,m_pVertexBuffer(nullptr) 
    ,m_pEffect(nullptr) 
    ,m_pTechnique(nullptr) 
    ,m_NumVertices(0) 
{ 

} 

TrianglePosCol2D::~TrianglePosCol2D(void) 
{ 
    if(m_pVertexBuffer) m_pVertexBuffer->Release(); 
    if(m_pVertexLayout) m_pVertexLayout->Release(); 
    if(m_pEffect)   m_pEffect->Release(); 
} 

HRESULT TrianglePosCol2D::Create(XMFLOAT3 p1, XMFLOAT3 p2, XMFLOAT3 p3, XMFLOAT4 c1, XMFLOAT4 c2, XMFLOAT4 c3) 
{ 
    HRESULT hr = S_OK; 

    // Compile the vertex shader 
    BuildEffect(); 

    // Define the input layout 
    D3D11_INPUT_ELEMENT_DESC inputDesc[] = 
    { 
     { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
     { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT,0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0} 
    }; 
    UINT numElements = sizeof(inputDesc)/sizeof(inputDesc[0]); 

    // Create the input layout 
    D3DX11_PASS_DESC passDesc = { 0 }; 
    m_pTechnique->GetPassByIndex(0)->GetDesc(&passDesc); 
    hr = m_pD3DDevice->CreateInputLayout(
     inputDesc, 
     numElements, 
     passDesc.pIAInputSignature, 
     passDesc.IAInputSignatureSize, 
     &m_pVertexLayout); 

    if (FAILED(hr)) 
    { 
     return hr; 
    } 

    // Create vertex buffer 
    m_NumVertices = 3; 
    //VertexPosCol vertices[] = { (p1,p2,p3),(c1,c2,c3)}; 
    VertexPosCol vertices[] = { { p1,c1 }, { p2,c2 }, { p3,c3 } }; 


    //vertices.Position = (p1, p2, p3); 
    //vertices.Color = (c1, c2, c3); 

    D3D11_BUFFER_DESC bufferDesc = { 0 }; 
    bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; 
    bufferDesc.ByteWidth = sizeof(vertices)*m_NumVertices; 
    bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    bufferDesc.CPUAccessFlags = 0; 
    bufferDesc.MiscFlags = 0; 

    D3D11_SUBRESOURCE_DATA initData = { 0 }; 
    initData.pSysMem = &vertices[0]; 

    hr = m_pD3DDevice->CreateBuffer(&bufferDesc, &initData, &m_pVertexBuffer); 

    return hr; 
} 

void TrianglePosCol2D::Paint(ID3D11DeviceContext* pDeviceContext) 
{ 
    // Set the input layout 
    pDeviceContext->IASetInputLayout(m_pVertexLayout); 

    // Set vertex buffer 
    UINT stride = sizeof(VertexPosCol); 
    UINT offset = 0; 
    pDeviceContext->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &stride, &offset); 

    // Set primitive topology 
    pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

    // Render a triangle 
    D3DX11_TECHNIQUE_DESC techDesc; 
    m_pTechnique->GetDesc(&techDesc); 
    for (UINT p = 0; p <techDesc.Passes; ++p) 
    { 
     m_pTechnique->GetPassByIndex(p)->Apply(0, pDeviceContext); 
     pDeviceContext->Draw(m_NumVertices, 0); 
    } 

} 

这是用于创建三角形的代码。

HRESULT GP2_RenderingPipeline::GameInitialize() 
{ 
    HRESULT hr; 

    m_pColoredTriangle1 = new TrianglePosCol2D(m_pDevice); 
    hr = m_pColoredTriangle1->Create(XMFLOAT3(-1.f, -1.f, 0.99f), XMFLOAT3(-1.f, 1.f, 0.99f), XMFLOAT3(0.f, 1.f, 0.99f), XMFLOAT4(255.f, 0.f, 0.f, 0.f), XMFLOAT4(0.f, 255.f, 0.f, 0.f), XMFLOAT4(0.f, 0.f, 255.f, 0.f)); 
    if (FAILED(hr)) 
    { 
     MessageBox(nullptr, L"Create TrianglePos2D failed!", L"DirectX says NO", MB_ABORTRETRYIGNORE | MB_ICONERROR); 
     exit(-1); 
    } 

    m_pColoredTriangle2 = new TrianglePosCol2D(m_pDevice); 
    hr = m_pColoredTriangle2->Create(XMFLOAT3(-0.5f, 0.f, 0.99f), XMFLOAT3(0.5f, 0.f, .99f), XMFLOAT3(0.f, -1.f, 0.99f), XMFLOAT4(255.f, 0.f, 0.f, 0.f), XMFLOAT4(0.f, 255.f, 0.f, 0.f), XMFLOAT4(0.f, 0.f, 255.f, 0.f)); 
    if (FAILED(hr)) 
    { 
     MessageBox(nullptr, L"Create TrianglePos2D failed!", L"DirectX says NO", MB_ABORTRETRYIGNORE | MB_ICONERROR); 
     exit(-1); 
    } 

    m_pColoredTriangle3 = new TrianglePosCol2D(m_pDevice); 
    hr = m_pColoredTriangle3->Create(XMFLOAT3(0.f, 1.f, 0.99f), XMFLOAT3(1.f, 1.f, 0.99f), XMFLOAT3(1.f, -1.f, 0.99f), XMFLOAT4(255.f, 0.f, 0.f, 0.f), XMFLOAT4(0.f, 255.f, 0.f, 0.f), XMFLOAT4(0.f, 0.f, 255.f, 0.f)); 
    if (FAILED(hr)) 
    { 
     MessageBox(nullptr, L"Create TrianglePos2D failed!", L"DirectX says NO", MB_ABORTRETRYIGNORE | MB_ICONERROR); 
     exit(-1); 
    } 

    return S_OK; 

} 

回答

1

我想你是从像素着色器输出插值顶点颜色。然后,你的问题是范围。

DirectX通常使用[0, 1]范围内的颜色。高于或低于该值的所有内容都被限制在范围内。在边缘上,您可以在组件不相交的颜色之间进行插值(例如,(255, 0, 0)(0, 255, 0))。这将导致前两个分量大于1,几乎每个像素分量都为零。即结果颜色(剪切后)是(1, 1, 0)。在三角形内部,每个分量都大于1,因此您看到白色。

长话短说:减少颜色范围从[0, 255][0, 1]

+0

我会尝试一下,非常感谢你:D这总是很简单的错误,让我浏览几个小时的答案。 – user3678781

+0

我该如何接受?我似乎无法找到它的选项:s – user3678781

+0

@ user3678781 - 检查复选标记。并选择向上箭头,如果你发现答案是特别有用的(或一般的好答案)。 – Jeff