c++ - HLSL 着色器显示有线颜色

标签 c++ colors shader direct3d hlsl

我正在尝试创建一个着色器,其中我将顶点的位置、一些变换矩阵和一个用于顶点颜色的 float4 作为输入。位置的操纵工作正常,但我没有从中得到正确的颜色。

enter image description here

好的,这是着色器的输入布局:

D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};

着色器本身看起来像这样:

cbuffer cbChangesEveryFrame : register(b0)
{
    matrix worldMatrix;
};

cbuffer cbNeverChanges : register(b1)
{
    matrix viewMatrix;
};

cbuffer cbChangeOnResize : register(b2)
{
    matrix projMatrix;
};

struct VS_Input
{
    float4 pos  : POSITION;
    float4 color : COLOR;
};

struct PS_Input
{
    float4 pos: SV_POSITION;
    float4 color: COLOR;
};

PS_Input VS_Main(VS_Input vert)
{
    PS_Input vsout = (PS_Input)0;
    vsout.color = vert.color;

    float4 worldPos = mul(vert.pos, worldMatrix);
    vsout.pos = mul(worldPos, viewMatrix);
    vsout.pos = mul(vsout.pos, projMatrix);

    return vsout;
}


float4 PS_Main(PS_Input psinput) : SV_TARGET
{
    return psinput.color;
}

不要对矩阵感到困惑,那些变换是正确的,我确实得到了正确的顶点位置等等,但我没有得到我定义的颜色。

所以例如我创建这样的顶点:

struct VertexPos
{
    XMFLOAT3 pos;
    XMFLOAT4 color;
};
...

VertexPos vertices[] =
{
    { XMFLOAT3(-1.0f, 0.0f, -1.0f), XMFLOAT4(0.1f,0.1f, 0.1f, 0.1f)},
    { XMFLOAT3(1.0f, 0.0f, -1.0f), XMFLOAT4(0.1f, 0.1f, 0.1f, 0.1f) },
    { XMFLOAT3(1.0f, 0.0f, 1.0f), XMFLOAT4(0.1f, 0.1f, 0.1f, 0.1f) },
    { XMFLOAT3(-1.0f, 0.0f, 1.0f), XMFLOAT4(0.1f, 0.1f, 0.1f, 0.1f) },
};

有了一些索引缓冲区和 drawcall 本身就非常简单了:

unsigned int stride = sizeof(VertexPos);
unsigned int offset = 0;

//set inputlayout and topology for drawing the sprites
context->IASetVertexBuffers(0, 1, &m_vertexBuffer, &stride, &offset);
context->IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R16_UINT, 0);

//calculate cube stuff
XMMATRIX worldMat = getWorldMatrix();
worldMat = XMMatrixTranspose(worldMat);
context->UpdateSubresource(worldBuffer, 0, 0, &worldMat, 0, 0);//update world matrix
//draw
context->DrawIndexed(6, 0, 0);

所以我想知道它有什么问题吗? (看现场的线条和小脸他们应该有颜色)

最佳答案

明白了: 我的 D3D11_INPUT_ELEMENT_DESC 是错误的。我忘记了 AlignedByteOffset。所以正确的 Offset 应该是:

D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};

小 12 毁了它。但它现在工作正常。 或者甚至将其更改为:

D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =
{
    { "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 }
};

您也可以使用 D3D11_APPEND_ALIGNED_ELEMENT,它会自动计算出正确的值。 (不确定是不是“保存”)

关于c++ - HLSL 着色器显示有线颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23607416/

相关文章:

c++ - QCoreApplication 忽略退出信号并挂起

c++ - 在运行时禁用 gcov 覆盖

java - 更改对话框中的按钮文本颜色

assembly - TASM 1.4 - 显示特定颜色的字符串?

unity-game-engine - 编写一个简单的光线转换着色器

c++ - "template polymorphism"为基类型的模板化参数调用函数时,具有派生类型?

c++ - 如果 C++ 中的文件夹中存在相同的文件名,则无法将文件移动到其他文件夹

java - java应用程序中未应用背景颜色

opengl着色器管线深度计算

linux - OpenGL:Linux 上的渲染时间限制