cocos2dx的图片载入
這里先介紹下圖片解碼到載入再到顯示的流程。以后再具體地介紹每種格式圖片的解碼。
Texture2D * TextureCache::addImage(const std::string &path) {...//新建一個Image對象image = new (std::nothrow) Image();CC_BREAK_IF(nullptr == image);//圖片解碼bool bRet = image->initWithImageFile(fullpath);CC_BREAK_IF(!bRet);//新建一個2D的紋理texture = new (std::nothrow) Texture2D();//開始初始化紋理if( texture && texture->initWithImage(image) ){...} }//使用指定像素格式來初始化(默認是auto,依據圖片解碼的結果來確定) bool Texture2D::initWithImage(Image *image, PixelFormat format) {...//獲取當前的OpenGL環境Configuration *conf = Configuration::getInstance();//推斷紋理大小是否超出限制int maxTextureSize = conf->getMaxTextureSize();...//獲取mipmap貼圖的數量if (image->getNumberOfMipmaps() > 1){CCLOG("cocos2d: WARNING: This image has more than 1 mipmaps and we will not convert the data format");//載入mipmap貼圖initWithMipmaps(image->getMipmaps(), image->getNumberOfMipmaps(), image->getRenderFormat(), imageWidth, imageHeight);return true;}else if (image->isCompressed()){...initWithData(...)...return true;}else{...initWithData(...)...return true;} }bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, PixelFormat pixelFormat, int pixelsWide, int pixelsHigh) {...//設置像素的行字節對齊,在一定平臺下有性能的提高。并且若不加注意,會導致glTexImage中系函數的讀取越界//Set the row align only when mipmapsNum == 1 and the data is uncompressedif (mipmapsNum == 1 && !info.compressed){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);}}else{glPixelStorei(GL_UNPACK_ALIGNMENT, 1);}...//生成紋理索引glGenTextures(1, &_name);//bindTexture2函數中會調用glActiveTexture,glBindTexture來制定紋理單位和綁定紋理GL::bindTexture2D(_name);//依據mipmap貼圖數和是否設置抗鋸齒來選擇紋理濾波方式,關于紋理濾波的選擇后面會具體的再分析下if (mipmapsNum == 1){glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR : GL_NEAREST);}else{glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST);}glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _antialiasEnabled ?GL_LINEAR : GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); for (int i = 0; i < mipmapsNum; ++i) { unsigned char *data = mipmaps[i].address; GLsizei datalen = mipmaps[i].len; //紋理映射一個指定的紋理圖像的一部分到每一個開啟了紋理映射的圖元上。在當前段著色器或頂點著色器使用內建紋理搜索函數時。貼圖被啟用。
if (info.compressed) { //壓縮格式生成紋理 glCompressedTexImage2D(GL_TEXTURE_2D, i, info.internalFormat, (GLsizei)width, (GLsizei)height, 0, datalen, data); } else { //生成2D紋理 glTexImage2D(GL_TEXTURE_2D, i, info.internalFormat, (GLsizei)width, (GLsizei)height, 0, info.format, info.type, data); } if (i > 0 && (width != height || ccNextPOT(width) != width )) { CCLOG("cocos2d: Texture2D. WARNING. Mipmap level %u is not squared. Texture won't render correctly. width=%d != height=%d", i, width, height); } GLenum err = glGetError(); if (err != GL_NO_ERROR) { CCLOG("cocos2d: Texture2D: Error uploading compressed texture level: %u . glError: 0x%04X", i, err); return false; } //四分之中的一個大小的mipmap width = MAX(width >> 1, 1); height = MAX(height >> 1, 1); } _contentSize = Size((float)pixelsWide, (float)pixelsHigh); _pixelsWide = pixelsWide; _pixelsHigh = pixelsHigh; _pixelFormat = pixelFormat; _maxS = 1; _maxT = 1; //關閉alpha漸變 _hasPremultipliedAlpha = false; _hasMipmaps = mipmapsNum > 1; // shader setGLProgram(GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE)); }
對于非mipmaps的貼圖直接指定為已mipmapsNum為1的形式進行初始化就可以,紋理紋理渲染完畢就可以增加到顯示隊列,當然這里僅僅是先簡介下,關于渲染流程等我寫完圖片的解碼部分再回來補充~
未完待續…
轉載于:https://www.cnblogs.com/yxwkf/p/5375296.html
總結
以上是生活随笔為你收集整理的cocos2dx的图片载入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Timus 1204 Idempoten
- 下一篇: IOS横竖屏控制与事件处理