Support paletted rendering in WebGL
This commit is contained in:
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user