这个问题与Repeating OpenGL-es texture bound to hills in cocos2d 2.0有关
在阅读了上面帖子中的答案后,我使用了以下代码来计算顶点和纹理坐标:
CGPoint pt0,pt1;
float ymid = (p0.y + p1.y) / 2;
float ampl = (p0.y - p1.y) / 2;
pt0 = p0;
float U_Off = floor(pt0.x / 512);
for (int j=1; j<_segments+1; j++)
{
pt1.x = p0.x + j*_dx;
pt1.y = ymid + ampl * cosf(_da*j);
float xTex0 = pt0.x/512 - U_Off;
_vertices[vertices++]=CGPointMake(pt0.x, 0);
_vertices[vertices++]=CGPointMake(pt0.x, pt0.y);
_texCoords[texCoords++]=CGPointMake(xTex0, 1.0f);
_texCoords[texCoords++]=CGPointMake(xTex0, 0);
pt0 = pt1;
}
p0 = p1;
但不幸的是,我的纹理仍然出现撕裂/错位(黄色圆圈):
我附上了 vertices 数组的转储和 texcoords 我是 OpenGl 的新手,不知道哪里算错了。如何防止线条(图中黄色圆圈)出现?
编辑:我的纹理是 1024x512 或 512x512,具体取决于设备。我使用以下纹理参数:
ccTexParams tp2 = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_CLAMP_TO_EDGE};
最佳答案
最有可能的原因是在不连续的纹理坐标中。 在 texcoords 转储中,您具有以下坐标:
(CGPoint) 0x34b0b28 = (x=1.00390625, y=0)
(CGPoint) 0x34b0b30 = (x=0.005859375, y=1)
这意味着在这两点之间,纹理从 1 映射到 0(反向)。你应该在 1.00390625 => 1.005859375 => 之后继续 texcoords => ... 此外,你的纹理必须具有二次方大小并且必须设置为重复模式。
如果你的贴图在图集中,你不能设置REPEAT模式,你可以尝试将texcoords钳位到[0; 1] 将 x=1
和 x=0
的两个边缘点放在同一位置。
最后,如果您的纹理在 x 轴上没有变化,您可以为所有点设置 x = 0.5
。
关于c++ - 为什么这个 OpenGL-es 纹理绑定(bind)到 cocos2d 2.0 中的山丘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630726/