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

Автор Тема: Инициализация переменной gl_PointSize  (Прочитано 4936 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
WebGL.

Возник вопрос по поводу инициализации из кода JavaScript переменной gl_PointSize, доступной в вершинном шейдере... Если я в js-коде меняю
Код - Javascript [Выбрать]
  1. gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);
на
Код - Javascript [Выбрать]
  1. gl.uniform1f(u_FragColor, 1.0);
то он перестаёт работать. В консоли вижу следующее:



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

Отмечено как Решение Андрей Бушман 19-02-2015, 12:46:16

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Инициализация переменной gl_PointSize
« Ответ #1 : 19-02-2015, 12:46:13 »
Меня сбила с толку информация в книге (конец 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 [Выбрать]
  1. gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);
эквивалентно выражению
Код - Javascript [Выбрать]
  1. 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} сгенерирует такую ошибку.

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