首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将透视变换应用于几何体并将常量缓冲区传递给着色器

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

Stack Overflow用户
提问于 2012-08-07 13:43:40
回答 1查看 410关注 0票数 1

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

shaders.hlsl

代码语言:javascript
复制
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()

代码语言:javascript
复制
...
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)时,一切都会正确渲染,我看到的是立方体的正面。这就是我将常量缓冲区传递给我的着色器并完全利用它们所需的全部吗?这里我漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-08 00:12:29

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11839910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档