【发布时间】: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