在3D图形中实现透视投影的问题,(d3d)

时间:2016-12-17 09:34:24

标签: graphics directx perspectivecamera projection-matrix

我在设置直接x的透视投影时遇到了很大的困难。 我已经被困在这几周了,任何帮助都会受到赞赏。

就我的情况而言,我的管道设置很好,因为着色器正在获取我正在打包的数据,所以我会放弃包括该代码,除非我要求它

我在主机端使用glm进行数学运算(因此是列矩阵)。它设置为使用左手坐标系。但是,我似乎无法使其投影矩阵起作用, (如果我使用从中得到的矩阵,我会得到一个空白的屏幕)所以我写了这个 - 我希望这只是暂时的。

namespace
{
    glm::mat4 
    perspective()
    {
        DirectX::XMMATRIX dx = DirectX::XMMatrixPerspectiveFovLH(glm::radians(60.0f), 1, 0.01, 1000.0f);
        glm::mat4 glfromdx;

       for (int c = 0; c < 3; c++)
       {
            for (int r = 0; r < 3; r++)
            {
                glfromdx[c][r] = DirectX::XMVectorGetByIndex(dx.r[c], r);
            }
       }

       return glfromdx;
    }
}

这确实给我一个工作的投影矩阵 - 但我并不认为它正在发挥作用。我不确定 它是一个实际的投影,我的剪辑空间微不足道。如果我移动相机,它会剪辑。包含照片。

照片1 :(直接)

looking directly at a triangle, with no camera rotation.

照片2 :(凸轮向上倾斜)

camera tilted up.

照片3 :(凸轮向左倾斜)

camera tilted to the left.

这是我的顶点着色器 https://gist.github.com/anonymous/31726881a5476e6c8513573909bf4dc6

cbuffer offsets
{
     float4x4 model; //<------currently just identity
     float4x4 view; 
     float4x4 proj;
}

struct idata
{
    float3 position : POSITION;
    float4 colour : COLOR;
};
struct odata 
{
    float4 position : SV_POSITION;
    float4 colour : COLOR;
};


void main(in idata dat, out odata odat)
{
    odat.colour = dat.colour;
    odat.position = float4(dat.position, 1.0f);

    //point' = point * model * view * projection
    float4x4 mvp = mul(model, mul(view, proj)); 

    //column matrices.
    odat.position = mul(mvp, odat.position);
}

这是我的片段着色器 https://gist.github.com/anonymous/342a707e603b9034deb65eb2c2101e91

struct idata
{
    float4 position : SV_POSITION;
    float4 colour : COLOR;
};
float4 main(in idata data) : SV_TARGET
{
    return float4(data.colour[0], data.colour[1], data.colour[2] , 1.0f);
}

这里还有完整的相机实现 https://gist.github.com/anonymous/b15de44f08852cbf4fa4d6b9fafa0d43 https://gist.github.com/anonymous/8702429212c411ddb04f5163b1d885b9

最后这些是传入的顶点 位置3颜色4

(0.0f,0.5f,0.0f,1.0f,0.0f,0.0f,1.0f), (0.45f,-0.5f,0.0f,0.0f,1.0f,0.0f,1.0f), (-0.45f,-0.5f,0.0f,0.0f,0.0f,1.0f,1.0f)

编辑:

我将着色器中的P * M * V * P计算更改为此;     odat.position = mul(mul(mul(proj,view),model),odat.position); 仍然有同样的问题。

编辑2:

嗯,上面的变化与产生视角的变化混合在一起,现在只是纯粹使用glm。

glm::mat4 GLtoDX_NDC(glm::translate(glm::vec3(0.0, 0.0, 0.5)) *
        glm::scale(glm::vec3(1.0, 1.0, 0.5)));
glm::mat4 gl = GLtoDX_NDC * glm::perspectiveFovLH(60.0f, 500.0f, 500.0f, 100.0f, 0.1f);

这可以起作用,只要物体不再在大约一微米处剔除,并且被投射到它们的近似尺寸。但是,现在一切都是颠倒的,旋转会导致剪切......

0 个答案:

没有答案