编辑:我没有设置深度模板视图,这可能是个问题吗?
我正在尝试关注此tutorial,但当我在XMMatrixLookAtLH
中更改相机位置时,某些顶点的颜色会消失。感觉我正在遇到未定义的行为。
以下是ConstantBuffer
打包的世界,视图和投影矩阵的创建:
ConstantBuffer cb;
cb.world = DirectX::XMMatrixIdentity();
cb.view = XMMatrixLookAtLH({ 4.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 0.0f });
cb.projection = DirectX::XMMatrixPerspectiveFovLH(XM_PI / 2.0f, (float)windowWidth / (float)windowHeight, 0.1f, 110.0f);
布局完全按照它们的创建顺序排列,并在顶点着色器中进行布局。我转移他们。我还尝试用alignas(16)
声明结构,但它没有效果。
这是我创建的缓冲区:
ZeroMemory(&bd, sizeof(D3D11_BUFFER_DESC));
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.ByteWidth = sizeof(cb);
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;
bd.StructureByteStride = 0;
bd.Usage = D3D11_USAGE_DEFAULT;
ZeroMemory(&initialData, sizeof(D3D11_SUBRESOURCE_DATA));
initialData.pSysMem = &cb;
hr = device->CreateBuffer(&bd, &initialData, &constBuffer);
deviceContext->VSSetConstantBuffers(0, 1, &constBuffer);
与教程相比,我在创建时初始化它。我之后尝试过初始化它,但它没有改变任何东西。
这是我的顶点着色器:
cbuffer ConstantBuffer : register(b0)
{
matrix world;
matrix view;
matrix projection;
}
struct PixelInputType
{
float4 pos:SV_POSITION;
float4 color:COLOR;
};
PixelInputType main(float4 pos : POSITION, float4 color : COLOR)
{
PixelInputType output = (PixelInputType)0;
output.pos = mul(pos, world);
output.pos = mul(output.pos, view);
output.pos = mul(output.pos, projection);
output.color = color;
return output;
}
它与教程中的内容大不相同,因为我无法编译它们的版本。我试图评论视图转换,它按预期工作。
我也尝试使用NSight调试帧,它显示三角形存在,但颜色丢失。
我不知道是什么原因导致这种行为。我正在编译x64。我删除了检查的可读性,但它们出现在每次返回HRESULT
的调用中。失败时,检查器总是抛出。立方体以原点为中心,与教程完全相同。
编辑:视口MinDepth
和MaxDepth
设置为 0.01 ,相应地设置为1。
以下是位置(4,0,0)的屏幕截图:
和从位置(1,1,1):
答案 0 :(得分:1)
这是由近平面剪裁引起的。你需要研究近/远飞机。
在D3D初始化时定义近平面。
// Initialize the Direct3D object.
result = m_D3D->Initialize(screenWidth, screenHeight, VSYNC_ENABLED, hwnd, FULL_SCREEN, SCREEN_DEPTH, SCREEN_NEAR);
编辑:您可以从以下链接中阅读更多详细信息。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb206341(v=vs.85).aspx