【问题标题】:How are vertex shader and pixel shader related?顶点着色器和像素着色器有什么关系?
【发布时间】:2019-10-15 12:48:27
【问题描述】:

我知道这已经被问了一百万次了,但我就是不知道一些细节。

例如,假设我创建了一个交换链和一个 staging ID3D11Texture2D

我可以用它做的是将位图加载到这个 2D 纹理中,然后将其复制到渲染目标(假设两个资源的大小和格式相同)。

现在我想在上面显示一个精灵。一种解决方案是使用顶点和像素着色器。我的理解问题从这里开始。

顶点着色器:
我想我应该画 2 个三角形(2 个三角形组成一个矩形或一个四边形)。 DirectX 使用的是左手坐标系,但我想这在这里无关紧要,因为我正在处理 2D 精灵,对吧? 出于同样的原因,我假设我可以忽略 world->view->projection 转换,对吧?其实我这里只需要翻译就可以把精灵放在屏幕上的正确位置,对吧?

这两个三角形的坐标是否应该与精灵尺寸以及平移相匹配? 我应该按什么顺序提供这些顶点?坐标系的原点应该在精灵的中心,还是应该在精灵的左上角?

例如,如果我有 80x70 的精灵,那么顶点值是多少?

真实顶点:(X、Y、Z - 未应用平移)

1. -40, -35, 0
2. -40,  35, 0
3.  40, -35, 0
4.  40,  35, 0
5. -40,  35, 0
6.  40, -35, 0

对吗?

光栅化步骤应该为精灵中的每个像素调用一次像素着色器。顶点着色器的输出将作为像素着色器的输入。这是否意味着像素着色器应该有权访问精灵以便在调用时返回正确的像素值?

【问题讨论】:

  • 复制到渲染目标并不是特别快。您可以绘制一个带纹理的“全屏四边形”,它实际上比硬件剪裁的“大三角形”更快。见FullScreenQuad
  • 你能定义“不是特别快”吗? FullScreenQuad 使用的是 DirectX 12。我不熟悉它,它相当复杂。
  • 进一步查看文件...它使用 DX12 或 DX11。

标签: directx-11 vertex-shader pixel-shader


【解决方案1】:

对于 2D 绘图,您通常使用将经典“像素空间”转换为剪辑空间 (-1..1) 的世界->视图->投影。

float xScale = 2.0f / ViewPortWidth;
float yScale = 2.0f / ViewPortHeight;

[ xScale, 0        0, 0, ]
[ 0,      -yScale, 0, 0, ]
[ 0,      0,       1, 0, ]
[ -1,     1,       0, 1  ]

-1 和 -yScale 值被取反,因此 0,0 位于左上角。

顶点着色器会对剪辑空间进行转换:

void SpriteVertexShader(inout float4 color    : COLOR0,
                        inout float2 texCoord : TEXCOORD0,
                        inout float4 position : SV_Position)
{
    position = mul(position, MatrixTransform);
}

然后对四边形的点进行光栅化,然后调用像素着色器:

Texture2D<float4> Texture : register(t0);
sampler TextureSampler : register(s0);

float4 SpritePixelShader(float4 color    : COLOR0,
                         float2 texCoord : TEXCOORD0) : SV_Target0
{
    return Texture.Sample(TextureSampler, texCoord) * color;
}

DirectX Tool Kit 中查看SpriteBatch

【讨论】:

  • 我确实看过 DirectX Tool Kit,但它对于学习来说太复杂了。我需要谨慎的解释。你的回答给了我足够的信息来进一步挖掘。谢谢。
  • 请提供一个细节... 上面矩阵中的最后一行以 -1, 1 开头。将像素空间映射到剪辑空间 [-1, 1]?
  • 这会将视口范围向上和向左移动。请记住,剪辑空间是 -1,-1 到 1,1,其中 0,0 在视口的中间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多