C++ HLSL着色器显示纹理颜色
我正在尝试创建一个着色器,其中输入顶点的位置、一些变换矩阵和顶点颜色的float4。位置的操作很好,但是我没有从中得到正确的颜色 好的,这是着色器的Inputlayout:C++ HLSL着色器显示纹理颜色,c++,colors,shader,direct3d,hlsl,C++,Colors,Shader,Direct3d,Hlsl,我正在尝试创建一个着色器,其中输入顶点的位置、一些变换矩阵和顶点颜色的float4。位置的操作很好,但是我没有从中得到正确的颜色 好的,这是着色器的Inputlayout: D3D11_INPUT_ELEMENT_DESC solidColorLayout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_F
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) },
};
不要对矩阵感到困惑,这些变换是正确的,我得到了正确的顶点,等等,但是我没有得到我定义的颜色
例如,我创建如下顶点:
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) },
};
使用一些indexbuffer和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\u输入\u元素\u描述
错误。我忘记了对齐字节偏移量
。因此,正确的设置应为:
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\u APPEND\u ALIGNED\u元素
,它将自动计算正确的值。(不确定是否为“保存”)