cocos2dx - label字符纹理

问题:

向FontAtlas提交纹理数据时,第三个参数是CacheTextureWidth,而这个值是512,也就是说每次是以行为单位进行纹理数据提交的,为什么呢?

_atlasTextures[_currentPage]->updateWithData(data, 0, startY, CacheTextureWidth, _currentPageOrigY - startY + _currLineHeight);

原因:

是因为纹理字节对齐,在Texture2D生成的时候,会自动计算字节对齐:

        unsigned int bytesPerRow = pixelsWide * info.bpp / 8;
        if(bytesPerRow % 8 == 0)
        {
            glPixelStorei(GL_UNPACK_ALIGNMENT, 8);
        }
        else if(bytesPerRow % 4 == 0)
        {
            glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
        }
        else if(bytesPerRow % 2 == 0)
        {
            glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
        }
        else
        {
            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        }

宽度为512的纹理字节对齐为8,那么对应的这个纹理单元的对齐也是8,之后如果要更新纹理数据,也需要注意width,否则在存储纹理的时候就会出现倾斜的问题,所以engine选择以行为单位进行纹理提交,就避免了这个问题。

如果要修改CacheTextureWidth,需要注意alignment即可。

解决这个问题还有其他思路,比如提交的纹理数据自动补齐,满足alignment的要求即可。

相关资料

在OpenGL规范里面,也有这个说明:

glPixelStorei sets pixel storage modes that affect the operation of subsequent glReadPixelsas well as the unpacking of texture patterns (see glTexImage2D, glTexImage3D, glTexSubImage2D, glTexSubImage3D).

GL_UNPACK_ALIGNMENT

Specifies the alignment requirements for the start of each pixel row in memory. The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries).

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容