Установить pixelFormat для текстуры в webgl - PullRequest
0 голосов
/ 26 сентября 2018

версия 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;
}

Но похоже, что использование памяти для загруженной текстурывсе еще не уменьшилось.

Мне интересно, возможно ли получить среду pixelFormat for browser (webgl).

Любой совет будет признателен, спасибо:)

...