C++ 为什么这个OpenGL es纹理绑定到CoCoS2D2.0中的山丘上?

C++ 为什么这个OpenGL es纹理绑定到CoCoS2D2.0中的山丘上?,c++,objective-c,opengl-es,cocos2d-iphone,C++,Objective C,Opengl Es,Cocos2d Iphone,这个问题与 在阅读了上面帖子中的答案后,我使用了以下代码来计算顶点和纹理坐标: 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 =

这个问题与

在阅读了上面帖子中的答案后,我使用了以下代码来计算顶点和纹理坐标:

    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;
(CGPoint) 0x34b0b28 = (x=1.00390625, y=0)
(CGPoint) 0x34b0b30 = (x=0.005859375, y=1)

最可能的原因是在非连续纹理坐标中。 在texcoords转储中,您具有以下坐标:

    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;
(CGPoint) 0x34b0b28 = (x=1.00390625, y=0)
(CGPoint) 0x34b0b30 = (x=0.005859375, y=1)
这意味着在这两点之间,纹理以相反方向从1映射到0。在1.00390625=>1.005859375=>。。。此外,您的纹理必须具有两个大小的能力,并且必须设置为重复模式

如果纹理位于atlas中,并且无法设置重复模式,则可以尝试将texcoords钳制到[0;1]范围,并将x=1和x=0的两个边点放置在同一位置


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

ES 2.0支持两个纹理的非幂次,只要未启用mipmapping。许多实现还对完全NPOT支持进行了必要的扩展。Reto Koradi,仅对GL_CLAMP_TO_EDGE wrapping mode提供了NPOT纹理支持。好的,我忘记了NPOT纹理的wrap mode限制。我假设大多数现代GPU在本地支持NPOT纹理。但是ES2.0规范的编写可能是为了让那些不这样做的人的生活更轻松。ES 3.0解除了对NPOT纹理的这些限制。