Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ответы на вопросы по шейдерам, вдогонку статье 
:(
    Опции темы
mr.DUDA
Дата 7.12.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Sardar @ 7.12.2005, 17:26)
Классно, но не хватает скриншотов для "быстрого" вникания в суть 

Скажите, какие именно скриншоты нужны - диаграммы, схемы, графики или скрины из RenderMonkey ?


--------------------
user posted image
PM MAIL WWW   Вверх
Sardar
Дата 7.12.2005, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Скрины, т.к. RenderMonkey ставить не хочеться, всё равно в плотную не занимаюсь, но интересно как это выглядит на практике. Интересен эффект "горячего воздуха", когда картинка "плывёт"/искривляеться.

Статья ясная, читаеться легко. Есть моменты не до конца понятные, например, обьявляя входную структуру для вертексного шейдера обьявляем требуемую инфу, а какие вообще параметры возможны (обобщённые по функционалу)? Также вертексный шейдер как я понял получает на вход одну вершину за один "выполняемый цикл", вершины на шейдер идут потоком в не известном порядке, механизмов запомнить выполнение прошлого цикла (глобальные переменные и т.д.) нет, тогда как узнать с какой вершиной сейчас работаем? Иначе просто мало чего можно сделать с ней... а может я думаю "не в том направлении".

Вообщем одной статьи явно не достаточно smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
mr.DUDA
Дата 7.12.2005, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Sardar @ 7.12.2005, 19:42)
Есть моменты не до конца понятные, например, обьявляя входную структуру для вертексного шейдера обьявляем требуемую инфу, а какие вообще параметры возможны (обобщённые по функционалу)?

Возможны параметры следующих типов (каждый определяется своей семантикой):
POSITION - координаты вершины
NORMAL - нормаль к вершине
TEXCOORD - текстурные координаты
TANGENT и BINORMAL - используются для bump mapping, определяют тангенциальное пространство
COLOR - цвет вершины, на самом деле может содержать любые пользовательские данные
FOG - коэффициент затуманивания, может также рассматриваться как цвет и интенсивность тумана
DEPTH - значение z-буфера для вершины
BLENDWEIGHT, BLENDINDICES - слабо представляю себе их назначение, что-то вроде сглаженных координат вершины, или похоже на это
SAMPLE, PSIZE, TESSFACTOR, POSITIONT - мне неизвестны smile

Кроме этих параметров, определённых для каждой вершины, можно определить параметры для шейдерной программы в целом. Количество и формат этих параметров определяются возможностями видеокарты.


Цитата(Sardar @ 7.12.2005, 19:42)
Также вертексный шейдер как я понял получает на вход одну вершину за один "выполняемый цикл", вершины на шейдер идут потоком в не известном порядке, механизмов запомнить выполнение прошлого цикла (глобальные переменные и т.д.) нет, тогда как узнать с какой вершиной сейчас работаем? Иначе просто мало чего можно сделать с ней... а может я думаю "не в том направлении".

На самом деле, шейдерной программе должно быть "пофигу", что это за вершина, т.к. по идее ты не знаешь заранее, сколько всего вершин и в каком порядке вершины располагаются в модели. Ведь модель делается заранее в 3D-studio, и всем заправляет моделлер, а ему всё равно, кто и как будет эту модель использовать, не так ли ? С другой стороны, если модель формируется программно, то ничего не мешает добавить в описание вершин свои собственные (пользовательские) данные, например в VertexColor, которые попадут в шейдер через COLOR-переменную. Помимо всего прочего, обычно допускается не один а несколько наборов данных одной семантики, т.е. ты можешь передать шейдеру 3-4 дополнительных вектора, что эквивалентно 12-16 float-значениям. Согласись, этого более чем достаточно. Тем более, что твоё 3D-приложение самостоятельно определяет формат вершин и заполняет их данными, т.е. у тебя есть возможность передать шейдеру всё что угодно в каком угодно количестве.

Цитата(Sardar @ 7.12.2005, 19:42)
Вообщем одной статьи явно не достаточно

Согласен, это всего лишь вершина айсберга. Но ведь надо с чего-то начать, правда ? Я изложил всё, о чём мне известно на текущий момент, в чём я, имхо, разобрался. Недостающие главы требуют только времени на написание, проблем не будет. Единственно, придётся попросить кого-нибудь сведущего в OpenGL и D3D сделать примеры с описанием, как прикручивать шейдер к реальной программе, т.к. пока что я работаю с движком OGRE, который абстрагируется от реализации 3D, т.е. выстраивает фасад над OpenGL и Direct3D.

Цитата(Sardar @ 7.12.2005, 19:42)
.к. RenderMonkey ставить не хочеться, всё равно в плотную не занимаюсь, но интересно как это выглядит на практике. Интересен эффект "горячего воздуха", когда картинка "плывёт"/искривляеться.

