Support paletted rendering in WebGL

This commit is contained in:
Tim Schaub
2021-12-20 18:25:49 -07:00
parent 0c11a7514d
commit 59186f2afd
6 changed files with 221 additions and 10 deletions

View File

@@ -114,6 +114,7 @@ function getRenderExtent(frameState, extent) {
* @property {string} fragmentShader Fragment shader source.
* @property {Object<string, import("../../webgl/Helper").UniformValue>} [uniforms] Additional uniforms
* made available to shaders.
* @property {Array<import("../../webgl/PaletteTexture.js").default>} [paletteTextures] Palette textures.
* @property {number} [cacheSize=512] The texture cache size.
*/
@@ -211,6 +212,12 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
* @private
*/
this.tileTextureCache_ = new LRUCache(cacheSize);
/**
* @type {Array<import("../../webgl/PaletteTexture.js").default>}
* @private
*/
this.paletteTextures_ = options.paletteTextures || [];
}
/**
@@ -222,6 +229,7 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
});
this.vertexShader_ = options.vertexShader;
this.fragmentShader_ = options.fragmentShader;
this.paletteTextures_ = options.paletteTextures || [];
if (this.helper) {
this.program_ = this.helper.getProgram(
@@ -510,19 +518,33 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
this.helper.bindBuffer(this.indices_);
this.helper.enableAttributes(attributeDescriptions);
for (
let textureIndex = 0;
textureIndex < tileTexture.textures.length;
++textureIndex
) {
const textureProperty = 'TEXTURE' + textureIndex;
const uniformName = `${Uniforms.TILE_TEXTURE_ARRAY}[${textureIndex}]`;
let textureSlot = 0;
while (textureSlot < tileTexture.textures.length) {
const textureProperty = 'TEXTURE' + textureSlot;
const uniformName = `${Uniforms.TILE_TEXTURE_ARRAY}[${textureSlot}]`;
gl.activeTexture(gl[textureProperty]);
gl.bindTexture(gl.TEXTURE_2D, tileTexture.textures[textureIndex]);
gl.bindTexture(gl.TEXTURE_2D, tileTexture.textures[textureSlot]);
gl.uniform1i(
this.helper.getUniformLocation(uniformName),
textureIndex
textureSlot
);
++textureSlot;
}
for (
let paletteIndex = 0;
paletteIndex < this.paletteTextures_.length;
++paletteIndex
) {
const paletteTexture = this.paletteTextures_[paletteIndex];
gl.activeTexture(gl['TEXTURE' + textureSlot]);
const texture = paletteTexture.getTexture(gl);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.uniform1i(
this.helper.getUniformLocation(paletteTexture.name),
textureSlot
);
++textureSlot;
}
const alpha =