1

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

着色器.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;
}

...

无效的 InitConstantBuffer()

...
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);

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

4

1 回答 1

1

我想出了自己问题的答案,我需要通过调用 D3DXMatrixTranspose() 来转置矩阵,然后再将它们发送到着色器。

于 2012-08-07T16:12:28.733 回答