0

我有一个由两个四边形组成的矩形(8个顶点,我使用索引三角形):

------+------
| \   | \   |
|  \  |  \  |
|   \ |   \ |
______+______

我也有两个纹理。我将它们都绑定到着色器。

我想用第一个纹理纹理矩形(左四边形)的一部分,用第二个纹理纹理另一部分。

但是当我根据顶点在像素着色器中的位置选择纹理时,我对标有“+”的顶点有疑问。有一次我正在分析第一个四边形的“+”顶点,但具有相同位置的顶点也在第二个四边形中(并且必须有第二个纹理)。所以按位置设置贴图会报错。

如何确定要分配的纹理(在采样器中)?我不想进行第二次传递或向着色器添加其他信息(如果有任何选项可以在没有它的情况下进行)。

基本上说:我有模型和优势。该边缘告诉纹理变化的位置。但是如何实现这个目标呢?当我在该边缘的顶点上设置纹理 1 或纹理 2 时,会出现一些错误。

4

1 回答 1

1

我认为你的方法是错误的。着色器中的条件分支会减慢着色器的速度,应尽可能避免。原因是着色器经过优化,可以为每个像素并行执行相同的代码。如果根据图形卡实现在着色器中放置条件,则会发生以下情况之一:着色器将执行条件的两个分支并在执行后为每个像素选择适当的路径,或者让所有像素等到最长的路径在继续之前,条件已完成执行。

在您的情况下,您正在尝试使用两种纹理绘制一个图元。当以这种方式定义时,这实际上是不可能的。换个概念就能轻松达到你想要的效果:

我可以想到两种可能的方法(可能还有更多):

  1. 第一个也是最简单的方法是绘制两个四边形,每个四边形都有自己的纹理。确实,您将调用着色器两次,但我几乎看不到任何真正的减速,因为无论如何都会绘制确切数量的像素。
  2. 第二种方法稍微复杂一些,但可以让你只画一次。您需要做的是创建一个大纹理,其中包含两个纹理并排放置,并将整个纹理映射到整个三角形条带。这样,渲染器将为您确保每个四边形都有其“自己的”纹理。使用 OpenGL,这是使用glTexSubimage2D. 在direct3d 9中它更复杂,您使用以下顺序:
    A.使用B创建纹理CreateTexture
    。使用C获取级别0IDirect3DTexture9::GetSurfaceLevel()
    的表面。使用D将图像加载到表面中D3DXLoadSurfaceFromMemory()
    。释放表面

因此,您将水平纹理坐标从 0 到 0.5 映射到第一个四边形的顶点,并将从 0.5 到 1 的坐标映射到第二个四边形的顶点。如果四边形大小不同或纹理大小不同,您只需相应地更改映射

如果您坚持在着色器中使用条件分支,您应该记住您所说的是一列像素,而不仅仅是两个顶点(毕竟这是一个像素着色器),因此您应该检查所有像素。这可能是个问题,因为除非没有变换,否则您无法知道每个像素的变换结果。最好不要在像素着色器中查询顶点值。

希望这能让你走上正确的轨道

于 2012-11-23T15:48:49.320 回答