如何将纹理无缝地映射到瓷砖网格上?

时间:2011-04-20 23:12:24

标签: opengl mapping textures

我有一个8 X 8点的网格,并希望在其上叠加图像。我将6 X 6的内部网格划分为4个相等的子部分,每个部分大小为3 X 3。我们将这个子部分称为tile。我们的想法是渲染这些瓷砖及其相应的纹理。我将网格划分为瓷砖,因为将来我想在更大的网格上测试它。 我使用以下方法完成了它,但我沿着边缘接缝。我无法弄清楚接缝出现的原因。

首先,瓷砖具有相应的起始坐标为{(0,0),(0,3),(3,0),(3,3)}。

我有一个8 X 8大小的图像,我想在super_grid上叠加,并将其rgba值存储在某些super_data(8 X 8)中。

渲染瓷砖时,我将它们绘制为四边形,然后在其上覆盖相应的纹理。因此,如果(a,b)是特定磁贴的起始坐标,那么我初始化 四边形顶点= {(a-0.5,b-0.5),(a + 3-0.5,b-0.5),(a + 3-0.5,b + 3-0.5),(a-0.5,b + 3-0.5) )} 如果xs = 1 /(tileWidth + 1)= 1 /(3 + 1)= 1/4且ys = 1 /(tileHeight + 1)= 1/4,则 纹理坐标为{(xs / 2,ys / 2),(1-xs / 2,ys / 2),(1-xs / 2,1-ys / 2),(xs / 2,1-ys / 2) )}

所以,对于第一个图块,

quadVertices={(-0.5,-0.5),(3.5,-0.5),(3.5,3.5),(-0.5,3.5)}
textureCoords={(1/8,1/8),(1-1/8,1/8),(1-1/8,1-1/8),(1/8,1-1/8)}.

之前,传递tile的纹理我初始化纹理:int image = new int [tileWidth + 2] [tileHeight + 2]使用super_data。我们采用这些尺寸是因为瓷砖纹理的某些部分与相邻的瓷砖重叠(这就是为什么我们在计算quadVertices时考虑这个部分的原因)。

最后,要生成纹理,请使用

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tileWidth + 2, tileHeight + 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

上面的一切工作正常,我得到一个图像叠加在其上的网格。但是,我在边缘接缝。我怎样才能摆脱接缝?

3 个答案:

答案 0 :(得分:1)

你有多边形平滑吗?尝试将其关闭:

glDisable(GL_POLYGON_SMOOTH)

答案 1 :(得分:1)

尝试使用GL_CLAMP_TO_EDGE代替GL_CLAMP

答案 2 :(得分:0)

您需要确保相同位置(或相邻)的顶点使用精确的纹理坐标。根据世界坐标进行计算,正如您所看到的那样,应该能够处理它。

问题的第二部分是纹理本身。放置时,请确保纹理正确平铺。重叠瓷砖会变得更加困难;通常你只是确保边缘匹配正确。