为webgl中的纹理设置pixelFormat

时间:2018-09-26 09:17:55

标签: webgl cocos2d-x cocos2d-js

cocos版本:cocos2d-js v3.16

环境:仅HTML5,仅WEBGL(无需本机)

在本机环境中,可以像这样设置加载纹理的像素格式:

cc.Texture2D.setDefaultAlphaPixelFormat(cc.Texture2D.PIXEL_FORMAT_RGBA4444);

这将减少加载的纹理的内存使用量,但是此API仅在本机环境中。

在webgl环境中,纹理像这样在TexturesWebGL.js中加载:

handleLoadedTexture: function (premultiplied) {
    // ...
    var gl = cc._renderContext;
    cc.glBindTexture2D(self);
    gl.pixelStorei(gl.UNPACK_ALIGNMENT, 4);
    if (premultiplied)
        gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, self._htmlElementObj);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    self.shaderProgram = cc.shaderCache.programForKey(cc.SHADER_POSITION_TEXTURE);
    cc.glBindTexture2D(null);
    if (premultiplied)
        gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);
    var pixelsWide = self._htmlElementObj.width;
    var pixelsHigh = self._htmlElementObj.height;
    self._pixelsWide = self._contentSize.width = pixelsWide;
    self._pixelsHigh = self._contentSize.height = pixelsHigh;
    self._pixelFormat = cc.Texture2D.PIXEL_FORMAT_RGBA8888;
    self.maxS = 1;
    self.maxT = 1;
    self._hasPremultipliedAlpha = premultiplied;
    self._hasMipmaps = false;
    if (window.ENABLE_IMAEG_POOL) {
        self._htmlElementObj = null;
    }
    self.dispatchEvent("load");
}

我搜索了gl.texImage2D函数并找到了其他一些标志,所以我尝试了:

handleLoadedTexture: function (premultiplied) {
    // ...
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA4, gl.RGBA4, gl.UNSIGNED_BYTE, self._htmlElementObj);
    // ....
    self._pixelFormat = cc.Texture2D.PIXEL_FORMAT_RGBA4444;
}

但是似乎加载的纹理的内存使用量仍然没有减少。

我想知道是否有可能为浏览器(webgl)环境获取pixelFormat。

任何建议将不胜感激,谢谢:)

0 个答案:

没有答案