我有一个包含两个正方形的矩形(8个顶点,我使用索引三角形):

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


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

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

但是,当我根据像素着色器中顶点的位置选择纹理时,用“ +”标记的顶点会出现问题。一次我正在分析来自第一个四边形的“ +”顶点,但是具有相同位置的顶点也位于第二个四边形中(并且必须在其上具有第二个纹理)。因此,根据位置设置纹理会导致错误。

如何确定要分配的纹理(在采样器中)?我不想再次通过或向着色器添加其他信息(如果有任何选择,可以不添加着色器)。

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

最佳答案

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

在您的情况下,您尝试绘制具有两个纹理的图元。以这种方式定义时,这实际上是不可能的。如果您更改概念,则可以轻松实现所需的效果:

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


第一个也是最简单的方法是o绘制两个具有各自纹理的四边形。的确,您会两次调用着色器,但由于绘制了确切的像素数,因此我几乎看不到任何真正的减慢。
第二种方法稍微复杂一些,但是只允许绘制一次。您需要做的是创建一个包含两个纹理的大纹理,一个与另一个相邻,然后将整个纹理映射到整个三角形带。这样,渲染器将为您确保每个四边形都具有其“自己的”纹理。使用OpenGl可以使用glTexSubimage2D完成。在direct3d 9中,它更加复杂,您可以使用以下顺序:
A.使用CreateTexture创建纹理
B.使用IDirect3DTexture9::GetSurfaceLevel()获取0级表面
C.使用D3DXLoadSurfaceFromMemory()将图像加载到表面
D.释放表面


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

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

希望这能使您走上正确的道路

关于c++ - 一个具有两个纹理的矩形(两个相连的四边形)-共同边界错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13507296/

10-16 02:42