我认为答案应该是之前的。但我有一个着色器似乎与此相矛盾:
float4 vp(
// Vertex Inputs
in float4 position : POSITION,
uniform float4x4 worldViewProj) : TEXCOORD6
{
float4 p = mul(worldViewProj, position);
p.y /= 2.0;
return p;
}
worldViewProj
是将世界位置转换为屏幕坐标的组合矩阵。我预计这个顶点着色器会将输出压缩到渲染目标的上半部分,实际上确实会这样做 - 但是视图的下半部分会填充更多通常不在视野中的几何体。
这仅仅是因为GPU的剔除非常粗糙吗?
答案 0 :(得分:1)
首先是Vertex Shader,然后是剪辑(请参阅http://download.microsoft.com/download/f/2/d/f2d5ee2c-b7ba-4cd0-9686-b6508b5479a1/direct3d10_web.pdf获取完整的D3D10管道)
因此,您基本上在Vertex Shader项目中将所有顶点投影到屏幕,然后在屏幕空间中将它们缩放0.5。然后修剪修改的顶点,导致整个屏幕填充几何体。我想你会看到半个屏幕被填满,半个屏幕空白?
答案 1 :(得分:1)
在顶点阶段之后发生剔除。
顶点着色器是实际创建几何体的阶段。在此之前,几何体仅作为顶点着色器作为输入的任意数据存在。一旦顶点着色器生成了顶点,那么它可能会经历平截头体和面部剔除(背面或前面)。因为在顶点阶段之前发生了剔除,所以没有做到,因为在此之前它们不是实际几何体(它是管道中的第一阶段之一)。
深度(或遮挡)剔除(最有可能是“剔除”)是在像素着色器之前执行的,一旦插入了像素的深度。