Spec-Zone.ru › Web APIs

Сжатые форматы текстур

API WebGL предоставляет методы для использования сжатых форматов текстур. Это полезно для повышения детализации текстур при ограничении дополнительной видеопамяти. По умолчанию сжатые форматы недоступны: соответствующее расширение сжатого формата текстуры должно быть сначала включено.

Использование

Если не указано иное, эта статья относится как к контекстам WebGL 1, так и WebGL 2.

Если поддерживается, текстуры могут храниться в сжатом формате в видеопамяти. Это позволяет повысить детализацию при ограничении дополнительной видеопамяти. Текстуры распаковываются на лету при доступе к ним шейдером. Обратите внимание, что это преимущество не распространяется на пропускную способность сети: хотя форматы лучше, чем несжатые данные, они, как правило, гораздо хуже, чем стандартные форматы изображений, такие как PNG и JPG.

Поскольку сжатые текстуры требуют поддержки аппаратного обеспечения, WebGL не требует никаких конкретных форматов; вместо этого контекст может сделать доступными различные форматы в зависимости от поддержки аппаратного обеспечения. Этот сайт показывает, какие форматы поддерживаются в используемом браузере.

Для использования сжатых форматов сначала необходимо активировать соответствующее расширение с помощью WebGLRenderingContext.getExtension(). Если поддерживается, он вернёт объект расширения с константами для добавленных форматов, а форматы также будут возвращены при вызовах gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS). (Например, ext.COMPRESSED_RGBA_S3TC_DXT1_EXT для расширения WEBGL_compressed_texture_s3tc.) Затем эти константы можно использовать с compressedTexImage[23]D или compressedTexSubImage[23]D вместо вызовов texImage2D.

Обратите внимание, что WebGL не предоставляет функций для сжатия или распаковки текстур: они должны уже быть в сжатом формате и затем могут быть непосредственно загружены в видеопамять.

Все форматы поддерживают 2D-текстуры. Какие форматы поддерживают TEXTURE_2D_ARRAY и TEXTURE_3D целевые значения (в сочетании с compressedTexImage3D) указаны в следующей таблице.

Расширение Примечания TEXTURE_2D_ARRAY TEXTURE_3D
WEBGL_compressed_texture_astc Да Да
WEBGL_compressed_texture_etc Да Нет
WEBGL_compressed_texture_etc1* Не может использоваться с compressedTexSubImage2D/copyTexSubImage2D. Нет Нет
WEBGL_compressed_texture_pvrtc Ширина и высота должны быть степенями двойки. Нет Нет
WEBGL_compressed_texture_s3tc Ширина и высота должны быть кратными 4. Да Нет
WEBGL_compressed_texture_s3tc_srgb Ширина и высота должны быть кратными 4. ? Нет

Примеры

async function getCompressedTextureIfAvailable(gl) {
  const texture = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D, texture); // create texture object on GPU
  const ext = gl.getExtension("WEBGL_compressed_texture_s3tc"); // will be null if not supported
  if (ext) {
    // the file is already in the correct compressed format
    const dataArrayBuffer = await fetch(
      "/textures/foobar512x512.RGBA_S3TC_DXT1",
    ).then((response) => response.arrayBuffer());
    gl.compressedTexImage2D(
      gl.TEXTURE_2D,
      0, // set the base image level
      ext.COMPRESSED_RGBA_S3TC_DXT1_EXT, // the compressed format we are using
      512,
      512, // width, height of the image
      0, // border, always 0
      new DataView(dataArrayBuffer),
    );
    gl.generateMipMap(gl.TEXTURE_2D); // create mipmap levels, like we would for a standard image
    return texture;
  }
}

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Compressed_texture_formats

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API