Войти
ПрограммированиеФорумГрафика

Силуэт вокруг объекта с прозрачонстью

Страницы: 1 2 Следующая »
#0
19:26, 9 июня 2017

Добрый час!
Понадобилось нарисовать силуэт вокруг объекта с прозрачонстью (или прозрачного объекта).
Надыбал вот такую линку http://nihilistdev.blogspot.com/2013_05_01_archive.html, но там под Unity3D с которым я не имел никогда дела, сижу пытаюсь разобраться в синтаксисе записи шейдеров для Unity уж больно много там чего намешано.
Может кто подскажет еще какие то техники или демки на GL с исходниками, буду весьма признателен.
Спасибо.


#1
20:23, 9 июня 2017

nen777w
https://learnopengl.com/#!Advanced-OpenGL/Stencil-testing

#2
20:25, 9 июня 2017

nen777w
Посмотри здесь:
https://willweissman.wordpress.com/tutorials/shaders/unity-shader… ect-outlines/

#3
11:14, 10 июня 2017

Если у тебя Deferred Shading, то почитай, как делали в Deus Ex Human Revolution.

#4
12:04, 12 июня 2017

Alerr
> Посмотри здесь:

Спасибо. Видел.
Мне нужен не полупрозрачный аутлайн а аутлайн вокруг (полу)прозрачных объектов.

#5
16:14, 12 июня 2017

nen777w
какой то из фильтров это создает... дай бог памяти, не помню, https://ru.wikipedia.org/wiki/Выделение_границ
вспомнил, Sobel (Собель) https://habrahabr.ru/post/128753/

Misanthrope
> (от 2015 года), Сперва рисуешь объект сплошным цветом, без записи в глубину, и немного больше
> чем его оригинал.
> Поверх него рисуешь оригинал.
> И все дела.

ссылка на шейдер http://www.cyberforum.ru/graphics/thread1230848.html

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

#6
17:59, 12 июня 2017

Salamandr
> Salamandr

Если я правильно понимаю, 3 прохода. (Хочу сперва запилить в Render Monkey).
1) Рендерим немного просекйленный объект в текстуру с красным цветом с отключенным буфером глубины, освещением и т.д.. (Outline)
2) Рендерим объект как он и есть (без скейла) чёрным цветом с отключенным буфером глубины, освещением и т.д.. (Mask)
3) Вот этот пункт немного не понятно: "Далее шейдером, везде где есть красный цвет, заменяешь его на цвет нужный тебе и рисуешь на изображении с камеры игрока. "
Изображение

#7
18:02, 12 июня 2017

Salamandr
Так толщина обводки будет зависеть от формы предмета, если нужна однородная (как фломастером на бумаге), то только фильтрация по альфе

#8
18:02, 12 июня 2017

На первую наложи вторую только с прозрачностью, то что у тебя белым на второй = должно быть черным (остальные участки прозрачным), то есть. Это закрасит красный силуэт черным. Первая текстура без прозрачности, только чёрный и красный.
что останется соедини с тем что видит камера через шейдер по цвету (проверяя у цвет пикселя на r=1,g=0,b=0).

#9
18:15, 12 июня 2017

Salamandr
> На первую наложи вторую, что останется соедини с тем что видит камера

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

#10
18:17, 12 июня 2017

Поправил, суть ты понял 8)

#11
18:19, 12 июня 2017

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

Ещё есть один метод, это вычислить крайние точки на модели, так как точки модели известны, надо лишь вычислить как они будут на камере. Делается через матрицы, но с ними не знаком. После этого строится опять же ломанная кривая нужной ширины.

#12
22:56, 12 июня 2017

Получилось, но результат мягко говоря не очень.
Изображение

В том примере c Unity вроде получше было.

Скйлил объект вот таким шейдером:

uniform float offset;

uniform float4x4 modelViewMatrix;
uniform float4x4 projectionMatrix;

attribute  vec3 rm_Vertex;

void main(void)
{
   vec4 scaled_pos = vec4(rm_Vertex * offset, 1.0);
   gl_Position = projectionMatrix * modelViewMatrix * scaled_pos;
}

Походу нужно копать в сторону генерации аутлайна по мешу. Что то вроде convex hull-а.
Получается что все на процессоре.

#13
0:59, 13 июня 2017

nen777w
> vec4 scaled_pos = vec4(rm_Vertex * offset, 1.0);

   vec4 scaled_pos = vec4(rm_Vertex + rm_Normal*scale, 1.0);
#14
10:26, 13 июня 2017

Che@ter
Помогло, только пришлось вместо переменных из stream mapping воспользоваться встроенными.
Т.е.так:

 vec4 scaled_pos = vec4(gl_Vertex + gl_Normal * scale, 1.0);
Иначе оно не сейлелось а смещалось (интересно почему?, ну т.е. понятно потому что непонятно как связать stream mapping с конкретным объектом).
Ну и на объектах вроде куба обводка конечно так себе получается.

Вот видео.
Слон: https://youtu.be/CkXlY97dA6k
Куб: https://youtu.be/ldKK0hEg5DU

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.