2012-08-07 58 views
1

我試圖將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; 
} 

... 

無效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 =位置) ,一切都呈現正確,我看到立方體的正面。這是我需要將常量緩衝區傳遞給我的着色器並完全利用它們嗎?我在這裏錯過了什麼?

回答

1

我想出了自己的問題的答案,我需要調用D3DXMatrixTranspose()將它們發送給着色器之前調換矩陣。

+0

Just FYI - 您可以在HLSL中使用row_major修飾符來避免這種情況。 – asmi84 2012-08-07 18:59:24

+0

我不知道,謝謝! – 2012-08-07 19:01:40

相關問題