我目前正在尝试在 DirectX 10 中显示 2D 精灵的各种方法。我首先使用该ID3DX10Sprite
界面在一次调用中批量绘制我的精灵。然而,最终,我想要更多地控制我的精灵是如何渲染的,所以我决定研究基于四边形的精灵渲染(即每个精灵都由一个应用了纹理的四边形表示)。
我一开始很简单:我创建了一个由 4 个顶点组成的单个顶点缓冲区,在绘制精灵之前应用了一次。然后我循环遍历我的精灵,设置适当的属性以传递给着色器,并为每个精灵进行绘制调用,如下所示d3dDevice->Draw( 4, 0);
:虽然它有效,但每个精灵的绘制调用都困扰着我,所以我寻找了一种更有效的方法。
在搜索之后,我了解了对象实例化,并决定尝试一下。一切都很顺利,直到我尝试实现精灵最重要的部分——纹理。简而言之,虽然我有一个纹理数组(在我的着色器顶部声明Texture2D textures[10];
),可以使用文字/常量作为索引在我的像素着色器中成功采样,但我无法弄清楚如何控制哪些纹理应用于哪个通过纹理索引的实例。
我的想法是为每个实例传递一个纹理索引,然后可以使用该索引对像素着色器中数组中的适当纹理进行采样。但是,在进行了更多搜索之后,我找不到如何完成它的示例(并且发现很多事情表明如果不迁移到 DirectX 11 就无法完成)。
这是否是说在 DirectX 10 中通过对象实例化成功渲染精灵的唯一方法是基于纹理批量渲染它们?因此,例如,如果我的场景由 100 个具有 20 个不同纹理的精灵组成(每个纹理由 5 个精灵引用),那么将需要 20 次单独的绘制调用来显示场景,而我一次只发送 5 个精灵。
最后,我比较茫然。我做了很多搜索,似乎得到了相互矛盾的信息。例如,在这篇文章的第 6 段中,它指出:
使用 DirectX 10,可以将数组中的不同纹理应用于同一对象的不同实例,从而使它们看起来不同
此外,在本白皮书的第 3 页,它提到了以下选项:
从纹理数组中读取每个实例的自定义纹理
但是,我似乎找不到一个具体的例子来说明如何设置着色器以使用每个实例的纹理索引来访问纹理数组。
最后,中心问题是:使用 DirectX 10 渲染精灵最有效的方法是什么?
如果答案是实例化,那么是否可以控制将哪个纹理应用于着色器中的每个特定实例 - 从而只需一个绘图调用就可以发送更大批量的精灵及其适当的纹理索引?还是我必须满足于一次只实例化具有相同纹理的精灵?
如果答案是返回到使用提供的 DX10 Sprite 界面,那么我有没有办法更好地控制它的渲染方式?
作为旁注,我还研究了使用几何着色器来创建实际的四边形,所以我只需要传递一系列点而不是管理顶点和实例缓冲区。尽管如此,除非有一种方法可以控制将哪些纹理应用于生成的四边形,否则我将回到仅通过纹理对精灵进行批处理。