我正在使用一个纹理地图集,我有一个由拼接两个相同大小的图像并排。当我修改纹理协调时,我按照以下顺序进行操作:
if(texCoordx>1) texCoordx = texCoordx % 1
-因此一种纹理不会泄漏到another.if(texCoordx<0) texCoordx = 1 + texCoordx
中,因此一种纹理不会泄漏到另一种纹理中。但是,我似乎在纹理的协调方法1和0的边缘得到了“污点”。它看起来像是沿着t轴被弄脏了。我附了一张截图。
我知道有一个答案找到了here,但它只稍微缩小了污点。我使用我自己的着色器,但它没有做任何修改纹理协调。我还启用了GL_REPEAT
。有没有人知道可能的原因/解决方案?
发布于 2011-08-04 17:46:42
如果我正确地解释了你的图片,这个纹理是地图集中的两个纹理之一(假设左边),而原始的texCoords (从左到右)是类似的
0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2
在步骤1中完成您自己的包装之后,您现在得到了以下内容
0.2, 0.4, 0.6, 0.8, 1, 0.2, 0.4, 0.6, 0.8, 1
,后来变成了
0.1, 0.2, 0.3, 0.4, 0.5, 0.1, 0.2, 0.3, 0.4, 0.5
这里我们看到的问题在0.5,0.1,其中单调性变化。OpenGL不知道你想向左转0.5到0.1。它只取-0.4的差值,从而从右到左向后插入到纹理的开头(因此,在这个小区间内向后发出吱吱声,所以沿着t轴,它实际上是正确的)。这是因为,OpenGL不知道您的纹理包装在纹理的中间,因为它在概念上只看到一个大纹理,而不是一个小纹理图集,而GL_REPEAT
包装模式只在大纹理的边缘工作。
在访问纹理之前,您必须在片段着色器中完成包装(前两个步骤)。因此,您的纹理坐标都是单调的,并且得到了正确的插值。然后,在片段中,您可以安全地包装纹理坐标。实际上,您可以在片段着色器中完成所有步骤。只要给它一个均匀的偏移内的地图集(选择实际的子纹理)。然后在访问纹理之前进行包装、缩放和添加偏移量。
https://stackoverflow.com/questions/6945655
复制相似问题