1

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

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

4

2 回答 2

1

首先是顶点着色器,然后是剪辑(有关完整的 D3D10 管道,请参见http://download.microsoft.com/download/f/2/d/f2d5ee2c-b7ba-4cd0-9686-b6508b5479a1/direct3d10_web.pdf )

所以你基本上在你的顶点着色器项目中将所有顶点都放在屏幕上,然后将它们在屏幕空间中缩放 0.5。因此,修改后的顶点随后被剪裁,导致整个屏幕充满几何图形。我想您预计会看到一半屏幕填充和一半屏幕空白?

于 2011-11-14T15:17:12.100 回答
1

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

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

Depth (or Occlusion) culling, which is most likely what you mean by "culling", is performed just before the pixel shader, once the depth of the pixel has been interpolated.

于 2011-11-27T10:21:15.573 回答