WebGLRenderingContext: метод getUniformLocation()
Базовая линия Широко поддерживается
Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Примечание: Эта функция доступна в Web Workers.
Как часть API WebGL, метод WebGLRenderingContext getUniformLocation() возвращает расположение конкретной переменной uniform, которая входит в состав заданной WebGLProgram.
Переменная uniform возвращается как объект WebGLUniformLocation, который представляет собой некий идентификатор, используемый для указания места в памяти графического процессора, где расположена переменная uniform.
После получения расположения uniform, вы можете получить доступ к самой uniform, используя один из других методов доступа к uniform, передав расположение uniform в качестве одного из входных параметров:
getUniform()-
Возвращает значение uniform в заданном расположении.
WebGLRenderingContext.uniform[1234][fi][v]()-
Устанавливает значение uniform в указанное значение, которое может быть одним плавающим или целым числом, или вектором с 2-4 компонентами, указанным либо как список значений, либо как
Float32ArrayилиInt32Array. WebGLRenderingContext.uniformMatrix[234][fv]()-
Устанавливает значение uniform в указанную матрицу, возможно с транспонированием. Значение представлено как последовательность
GLfloatзначений или какFloat32Array.
Сама uniform объявляется в программе шейдера с помощью GLSL.
Синтаксис
getUniformLocation(program, name)
Параметры
program-
WebGLProgramпрограмма, в которой необходимо найти указанную переменную uniform. name-
Строка, определяющая имя переменной uniform, расположение которой требуется вернуть. Имя не может содержать пробелы, и вы не можете использовать эту функцию для получения расположения uniform, начинающихся со зарезервированной строки
"gl_", так как они являются внутренними для уровня WebGL.Возможные значения соответствуют именам uniform, возвращаемым функцией
getActiveUniform; см. эту функцию для получения подробностей о том, как объявленные uniform сопоставляются с именами расположений uniform.Кроме того, для uniform, объявленных как массивы, также допустимы следующие имена:
- Имя uniform без суффикса
[0]. Например, расположение, возвращаемое дляarrayUniform, эквивалентно расположению дляarrayUniform[0]. - Имя uniform с индексом целого числа. Например, расположение, возвращаемое для
arrayUniform[2], указывает непосредственно на третий элемент uniformarrayUniform.
- Имя uniform без суффикса
Значение, возвращаемое функцией
Значение WebGLUniformLocation, указывающее на расположение переменной, если она существует. Если указанная переменная не найдена, возвращается null.
WebGLUniformLocation — это непрозрачное значение, используемое для уникальной идентификации расположения в памяти графического процессора, где расположена переменная uniform. Имея это значение, вы можете вызвать другие методы WebGL для доступа к значению переменной uniform.
Примечание: Тип WebGLUniformLocation совместим с типом GLint при указании индекса или расположения атрибута uniform.
Ошибки
Могут возникнуть следующие ошибки; чтобы проверить наличие ошибок после того, как getUniformLocation() вернёт результат, вызовите getError().
GL_INVALID_VALUE-
Параметр
programне является значением или объектом, сгенерированным WebGL. GL_INVALID_OPERATION-
Параметр
programне соответствует программе GLSL, сгенерированной WebGL, или указанная программа не была успешно связана.
Примеры
В этом примере, взятом из метода animateScene() в статье Пример анимации 2D WebGL, получаются расположения трёх uniform из программы шейдеров, а затем устанавливаются значения каждой из трёх uniform.
gl.useProgram(shaderProgram); uScalingFactor = gl.getUniformLocation(shaderProgram, "uScalingFactor"); uGlobalColor = gl.getUniformLocation(shaderProgram, "uGlobalColor"); uRotationVector = gl.getUniformLocation(shaderProgram, "uRotationVector"); gl.uniform2fv(uScalingFactor, currentScale); gl.uniform2fv(uRotationVector, currentRotation); gl.uniform4fv(uGlobalColor, [0.1, 0.7, 0.2, 1.0]);
Примечание: Этот фрагмент кода взят из функции animateScene() в примере анимации 2D WebGL. См. эту статью для полного примера и для того, чтобы увидеть анимацию в действии.
После установки текущей программы шейдеров на shaderProgram, этот код извлекает три uniform "uScalingFactor", "uGlobalColor", и "uRotationVector", вызывая getUniformLocation() один раз для каждой uniform.
Затем устанавливаются значения трёх uniform:
- Uniform
uScalingFactor— 2-компонентный вершинный параметр — получает горизонтальный и вертикальный масштабные множители из переменнойcurrentScale. - Uniform
uRotationVectorустанавливается в содержимое переменнойcurrentRotation. Это также 2-компонентный вершинный параметр. - Наконец, uniform
uGlobalColorустанавливается в цвет[0.1, 0.7, 0.2, 1.0], компоненты этого 4-компонентного вектора представляют значения красного, зеленого, синего и альфа-каналов соответственно.
После этого, при следующем вызове функций шейдеров, их собственные переменные с именами uScalingFactor, uGlobalColor, и uRotationVector будут иметь значения, заданные кодом JavaScript.
Спецификации
| Спецификация |
|---|
| Спецификация WebGL # 5.14.10 |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
getUniformLocation |
9 | 12 | 4 | 12 | 5.1 | 25 | 4 | 12 | 8 | 1.5 | 4.4.3 |
См. также
© 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/WebGLRenderingContext/getUniformLocation