На практике всё выглядит, как в реальной игре. Различий нет. Например, эффект "горячего воздуха" выглядит точно так же как в GTA:San Andreas, точно говорю. Шейдеры ведь везде одинаковые, просто тот кто их использует первым, может гнуть пальцы, а остальные типа за ним "повторяют"... Увидеть работу шейдера по скриншоту - это то же самое что снять скрин с GTA, где над асфальтом горячий воздух, и искать в полученном скрине "шейдер". Нереально. К сожалению, GIF я сделать пока не могу, а видео займёт слишком много места, уж проще скачать RenderMonkey и посмотреть там smile.


--------------------
user posted image
PM MAIL WWW   Вверх
mr.DUDA
Дата 7.12.2005, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



P.S.
добавил скриншоты в статью.


--------------------
user posted image
PM MAIL WWW   Вверх
Sardar
Дата 8.12.2005, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(mr @ 7.12.2005, 21:09)
С другой стороны, если модель формируется программно, то ничего не мешает добавить в описание вершин свои собственные (пользовательские) данные, например в VertexColor, которые попадут в шейдер через COLOR-переменную.

Так для ясности, как рисуем кадр с одним проходом:
  • GPU для всех полигонов просчивывает поверхности (интерполирует точки), смысл заклкючаеться в узнавании для каждой точки координаты относительно камеры или сцены(POSITION0) + в узнавании координат на текстуре для развёртки(TEXCOORD). Это всё для каждой точки на каждом полигоне (елки как же их много...)
  • Вертексный шейдер получает эту инфу и по сути ничего более не делает чем преобразование координат. То есть я могу двигать вершину, например пошевелить волосами от ветра, НО! как я узнаю (я это шейдер smile ) что текущая вершина в потоке это именно "волосы" у персонажа в игре? Или шейдеры не для сцены, а для каждой части модели? С по мощью общего типа COLOR "обычно" передаються внешние параметры, например "направление ветра", как параметр к алгоритму анимации волос, прав ли я? и ограничение на их количество выставляеться железом или спецификацией шейдеров?
  • Пиксельный шейдер получает координату текстуры от вертексного шедэра, снимает пиксел, "прикидывает" освещение, выдаёт пиксел. Далее пиксел ставиться в полигон.
Отсюда получаеться что вертексным шейдером можно перестроить форму модели, а пиксельным изобразить реальное освещение, при этом координаты источников света шейдеру передаём сами? Отсечение не видимых точек GPU тоже само делает, иначе захлебнёться же пара шейдеров от стольких точек на обратку. Правильно ли я врубился? smile

P.S. хорошо бы обсуждение вынести в отдельный топ.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
mr.DUDA
Дата 8.12.2005, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Sardar @ 7.12.2005, 23:29)
GPU для всех полигонов просчивывает поверхности (интерполирует точки), смысл заклкючаеться в узнавании для каждой точки координаты относительно камеры или сцены(POSITION0) + в узнавании координат на текстуре для развёртки(TEXCOORD). Это всё для каждой точки на каждом полигоне (елки как же их много...)

Ну, всё не так уж и плохо smile
Вертексный считает для трёх точек полигона позицию и что-то ещё. Это "что-то ещё" интерполируется достаточно быстрым алгоритмом, а позиция после вертексного шейдера уже показывает, куда на экране ляжет точка. То есть, по сути вертексный проецирует полигон на экран и показывает, чем этот полигон надо "заливать". Пиксельный заливает. Точек получается ровно столько, сколько их внутри треугольника на экране, не так уж и много, правда ?

Цитата(Sardar @ 7.12.2005, 23:29)
Вертексный шейдер получает эту инфу и по сути ничего более не делает чем преобразование координат. То есть я могу двигать вершину, например пошевелить волосами от ветра, НО! как я узнаю (я это шейдер  ) что текущая вершина в потоке это именно "волосы" у персонажа в игре? Или шейдеры не для сцены, а для каждой части модели?

Скорее, для модели или группы моделей. Полазив в samples для DX SDK, нашёл пример:

Код
            bool beginSceneCalled = false;

            // Clear the render target and the zbuffer 
            device.Clear(ClearFlags.ZBuffer | ClearFlags.Target, 0x002D32AA, 1.0f, 0);
            try
            {
                device.BeginScene();
                beginSceneCalled = true;

                int passes = effect.Begin(0);
                for(int iPass = 0; iPass < passes; iPass++)
                {
                    effect.BeginPass(iPass);
                    mesh.Render(device);
                    effect.EndPass();
                }

                effect.End();
            }
            finally
            {
                if (beginSceneCalled)
                    device.EndScene();
            }
  


