Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Компьютерная графика » Программирование графики и GPU » Несколько технических вопросов


Несколько технических вопросов

Сообщений 1 страница 18 из 18

1

1. Хочется запаковать в переменную типа float в вызывающей программе несколько малых дискретных значений, а потом распаковать их в шейдере. Процесс запаковки вполне себе представляю: положить 4 байта в целое, а потом передать результат по адресу во float. А вот как потом развернуть назад в шейдере средствами GLSL?
2. Могу ли я передавать в шейдер в качестве uniform переменных достаточно большие массивы, к примеру, массив матриц 4х4 длиной 40?
Как такую передачу оформить в вызывающей программе? Сильно ли это будет тормозить программу (планирую передавать >30 матриц каждый раз при рендере модели).
3. Что оптимальнее: передать массив из 4-х матриц 4х4 или 16 векторов длиной 4? Я это к тому, имеет ли смысл объединять при передаче вектора в матрицы, или так массивами векторов и кидать?

0

2

1. На  SM4.0 это возможно при работе с целочисленной арифметикой. В остальных случаях - вы знакомы с IEEE 754? Если нет - познакомьтесь. Это ответит на все ваш вопрос
2-3.  Зависит от железа, драйверов, ОС, фазы луны и т.д. Есть более разумные способы это делать. В частности они встречаются в статьях Алексея (например в статье про R2VB)

0

3

Да...  Бывают кадры...
Из уважения к Мастеру умолкаю....

0

4

Насчет больших массивов - для GeForce8xxx и старше есть ряд удобных расширений, например texture_buffer_object и EXT_bindable_uniform
Собственно их цель как раз в передаче шейдеру больших, ругулярно изменяемых данных

0

5

Да, безусловно. Однако в данном случае, скорее всего, можно обойтись и без них. Однако, в виду того, что автор поста не описывает конкретной постановки задачи, дать точный ответ не возможно.

0

6

Steps3D написал(а):

есть ряд удобных расширений

После долгих раздумий решил пока ограничиться минимумом. :)
Собственно, вывожу функцией
glDrawElements(GL_TRIANGLE_STRIP, m_nNumTriStrips, GL_UNSIGNED_SHORT, m_pusTriStripBuffer);

    В ряд сопутствующих массивов забиваю информацию о вершине + полагаю забить индексы костей и веса. С весами понятно - float он и есть float. Но индекс вполне влезает в байт, а float как-никак занимает 4 байта. Отсюда возникает соблазн сэкономить на передаче, но пока не очень понимаю как эти байты в шейдере распаковать.

Сами же кости решил передавать как uniform перед вызовом отрисовки, естественно. Потому и спросил: как оформить передачу массива матриц (вариант - векторов) в качестве uniform переменной.

0

7

Для этого можно упаковывать данные в текстуру. Пример как это можно сделать (и именно в скелетной анимации) приведен здесь. К сожалению, в шейдере Вам не удастся выделять отдельные байты из float'ов. Это связанно с рядом особенностей представления вещественных чисел в машинном виде, особенностей GLSL, и архитектуры 3D ускорителей. В случае SM 4.0 имеется возможность использования целочисленной арифметики, в том числе сдвигов и битовых логических операций, что позволит работать с отдельными байтами

0

8

Я хорошо подумал и всё же решил попробовать обойтись без свежих расширений. Просто потому что проект у меня скромный, и хочется ориентировать его на максимально большую номенклатуру старого железа, к примеру, на большинство АГПшных карточек. Опять же имею планы писать и под мобильные устройства, где с расширениями будет видимо и вовсе туго. Так что максимум пока что из того, что хочу использовать - это GLSL и VBO.

   А хотя бы 2 байта я смогу передать через float?

0

9

Ну и повторю вопрос: я могу передать как uniform переменную массив из 32, к примеру, матриц? И если могу, то как это оформить в вызывающей программе и в шейдере?

0

10

Скорее всего сможете. 32 так точно. В шейдере массив будет иметь вид:

Код:
uniform mat4 matricies[32]

Для задания unform'а можно использовать:

Код:
GLint glUniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, GLfloat *v);

А хотя бы 2 байта я смогу передать через float?

В поставленном вами случае - нет.

Так же стоит учесть то, что карты, поддерживающие VBO как правило поддерживают и PBO (который является просто расширением VBO). Поэтому на вашем месте я бы попытался реализовать и вариант с массивами uniform, и вариант с R2VB.
Касательно вашего вопроса про скорость - все сильно зависит от драйвера.
Теоретически - разницы быть не должно, поэтому используйте то, что вам удобней.

0

11

В принципе можно несколько числе из заранее изавестных диапазонов засунуть в один float.
Линк сейчас не нашел, но идея проста - если есть два числа x1, x2 из [0,1], то можно сделать новое число w, так что дробная часть будет совпадать с первым (x1),
x1=frac(w)
x2 = (w - x1) / C

Нужно просто правильно подобрать константу С и способ запаковки

0

12

Нашел линк - http://sleazycoding.com/post/2009/03/24 … -data.aspx

0

13

Так можно, но исходная формулировка была другой, так как предполагалось совершенно другая упаковка данных. И другие требования к числам.

0

14

Позвольте задать такой технический вопрос: в OpenGL я создаю источние света; расчёт его освещения на остальные объекты будет идти по

А) по методу закраски Гуро (http://compgraph.ad.cctpu.edu.ru/Guro.htm) ?
Б) по методу Фонга (http://compgraph.ad.cctpu.edu.ru/fong.htm) ?

0

15

Если имеется в виду стандарьный механизм из фиксированного конвейера, то это скорее Фонг.
В доках по OpenGL есть полное уравнение для освещения

0

16

Steps3D написал(а):

Если имеется в виду стандарьный механизм из фиксированного конвейера, то это скорее Фонг.
В доках по OpenGL есть полное уравнение для освещения

Необходимо уточнитть.

Источники света создаются не шейдерные (аля - OpenGL 1.1) т.е.
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
/* Ну и так далее */
В таком случае будет Фонг? А то в OpenGL RedBook очень непонятно тихо в скобках называют в теме "2.6 Вектора нормали" "(метод закраски Гуро)". Вот,

я приведу весь абзац:
Вектора нормали объекта определяют его ориентацию в пространстве – в частности, его
ориентацию по отношению к источникам света. Эти вектора нужны OpenGL для определения
количества света, падающего на вершины объекта (метод закраски Гуро). Вы определяете
вектора нормалей объекта в то же время, когда задаете его геометрию.

Отредактировано DungeonLords (2009-07-16 12:12:33)

0

17

Есть понятие закрашивание по Гуро - т.е. кодга идет интерполяция освещения вдольпримитива
А есть модель освещения - Гуро и модель освещения Фонга.
Так вот используетися закрашивание Гуро, но модель освещения Фонга.

0

18

Steps3D написал(а):

Так вот используется закрашивание Гуро, но модель освещения Фонга.

Большое вам спасибо.

0


Вы здесь » Компьютерная графика » Программирование графики и GPU » Несколько технических вопросов


создать форум