1. Хочется запаковать в переменную типа float в вызывающей программе несколько малых дискретных значений, а потом распаковать их в шейдере. Процесс запаковки вполне себе представляю: положить 4 байта в целое, а потом передать результат по адресу во float. А вот как потом развернуть назад в шейдере средствами GLSL?
2. Могу ли я передавать в шейдер в качестве uniform переменных достаточно большие массивы, к примеру, массив матриц 4х4 длиной 40?
Как такую передачу оформить в вызывающей программе? Сильно ли это будет тормозить программу (планирую передавать >30 матриц каждый раз при рендере модели).
3. Что оптимальнее: передать массив из 4-х матриц 4х4 или 16 векторов длиной 4? Я это к тому, имеет ли смысл объединять при передаче вектора в матрицы, или так массивами векторов и кидать?
Несколько технических вопросов
Сообщений 1 страница 18 из 18
Поделиться12009-05-19 10:58:40
Поделиться22009-05-19 11:54:46
1. На SM4.0 это возможно при работе с целочисленной арифметикой. В остальных случаях - вы знакомы с IEEE 754? Если нет - познакомьтесь. Это ответит на все ваш вопрос
2-3. Зависит от железа, драйверов, ОС, фазы луны и т.д. Есть более разумные способы это делать. В частности они встречаются в статьях Алексея (например в статье про R2VB)
Поделиться32009-05-19 19:57:54
Да... Бывают кадры...
Из уважения к Мастеру умолкаю....
Поделиться42009-05-19 20:14:07
Насчет больших массивов - для GeForce8xxx и старше есть ряд удобных расширений, например texture_buffer_object и EXT_bindable_uniform
Собственно их цель как раз в передаче шейдеру больших, ругулярно изменяемых данных
Поделиться52009-05-19 20:56:17
Да, безусловно. Однако в данном случае, скорее всего, можно обойтись и без них. Однако, в виду того, что автор поста не описывает конкретной постановки задачи, дать точный ответ не возможно.
Поделиться62009-05-19 22:00:18
есть ряд удобных расширений
После долгих раздумий решил пока ограничиться минимумом.
Собственно, вывожу функцией
glDrawElements(GL_TRIANGLE_STRIP, m_nNumTriStrips, GL_UNSIGNED_SHORT, m_pusTriStripBuffer);
В ряд сопутствующих массивов забиваю информацию о вершине + полагаю забить индексы костей и веса. С весами понятно - float он и есть float. Но индекс вполне влезает в байт, а float как-никак занимает 4 байта. Отсюда возникает соблазн сэкономить на передаче, но пока не очень понимаю как эти байты в шейдере распаковать.
Сами же кости решил передавать как uniform перед вызовом отрисовки, естественно. Потому и спросил: как оформить передачу массива матриц (вариант - векторов) в качестве uniform переменной.
Поделиться72009-05-19 22:36:05
Для этого можно упаковывать данные в текстуру. Пример как это можно сделать (и именно в скелетной анимации) приведен здесь. К сожалению, в шейдере Вам не удастся выделять отдельные байты из float'ов. Это связанно с рядом особенностей представления вещественных чисел в машинном виде, особенностей GLSL, и архитектуры 3D ускорителей. В случае SM 4.0 имеется возможность использования целочисленной арифметики, в том числе сдвигов и битовых логических операций, что позволит работать с отдельными байтами
Поделиться82009-05-20 07:26:52
Я хорошо подумал и всё же решил попробовать обойтись без свежих расширений. Просто потому что проект у меня скромный, и хочется ориентировать его на максимально большую номенклатуру старого железа, к примеру, на большинство АГПшных карточек. Опять же имею планы писать и под мобильные устройства, где с расширениями будет видимо и вовсе туго. Так что максимум пока что из того, что хочу использовать - это GLSL и VBO.
А хотя бы 2 байта я смогу передать через float?
Поделиться92009-05-20 07:29:01
Ну и повторю вопрос: я могу передать как uniform переменную массив из 32, к примеру, матриц? И если могу, то как это оформить в вызывающей программе и в шейдере?
Поделиться102009-05-20 10:21:52
Скорее всего сможете. 32 так точно. В шейдере массив будет иметь вид:
uniform mat4 matricies[32]
Для задания unform'а можно использовать:
GLint glUniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, GLfloat *v);
А хотя бы 2 байта я смогу передать через float?
В поставленном вами случае - нет.
Так же стоит учесть то, что карты, поддерживающие VBO как правило поддерживают и PBO (который является просто расширением VBO). Поэтому на вашем месте я бы попытался реализовать и вариант с массивами uniform, и вариант с R2VB.
Касательно вашего вопроса про скорость - все сильно зависит от драйвера.
Теоретически - разницы быть не должно, поэтому используйте то, что вам удобней.
Поделиться112009-05-20 13:12:35
В принципе можно несколько числе из заранее изавестных диапазонов засунуть в один float.
Линк сейчас не нашел, но идея проста - если есть два числа x1, x2 из [0,1], то можно сделать новое число w, так что дробная часть будет совпадать с первым (x1),
x1=frac(w)
x2 = (w - x1) / C
Нужно просто правильно подобрать константу С и способ запаковки
Поделиться132009-05-20 15:03:44
Так можно, но исходная формулировка была другой, так как предполагалось совершенно другая упаковка данных. И другие требования к числам.
Поделиться142009-07-11 12:58:03
Позвольте задать такой технический вопрос: в OpenGL я создаю источние света; расчёт его освещения на остальные объекты будет идти по
А) по методу закраски Гуро (http://compgraph.ad.cctpu.edu.ru/Guro.htm) ?
Б) по методу Фонга (http://compgraph.ad.cctpu.edu.ru/fong.htm) ?
Поделиться152009-07-11 19:54:40
Если имеется в виду стандарьный механизм из фиксированного конвейера, то это скорее Фонг.
В доках по OpenGL есть полное уравнение для освещения
Поделиться162009-07-16 12:08:30
Если имеется в виду стандарьный механизм из фиксированного конвейера, то это скорее Фонг.
В доках по OpenGL есть полное уравнение для освещения
Необходимо уточнитть.
Источники света создаются не шейдерные (аля - OpenGL 1.1) т.е.
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
/* Ну и так далее */
В таком случае будет Фонг? А то в OpenGL RedBook очень непонятно тихо в скобках называют в теме "2.6 Вектора нормали" "(метод закраски Гуро)". Вот,
я приведу весь абзац:
Вектора нормали объекта определяют его ориентацию в пространстве – в частности, его
ориентацию по отношению к источникам света. Эти вектора нужны OpenGL для определения
количества света, падающего на вершины объекта (метод закраски Гуро). Вы определяете
вектора нормалей объекта в то же время, когда задаете его геометрию.
Отредактировано DungeonLords (2009-07-16 12:12:33)
Поделиться172009-07-16 14:12:41
Есть понятие закрашивание по Гуро - т.е. кодга идет интерполяция освещения вдольпримитива
А есть модель освещения - Гуро и модель освещения Фонга.
Так вот используетися закрашивание Гуро, но модель освещения Фонга.
Поделиться182009-07-16 21:41:45
Так вот используется закрашивание Гуро, но модель освещения Фонга.
Большое вам спасибо.