到目前为止,我制作了一个非常基本的立方体,但我使用的颜色是错误的。如果我在我的顶点缓冲区中定义红色,那么立方体上任何地方都有 no 红色!
红色进入浅绿色
黄色转向浅蓝色
...
可以找到一些颜色,如绿色,黑色......,只是其中一些!!
以下是我定义顶点缓冲区的方法(忽略/*UV Coords*/
)
Vertex vertices[] =
{
//Front face vertices
{ XMFLOAT3(-1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, +1.0f, +1.0f), /*XMFLOAT2(1.0f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, -1.0f, +1.0f), /*XMFLOAT2(1.0f, 1.0f)*/ Colors::Yellow },
//Back face vertices
{ XMFLOAT3(-1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, +1.0f, -1.0f), /*XMFLOAT2(1.0f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, -1.0f, -1.0f), /*XMFLOAT2(1.0f, 1.0f)*/ Colors::Yellow },
//Right face vertices
{ XMFLOAT3(+1.0f, +1.0f, -1.0f), /*XMFLOAT2(1.0f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, -1.0f, -1.0f), /*XMFLOAT2(1.0f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
//Left face vertices
{ XMFLOAT3(-1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.0f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.0f, 1.0f)*/ Colors::Yellow },
//Top face vertices
{ XMFLOAT3(+1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.0f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.0f, 0.0f)*/ Colors::Yellow },
//Bottom face vertices
{ XMFLOAT3(+1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.0f, 1.0f)*/ Colors::Yellow },
{ XMFLOAT3(+1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
{ XMFLOAT3(-1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.0f, 0.0f)*/ Colors::Yellow }
};
这里我只测试黄色,结果如下:
一些信息:
顶点结构:
struct Vertex
{
XMFLOAT3 pos;
XMVECTORF32 color;
};
Colors Enum来自DirectXColors.h
。它用于颜色XMVECTORF32
。
我非常基本的Pixel Shader:
struct PixelIN
{
float4 pos : SV_POSITION;
float4 color : COLOR;
};
float4 main(PixelIN i) : SV_TARGET
{
return i.color;
}
我的输入布局说明:
D3D11_INPUT_ELEMENT_DESC ie[] = {
{ "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}
};
BufferDesc.Format
的值为DXGI_FORMAT_R8G8B8A8_UNORM
感谢您的帮助!
答案 0 :(得分:2)
您的问题在XMFLOAT3
结构中混合了XMVECTORF32
和Vertex
,这会在结构中插入额外的填充。
XMVECTOR
类型与16字节边界对齐以提高性能。这将使Vertex
结构为32个字节,在pos
和color
之间填充1个字节,以正确对齐XMVECTORF32
数据。填充的额外字节会抛弃输入布局,因为您已经说过位置是12个字节,紧接着是16个字节,只有28个字节。
你可以通过几种方式解决这个问题。之一:
将输入布局中的"POSITION"
更改为DXGI_FORMAT_R32G32B32A32_FLOAT
,以说明结构中填充的额外字节。如果在顶点着色器中使用float4
作为位置,则可能需要在转换前将此额外值(w分量)设置为1.
将结构中的color
更改为XMFLOAT4
。
将结构中的pos
更改为XMVECTORF32
或XMFLOAT4
并执行#1。这样就不会隐藏填充。