ADN Club > JavaScript и web-программирование для ПО Autodesk

Инициализация переменной gl_PointSize

(1/1)

Андрей Бушман:
WebGL.

Возник вопрос по поводу инициализации из кода JavaScript переменной gl_PointSize, доступной в вершинном шейдере... Если я в js-коде меняю

--- Код - Javascript [Выбрать] ---gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);на

--- Код - Javascript [Выбрать] ---gl.uniform1f(u_FragColor, 1.0);то он перестаёт работать. В консоли вижу следующее:



Насколько я знаю, оба варианта кода идентичны: второй вариант - это более лаконичная форма записи первого. Почему происходит сие безобразие?

Андрей Бушман:
Меня сбила с толку информация в книге (конец 2-й главы, стр. 86):


--- Цитата: WebGL: Программирование трёхмерной графики ---
--- Код: ---gl.uniform1f(location, v0)
gl.uniform2f(location, v0, v1)
gl.uniform3f(location, v0, v1, v2)
gl.uniform4f(location, v0, v1, v2, v3)
--- Конец кода ---
Присваивают значение переменной-атрибуту по ссылке location. Метод gl.uniform1f() присваивает единственное значение и используется для изменения первого элемента вектора uniform-переменной. Второму и третьему элементам вектора будут присвоены значения 0.0, а четвёртому - значение 1.0. Аналогично действует метод gl.uniform2f(), который присваивает значения первым двум элементам, третьему присваивает 0.0, а четвёртому - значение 1.0. Метод gl.uniform3f() присваивает значение первым трём элементам, а четвёртому - значение 1.0. Метод gl.uniform4f() присваивает значения всем четырём элементам вектора.
--- Конец цитаты ---
На основании этой информации я посчитал, что в моём случае выражение

--- Код - Javascript [Выбрать] ---gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);эквивалентно выражению

--- Код - Javascript [Выбрать] ---gl.uniform1f(u_FragColor, 1.0);и может быть подставлено вместо первого варианта.

Ответ на мой вопрос обозначен в спецификации OpenGL ES Common Profile Specification Version 2.0.25 (Full Specification) (November 2, 2010) на стр. 37-38 (перевод):

--- Цитата:  OpenGL ES Common Profile Specification ---Используемая Uniform* команда должна соответствовать размеру uniform объявленного в шейдере. Например, для загрузки uniform, объявленного как bvec2, следует использовать либо Uniform2i{v}, либо Uniform2f{v}. В случае несоответствия Uniform* команды будет генерироваться ошибка INVALID_OPERATION. В данном примере попытка использовать Uniform1iv сгенерирует такую ошибку.

Для всех других типов используемая Uniform* команда должна соответствовать размеру и типу uniform, объявленному в шейдере. Никаких преобразований типов не выполняется. Например, для загрузки uniform объявленного как vec4, должен использоваться Uniform4f{v}. Для загрузки матрицы 3х3 - должна быть использована команда UniformMatrix3fv. В случае несоответствия Uniform* команды будет генерироваться ошибка INVALID_OPERATION. В данном примере попытка использовать Uniform4i{v} сгенерирует такую ошибку.
--- Конец цитаты ---


--- Цитата: Андрей Бушман ---... и может быть подставлено вместо первого варианта.
--- Конец цитаты ---
Как оказалось - не может.

Навигация

[0] Главная страница сообщений

Перейти к полной версии