Цитата(Sardar @ 7.12.2005, 23:29)
С по мощью общего типа COLOR "обычно" передаються внешние параметры, например "направление ветра", как параметр к алгоритму анимации волос, прав ли я? и ограничение на их количество выставляеться железом или спецификацией шейдеров?

Внешние данные передаются через отдельные переменные, без семантики. Пример параметра для ps_main: uniform float diffuseLight

Цитата(Sardar @ 7.12.2005, 23:29)
Пиксельный шейдер получает координату текстуры от вертексного шедэра, снимает пиксел, "прикидывает" освещение, выдаёт пиксел. Далее пиксел ставиться в полигон.

Всё правильно.

Цитата(Sardar @ 7.12.2005, 23:29)
Отсюда получаеться что вертексным шейдером можно перестроить форму модели, а пиксельным изобразить реальное освещение, при этом координаты источников света шейдеру передаём сами? Отсечение не видимых точек GPU тоже само делает, иначе захлебнёться же пара шейдеров от стольких точек на обратку. Правильно ли я врубился?

Да, всё так и есть, если я врубаюсь.
Отсечение делает не шейдер, хотя он может повлиять на z-буфер. Точнее пока не скажу, т.к. самому надо разобраться smile.
Захлебнуться шейдеры не могут, по причине описанной в начале поста.


Добавлено @ 08:50
Вот, что написано в документации D3D по рендерингу с шейдерами:

Цитата
Add effects code to your rendering method, such as OnRender(), in-between calls to Device.BeginScene and Device.EndScene.

1. Create or obtain access to a high-level shader language (HLSL) file (.fx).
2. Load the HLSL file using Effect.FromFile.
3. Set Effect.Technique with the effect's technique.
4. Use Effect.Begin to obtain the number of passes for the effect.
5. Create a loop to iterate through all of the effect's passes. Rendering an effect occurs within a loop between calls to Effect.BeginPass and Effect.EndPass. The loop itself is nested between calls to Effect.Begin and Effect.End.
6. Render each pass within the loop with calls to Effect.BeginPass, Device.DrawPrimitives, and Effect.EndPass.


