是否在剪切之前或之后调用顶点着色器?

时间:2011-11-14 15:03:32

标签: 3d shader vertex-shader

我认为答案应该是之前的。但我有一个着色器似乎与此相矛盾:

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的剔除非常粗糙吗?

2 个答案:

答案 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)

在顶点阶段之后发生剔除。

顶点着色器是实际创建几何体的阶段。在此之前,几何体仅作为顶点着色器作为输入的任意数据存在。一旦顶点着色器生成了顶点,那么它可能会经历平截头体和面部剔除(背面或前面)。因为在顶点阶段之前发生了剔除,所以没有做到,因为在此之前它们不是实际几何体(它是管道中的第一阶段之一)。

深度(或遮挡)剔除(最有可能是“剔除”)是在像素着色器之前执行的,一旦插入了像素的深度。