Directx 将透视变换应用于几何体并将常量缓冲区传递给着色器

Directx 将透视变换应用于几何体并将常量缓冲区传递给着色器,directx,directx-11,Directx,Directx 11,我正在尝试将DirectX-11中的透视变换应用于以原点(0,0,0)为中心且边跨1.0单位(-0.5到0.5)的渲染立方体。然而,我没有看到任何渲染。我尝试了以下方法: shaders.hlsl cbuffer VSHADER_CB { matrix mWorld; matrix mView; matrix mProj; }; struct VOut { float4 position : SV_POSITION; float4 color : COL

我正在尝试将DirectX-11中的透视变换应用于以原点(0,0,0)为中心且边跨1.0单位(-0.5到0.5)的渲染立方体。然而,我没有看到任何渲染。我尝试了以下方法:

shaders.hlsl

cbuffer VSHADER_CB
{
    matrix mWorld;
    matrix mView;
    matrix mProj;
};

struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;

    output.position = mul(position, mWorld);
    output.position = mul(output.position, mView);
    output.position = mul(output.position, mProj);
    output.color = color;

    return output;
}

...
void InitConstantBuffer()


当我只是在着色器文件中不包含任何变换(output.position=position)时,所有内容都会正确渲染,我会看到立方体的正面。这就是我将常量缓冲区传递给着色器并完全利用它们所需要的全部吗?我在这里遗漏了什么?

我找到了我自己问题的答案,我需要在将矩阵发送到着色器之前调用D3DXMatrixTranspose()来转置矩阵。

我找到了我自己问题的答案,我需要调用D3DXMatrixTranspose()来转置矩阵在将它们发送到着色器之前。

仅供参考-您可以在HLSL中使用row_major修饰符来避免这种情况。仅供参考-您可以在HLSL中使用row_major修饰符来避免这种情况。
D3DXMatrixPerspectiveFovLH
以弧度为单位获取FOV,但您的示例似乎表明您通过了度数。
D3DXMatrixPerspectiveFovLH
以弧度为单位获取FOV,但您的示例似乎表明您通过了度数。
...
D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);
D3DXVECTOR3 lookAt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);

D3DXMatrixIdentity(&(cbMatrix.mWorld));
D3DXMatrixLookAtLH(&(cbMatrix.mView), &position, &lookAt, &up);
D3DXMatrixPerspectiveFovLH(&(cbMatrix.mProj), 70.0f, (FLOAT)(width / height), 1.0f, 100.0f);

D3D11_BUFFER_DESC cbd;
ZeroMemory(&cbd, sizeof(D3D11_BUFFER_DESC));
cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbd.ByteWidth = sizeof(cbMatrix);
cbd.Usage = D3D11_USAGE_DEFAULT;

D3D11_SUBRESOURCE_DATA cbdInitData;
ZeroMemory(&cbdInitData, sizeof(D3D11_SUBRESOURCE_DATA));
cbdInitData.pSysMem = &cbMatrix;

mD3DDevice->CreateBuffer(&cbd, &cbdInitData, &mD3DCBuffer);
mD3DImmediateContext->VSSetConstantBuffers(0, 1, &mD3DCBuffer);