Start · Sprachen · JavaScript · Referenz · WebGLRenderingContext.getTexParameter()

WebGLRenderingContext.getTexParameter()

Methode

Liest einen Parameter der Textur, die gerade an <code>target</code> gebunden ist, z. B. den Filter- oder Wrap-Modus.

seit JavaScript WebGL 1.0 – Baseline: alle modernen Browser Kategorie: webapi

Signatur

WebGLRenderingContext.prototype.getTexParameter(target, pname)

Beschreibung

getTexParameter() ist das Gegenstück zu texParameteri() und texParameterf() und liefert den aktuellen Wert eines Textur-Parameters. Die Methode bekommt kein Texturobjekt übergeben. Sie liest aus der Textur, die im Moment an das Ziel gebunden ist (gl.TEXTURE_2D oder gl.TEXTURE_CUBE_MAP). Vorher muss also gl.bindTexture() aufgerufen worden sein.

Typische Einsatzfälle sind Debugging, automatisierte Tests, Werkzeuge zum Untersuchen von Szenen und generischer Code. Solcher Code prüft etwa, ob der TEXTURE_MIN_FILTER einer Textur Mipmaps verlangt, bevor generateMipmap() aufgerufen wird. Oder er prüft, ob eine NPOT-Textur (Seitenlängen keine Zweierpotenz) in WebGL 1 korrekt auf CLAMP_TO_EDGE steht.

Erlaubte Werte für pname in WebGL 1:

  • gl.TEXTURE_MAG_FILTER, gl.TEXTURE_MIN_FILTER, gl.TEXTURE_WRAP_S, gl.TEXTURE_WRAP_T, jeweils vom Typ GLenum (Zahl)
  • ext.TEXTURE_MAX_ANISOTROPY_EXT (GLfloat), nur mit der Erweiterung EXT_texture_filter_anisotropic

WebGL 2 (WebGL2RenderingContext) erlaubt zusätzlich TEXTURE_BASE_LEVEL, TEXTURE_MAX_LEVEL, TEXTURE_MIN_LOD, TEXTURE_MAX_LOD, TEXTURE_WRAP_R, TEXTURE_COMPARE_FUNC, TEXTURE_COMPARE_MODE, TEXTURE_IMMUTABLE_FORMAT (boolean) und TEXTURE_IMMUTABLE_LEVELS. Als Ziele kommen dort gl.TEXTURE_3D und gl.TEXTURE_2D_ARRAY hinzu.

Parameter

Name Typ Default Beschreibung
$target Pflicht GLenum (number) Bindungsziel der Textur: gl.TEXTURE_2D oder gl.TEXTURE_CUBE_MAP. In WebGL 2 zusätzlich gl.TEXTURE_3D und gl.TEXTURE_2D_ARRAY.
$pname Pflicht GLenum (number) Der abzufragende Parameter, z. B. gl.TEXTURE_MIN_FILTER, gl.TEXTURE_WRAP_S oder ext.TEXTURE_MAX_ANISOTROPY_EXT.

Rückgabewert

Typ
number | boolean | null
Beschreibung
Der Wert des Parameters. Für Filter-, Wrap- und Compare-Parameter ist das eine GLenum-Zahl, für LOD und Anisotropie ein GLfloat, für Level-Angaben ein GLint und für TEXTURE_IMMUTABLE_FORMAT ein boolean. Ist keine Textur gebunden oder sind die Argumente ungültig, kommt null zurück.

Beispiele

Filter-Modus einer Textur auslesen

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');

const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);

const minFilter = gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER);
console.log(minFilter === gl.LINEAR); // true
console.log(minFilter); // Zahlenwert der Konstante
true 9729

Mipmaps nur erzeugen, wenn der Filter sie braucht

const needsMipmaps = (gl, target) => {
  const f = gl.getTexParameter(target, gl.TEXTURE_MIN_FILTER);
  return [
    gl.NEAREST_MIPMAP_NEAREST, gl.LINEAR_MIPMAP_NEAREST,
    gl.NEAREST_MIPMAP_LINEAR, gl.LINEAR_MIPMAP_LINEAR
  ].includes(f);
};

const gl = document.createElement('canvas').getContext('webgl');
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);

// Standardwert des MIN_FILTER ist NEAREST_MIPMAP_LINEAR
if (needsMipmaps(gl, gl.TEXTURE_2D)) {
  gl.generateMipmap(gl.TEXTURE_2D);
  console.log('Mipmaps erzeugt');
}
Mipmaps erzeugt

NPOT-Textur und Anisotropie prüfen (Debug-Helfer)

const gl = document.createElement('canvas').getContext('webgl');
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);

const wrapNames = {
  [gl.REPEAT]: 'REPEAT',
  [gl.CLAMP_TO_EDGE]: 'CLAMP_TO_EDGE',
  [gl.MIRRORED_REPEAT]: 'MIRRORED_REPEAT'
};

const s = gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S);
const t = gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T);
console.log(`WRAP_S=${wrapNames[s]}, WRAP_T=${wrapNames[t]}`);

const ext = gl.getExtension('EXT_texture_filter_anisotropic');
if (ext) {
  console.log('Anisotropie:', gl.getTexParameter(gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT));
}
WRAP_S=CLAMP_TO_EDGE, WRAP_T=REPEAT Anisotropie: 1

WebGL 2: unveränderliche Textur erkennen

const gl = document.createElement('canvas').getContext('webgl2');
const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texStorage2D(gl.TEXTURE_2D, 4, gl.RGBA8, 128, 128);

console.log(gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_IMMUTABLE_FORMAT)); // true
console.log(gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_IMMUTABLE_LEVELS)); // 4
true 4