И пример кода (C#):
Код
public void OnRender ()
{
    .
    .
    .

    // Load the effect from file.
    Effect effect = Effect.FromFile(device, "shadercode.fx", null,
                                    ShaderFlags.None, null);
    // Set the technique.
    effect.Technique = "ShaderTechnique";

    // Note: Effect.Begin returns the number of
    // passes required to render the effect.
    int passes = effect.Begin(0);
    
    // Loop through all of the effect's passes.
    for (int i = 0; i < passes; i++)
    {
        // Set a shader constant
        effect.SetValue("WorldMatrix", worldMatrix);

        // Set state for the current effect pass.
        effect.BeginPass(i);
        
        // Render some primitives.
        device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
        
        // End the effect pass
        effect.EndPass();
    }

    // Must call Effect.End to signal the end of the technique.
    effect.End();

    .
    .
    .
}



--------------------
user posted image
PM MAIL WWW   Вверх
Змий
Дата 8.12.2005, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 6.12.2005

Репутация: нет
Всего: нет



Я так понял, векторные шейдеры базируются на информации с векторов объектов, а пиксельные шейдеры прямо воздействуют на картинку?

Так ли работает шейдер эффекта "горячего воздуха": сдвигает пиксели изображения в хаотичном порядке или это тоже distortion текстура?

Я хотел спросить - в игре Knights of The Old Republic эффект от "толчков силы" сделан шейдером?
А сам шейдер, если им было это сделано воздействует на куб изображения тем же distortion?
PM MAIL   Вверх
mr.DUDA
Дата 8.12.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата
Я так понял, векторные шейдеры базируются на информации с векторов объектов, а пиксельные шейдеры прямо воздействуют на картинку?

Неточная формулировка. Не с векторов, а с вершин полигонов объекта. Вершина (вертекс) содержит набор информации: там, к примеру, может быть или не быть текстурная координата, нормаль к вершине, цвет вершины и др.
Пиксельные шейдеры как бы "заливают" треугольник, лежащий в экранной плоскости, пикселами.

Цитата
Так ли работает шейдер эффекта "горячего воздуха": сдвигает пиксели изображения в хаотичном порядке или это тоже distortion текстура?

Этот шейдер берёт пиксел из специальной текстуры, содержащей монохромный шум. Затем по цвету этого пиксела определяется сдвиг для текстурных координат, по которым выбирается пиксел из обычной текстуры. В качестве "обычной текстуры" в том шейдере используется всё, что было отрисовано на первом проходе рендеринга, т.е. "нормальное" содержимое кадра рассматривается в свою очередь как текстура, которую мы будем искажать на втором проходе рендеринга.

Цитата
Я хотел спросить - в игре Knights of The Old Republic эффект от "толчков силы" сделан шейдером?
А сам шейдер, если им было это сделано воздействует на куб изображения тем же distortion?

Что за куб имеется ввиду ? smile


--------------------
user posted image
PM MAIL WWW   Вверх
Змий
Дата 8.12.2005, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 6.12.2005

Репутация: нет
Всего: нет



Цитата
Неточная формулировка. Не с векторов, а с вершин полигонов объекта. Вершина (вертекс) содержит набор информации: там, к примеру, может быть или не быть текстурная координата, нормаль к вершине, цвет вершины и др.
Пиксельные шейдеры как бы "заливают" треугольник, лежащий в экранной плоскости, пикселами.

Спасибо smile А можно приказать пиксельному шейдеру, что за пиксели(местоположение), какой цвет будут иметь заливающие пиксели и определить временную планку заливки тех или иных пикселей? К примеру, чтобы постепенно заливали картинку сначала в одном месте, а потом в другом.
Цитата
Этот шейдер берёт пиксел из специальной текстуры, содержащей монохромный шум.

Возможно ли редактировать эту текстуру, например для другогго типа искажений?
Цитата
Что за куб имеется ввиду ?

Энтити, символизирующее экран и подвергающееся наложению distortion текстуры, как вы сказали, когда описывали шэйдер haze. smile
PM MAIL   Вверх
mr.DUDA
Дата 9.12.2005, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата
А можно приказать пиксельному шейдеру, что за пиксели(местоположение), какой цвет будут иметь заливающие пиксели и определить временную планку заливки тех или иных пикселей? К примеру, чтобы постепенно заливали картинку сначала в одном месте, а потом в другом.

Можно в принципе сделать 3D-текстуру, в разных слоях которой будут маски для пиксельного шейдера. В зависимости от времени выбирать слой и использовать его как маску.

Цитата
Возможно ли редактировать эту текстуру, например для другогго типа искажений?

Конечно! Берём DirectX Texture Tool, открываем нашу 3D-текстуру с шумом, сохраняем под другим именем, и добавляем в неё свои собственные слои, нарисованные в фотошопе smile

Цитата
Энтити, символизирующее экран и подвергающееся наложению distortion текстуры, как вы сказали, когда описывали шэйдер haze.

Вообще-то, не куб, а плоскость из двух полигонов, сложенных вместе - т.е. прямоугольник. Модель называется screenAlignedQuad. Quad - потому что квадрат, screenAligned - потому что координаты модели подобраны так, чтобы углы квадрата совпадали с углами экрана.



--------------------
user posted image
PM MAIL WWW   Вверх
Змий
Дата 9.12.2005, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 6.12.2005

Репутация: нет
Всего: нет



Вот ещё вопрос. Если например есть анимированная текстура *.gif или кадры *.jpg их можно натянуть на screenAlignedQuad чтобы она прощёлкивалась с возвратом на первый кадр после последнего до какого то момента?
Цитата
Конечно! Берём DirectX Texture Tool, открываем нашу 3D-текстуру с шумом, сохраняем под другим именем, и добавляем в неё свои собственные слои, нарисованные в фотошопе

А можно как нибудь обойтись без Dx Texture Tool?
Мне не закачать SDK - слишком много для моего старого модема smile
PM MAIL   Вверх
mr.DUDA
Дата 10.12.2005, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата
Вот ещё вопрос. Если например есть анимированная текстура *.gif или кадры *.jpg их можно натянуть на screenAlignedQuad чтобы она прощёлкивалась с возвратом на первый кадр после последнего до какого то момента?

Вроде бы, для таких случаев используют динамически обновляемую текстуру, а не шейдер.

З.Ы. в приаттаченном архиве - Texture Tool для 9го DX SDK. Насчёт "не могу выложить" я имел ввиду что не могу выложить SDK smile

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  DxTex.zip 212,86 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
Змий
Дата 10.12.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 6.12.2005

Репутация: нет
Всего: нет



Спасибо, но когда пытаюсь открыть файл, мне пишет, что не может найти d3dref.dll smile
А также про глубину цвета.
PM MAIL   Вверх
mr.DUDA
Дата 10.12.2005, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Нужен установленный DirectX 9.0c, без него не запустится.


--------------------
user posted image
PM MAIL WWW   Вверх
Змий
Дата 10.12.2005, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 6.12.2005

Репутация: нет
Всего: нет



У меня сейчас стоит DirectX 9.0c. По крайней мере, он так пишет в dxdiag.
Но всё равно, ошибка выскакивает.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.