2012-02-02 150 views
1

我目前正在开发使用C#的Direct3D 11渲染引擎。投影和裁剪问题?

我已经成功绘制了三角形,应用了颜色和纹理等。 我现在试图展示的对象是边长为1的旋转立方体,放置在世界空间的原点。 但是,在应用视图和特别是投影矩阵时,我得到的结果并不令人满意。由于这是很难解释,我只是告诉你什么结果,我得到不同的视点/投影组合:从我的顶点着色器


HLSL代码片段:

float4x4 wvpMatrix = mul(World, mul(View, Projection)); 
output.Position = mul(input.Position, wvpMatrix); 

世界矩阵使用:

// Static rotation around all three axes 
matrices.World = Matrix.Identity * Matrix.CreateFromYawPitchRoll(0.5f, 0.6f, 1.0f); 

试验A

从正z方向的原点的简单视图向量。没有使用投影。 您可以看到多维数据集的背面正被裁剪。

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.Identity; 

Cube with back corners clipped


试验B

查看矩阵保持不变,但现在我使用的是正交投影矩阵。 这次立方体的正面消失。你可以看到的部分是那些被试验A.在测试A.修剪

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.CreateOrthographic(2, 2, 0.01f, 100.0f); 

Cube with front corner clipped


测试C

同样没有投影,就像这一次,场景正在从z轴负方向的三个单位观察。 当相机位置未设置为系统原点时,该立方体看起来失真。我认为还有一些裁剪。

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.Identity; 

Distorted cube


试验d

最后,我使用透视投影。到目前为止,我还没有找到可以看到立方体任何部分的摄像机位置。我得到的全屏矢车菊蓝色。

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.CreatePerspectiveFieldOfView(1, 1, 0.1f, 100); 

No visible parts of the cube


我想要做的就是绘制全立体的第一件事 - 不进行裁剪。我尝试了近/远平面值的不同组合,但找不到可接受的解决方案。 我的最终目标是进行透视投影。但是,正如你所看到的,我甚至无法得到一个好的现场视角。

+1

嗨,这里有一些提示。确保变换矩阵按照正确的顺序相乘。对此我的意思是顶点应该先乘以世界矩阵,结果应该乘以视图矩阵等。这可以通过修改HLSL代码来轻松测试。此外,请尝试再次使用正交投影,并将近/远平原设置为0.000001f/10000.0f。你可以检查的最后一件事情是,如果你正在使用三角形基元作为多维数据集,或者你正在将多维数据集建模为三角形条。在这种情况下,您需要使用三角形或三角形条来渲染它。 – brano 2012-02-02 15:18:17

+0

你好,目前的订单是世界,视图,投影。我甚至将倍增分开,没有任何变化(如我所料)。另外,改变近平面和远平面不会影响结果。只有在0到0.45的范围内发生了更多的削波(超过第二幅图像)。拓扑结构是TriangleList。 – Lucius 2012-02-02 16:54:35

+0

你可以发布立方体的坐标吗? – brano 2012-02-03 08:32:50

回答

0

矩阵必须在某个点转置。

原因是:

Microsoft.Xna.Framework.Matrix结构的布局是基于行。 HLSL中的矩阵是以列为基础的

XNA Documentation

矩阵使用XNA Framework提供的行向量布局。

Wikipedia article on matrix order

列主顺序是相似的平坦化阵列上 线性存储器的方法,但是这些列中顺序列出。着色语言 GLSL和HLSL使用列主要排序。


溶液A:

移调所有矩阵它们被发送到着色器之前:

var projection = Matrix.CreatePerspectiveFieldOfView(1, 1, 0.1f, 100); 
projection = Matrix.Transpose(projection); 

溶液B:

将此行放入着色器代码中:

#pragma pack_matrix(row_major)