c++ - 为什么这个 OpenGL-es 纹理绑定(bind)到 cocos2d 2.0 中的山丘?

标签 c++ objective-c opengl-es cocos2d-iphone

这个问题与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;

但不幸的是,我的纹理仍然出现撕裂/错位(黄色圆圈):

Screenshot

我附上了 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=1x=0 的两个边缘点放在同一位置。

最后,如果您的纹理在 x 轴上没有变化,您可以为所有点设置 x = 0.5

关于c++ - 为什么这个 OpenGL-es 纹理绑定(bind)到 cocos2d 2.0 中的山丘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630726/

相关文章:

c++ - 在 While 循环中检查文件的状态

c++ - 在数组中搜索还是切换?对于通过替换的密码

ios - 如何使用约束使我们的 Freedom View Controller 可滚动?

iphone - NSArray removeObjectAtIndex 错误

opengl-es - 将 3d .obj 文件渲染为 .png 图像

c - DisplayContext、displaySurface 和 displayBuffer 之间的区别?

工厂函数返回元组的 C++11 模式

c++ - 未检测到温度文件的变化

ios - 根据派生值对 NSArray 进行排序……有问题吗?

java - 使用矩阵旋转立方体给出错误的结果