Автор Тема: как можно сделать matcap в cycles?  (Прочитано 8161 раз)

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
как можно сделать matcap в cycles?
« : 06 Ноябрь 2013, 06:14:06 »
... насколько понял, эта тема в интернетах обсуждаема, но готового решения так и не нашел (возможно плохо искал) ...

вот что у меня на текущий момент получилось:
out 11

и вот "Sculpt Mode":
out 13

... для себя сделал в cycles через ноду "Environment Texture" с проекцией входного изображения "Equirectangular", поелику MatCap – шейдер для создания светоотражающих поверхностей с равномерной окраской, для которого берется изображение сферы как карта окружения ...



... по ходу нужно решить две задачи как сделать или где взять эту карту окружения и как сделать shadeless в cycles ...

... как отключить чувствительность материала к свету и теням можно найти здесь "Making Shadeless Materials for Cycles in Blender" http://cgcookie.com/blender/2012/03/09/making-shadeless-materials-cycles-in-blender/  ...

... для карты окружения запек текстуру matcap на сферу, у которой UV развертка имеет вид прямоугольника ...





... во вложении модель для эксперементов, но без "shadeless" ...

еще информация по теме:
MatCap03.在後製使用MatCap

[вложение удалено Администратором]
« Последнее редактирование: 06 Ноябрь 2013, 07:21:54 от sungreen »
Для Кота

Оффлайн aarrsseennyy

  • Житель
Re: как можно сделать matcap в cycles?
« Ответ #1 : 06 Ноябрь 2013, 10:19:04 »
мне нужно было смешать 2 маткапа вот примерно таким образом:

причем вот эта маска (alpha канал), брались бы из координат UV объекта:

тоесть я бы просто контролировал смешение 2х... 3х или N-ое количество маткапов на сетке объекта в сцене


вот что у меня на текущий момент получилось:
out 11

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

у меня blender 2.69 я заметил у вас на скриншоте версию blender 2.69.1 — попробовал в этой версии (скачав вот тут http://www.graphicall.org/110) но были такие же проблемы

по поводу этого видео
MatCap03.在後製使用MatCap этого метода. Он действует, но только в internal.
вот та же сцена в internal:

Все вроде бы ок и можно сделать как мне нужно, но:

1)желательно к cycles так как я к нему привык и там можно примешать GI
2) до меня не доходит как можно смешать там маткапы через маску из uv

а вот тот же метод на тай же сцене, только, собственно, в cycles:


думаю причина в том как генерируется изображение из пасса normal в render layer
вот так генерирует его internal:


в вот так cycles:


есть простой метод в internal Matcaps in Blender
но я не знаю как там через ноды смешать маткапы как мне нужно (как я описывал в самом начале), если кто знает то подскажите
« Последнее редактирование: 06 Ноябрь 2013, 10:27:21 от aarrsseennyy »

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: как можно сделать matcap в cycles?
« Ответ #2 : 06 Ноябрь 2013, 13:38:29 »
>> но у меня какие-то глюки
... попробуй вместо 3.jpg подставить этот файл ...
... он немного грязный просто проверь что получиться ...


>> 2) до меня не доходит как можно смешать там маткапы через маску из uv
... выложи отдельно маску, matcap1 и matcap2 (ну и модель если не сложно) ...

[вложение удалено Администратором]
Для Кота

Оффлайн aarrsseennyy

  • Житель
Re: как можно сделать matcap в cycles?
« Ответ #3 : 06 Ноябрь 2013, 21:01:40 »
Цитировать
... он немного грязный просто проверь что получиться ...

допустим такая картинка подойдет, допустим она была бы даже не грязная, но это несколько неудобно, хотя и работает. неуднбно тем, что картинку сферы маткапа нужно трансформировать такм образом (хотя, если через ноды в blender) или скриптом в Ps, то это удобно.

Цитировать
... выложи отдельно маску, matcap1 и matcap2 (ну и модель если не сложно) ...
я разобрался. выложить рабочий файл, я, к сожалению, не могу, но я сделал пример и прикладываю файл. в файле мартышка, 2 маткапа, маска. смотреть в ноды файл тут http://www.sendspace.com/file/fqnwwd

только таким образом удобно накладывать 2 маткапа, как сделать несколько масок и N маткапов на объекте в данном случае не догадываюсь.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: как можно сделать matcap в cycles?
« Ответ #4 : 06 Ноябрь 2013, 21:41:58 »
>> или скриптом в Ps, то это удобно.
... постараюсь завтра сделать OSL скрипт, тогда действительно ненужно будет промежуточного шага с трансформацией ...

... но может cycles и не нужен, вот что если по поводу смешивания "matcap" в internal ...


... файл с примером ...
http://files.mail.ru/7A66DF4F090E483CB7B98C8350F65379

... и мувик как делать ...
out 14
« Последнее редактирование: 06 Ноябрь 2013, 22:38:36 от sungreen »
Для Кота

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: как можно сделать matcap в cycles?
« Ответ #5 : 07 Ноябрь 2013, 07:03:49 »
... написал "OSL" скрипт для конвертации "Matcap" в "Equirectangular" ...
... нужно просто подставить  изображение и отрендерить ...
... в результате можно получить необходимые текстуры окружения для узла "Environment Texture" ...
... думаю это не сложно, и появляется возможность микшировать "Matcap" в "Cycles" ...
... во вложении файл для конвертации ...
... вот мувик как делать ...

out 15

... вот мувик как микшировать с учетом "UV карты" для "Cycles" ...
... либо через mixrgb либо mix shader ...

out 16

... добавлю несколько слов об OSL скрипте (для тех кому будет интересно) ...
... на нашем форуме была тема "изогнуть видео под сферическое зеркало", в которой упоминались работы Paul Bourke http://blender-3d.ru/forum/index.php/topic,414.msg5206.html#msg5206 , а предложенные им алгоритмы стали основой этого скрипта ...

http://paulbourke.net/dome/warpplayer/

... вот этот скрипт ...

Код: OSL
#include "stdosl.h"
shader simple(
vector Vi = 0,
output vector Vo = 0
){
    float x = Vi[0];
    float y = Vi[1];
     
    x = (2 * x - 1) * 2;
    y = 2 * y - 1;
   
    if(x>1) x = 2 - x;
    if(x<-1) x = -2 - x;

float theta = M_PI_2 + x * M_PI_2;
float phi = y * M_PI_2;

float px = cos(phi) * cos(theta);
float py = cos(phi) * sin(theta);
float pz = sin(phi);

theta = atan2(pz,px);
phi = atan2(sqrt(px*px+pz*pz),py);

float r = phi / M_PI_2;
float us = (1  + r * cos(theta)) / 2;
float vs = (1  + r * sin(theta)) / 2;
   
    Vo = vector(us,vs,0);
}





[вложение удалено Администратором]
« Последнее редактирование: 07 Ноябрь 2013, 07:23:21 от sungreen »
Для Кота

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: как можно сделать matcap в cycles?
« Ответ #6 : 08 Ноябрь 2013, 05:34:49 »
... вот еще вариант, третий уже ...



... дописал OSL скрипт, теперь можно использовать в "Cycles" текстуры "Matcap" без конвертации ...

out 23

... то есть на текущий момент получилось три варианта решения это задачи:
1) смешивать текстуры "Matcap" в "Internal"
2) конвертировать текстуры "Matcap" в "Equirectangular" и использовать ноды "Environment Texture" для смешивания в "Cycles"
3) вариант использовать OSL скрипт, который трансформирует вектор таким образом чтобы стандарная нода "Image Texture" c "Matcap" работала как и нода "Environment Texture" с изображением "Equirectangular" ...

out 25

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

... вот код OSL скрипта ...
Код: OSL
// name: matcap_emul_for_cycles
// author: sungreen
// version: (0, 1, 2)
// blender: (2, 6, 9)
// description: matcap for cycles
// url: [url]http://blender-3d.ru/forum/index.php/topic,602.msg6155/topicseen.html#msg6155[/url]

#include "stdosl.h"
#include "node_color.h"

vector to_fish(vector Vi)
{
    float x = Vi[0];
    float y = Vi[1];
    float z = Vi[2];

float u = -atan2(y, x) / (M_2PI) + 0.5;
float v = atan2(z, hypot(x,y)) / M_PI + 0.5;
     
    x = (2 * u - 1) * 2;
    y = 2 * v - 1;
   
    if(x>1) x = 2 - x;
    if(x<-1) x = -2 - x;

float theta = M_PI_2 + x * M_PI_2;
float phi = y * M_PI_2;

float px = cos(phi) * cos(theta);
float py = cos(phi) * sin(theta);
float pz = sin(phi);

theta = atan2(pz,px);
phi = atan2(sqrt(px*px+pz*pz),py);

float r = phi / M_PI_2;
float us = (1  + r * cos(theta)) / 2;
float vs = (1  + r * sin(theta)) / 2;
   
    return vector(us,vs,0);
}

shader node_environment_texture(
vector Vi = N,
output vector Vo = 0.0)
{

vector p = Vi;
    p = transform("world","camera",p);

    p = rotate(p, M_PI_2, vector(0,0,0), vector(1,0,0));
    p = rotate(p, M_PI_2, vector(0,0,0), vector(0,0,1));

    p = normalize(p);
    p = to_fish(p);

    Vo = p;
}

« Последнее редактирование: 08 Ноябрь 2013, 05:49:27 от sungreen »
Для Кота

Оффлайн aarrsseennyy

  • Житель
Re: как можно сделать matcap в cycles?
« Ответ #7 : 09 Ноябрь 2013, 18:17:50 »
 ;D
Цитировать

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


Супер! Это то, что надо, но вот беда... блендер стал падать после рендеринга с OSL на некоторых сценах , но вы молодец.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: как можно сделать matcap в cycles?
« Ответ #8 : 09 Ноябрь 2013, 18:26:59 »
... конечно в коде могут быть блохи, но если падает в конкретном месте и проявляется каждый раз, то могу в дебаггере посмотреть в чем проблема ...
... с конвертацией текстур должно быть по-стабиленее ...
Для Кота

Оффлайн aarrsseennyy

  • Житель
Re: как можно сделать matcap в cycles?
« Ответ #9 : 09 Ноябрь 2013, 18:42:50 »
Нет все ок. это просто сцена была с глючащей группой нодов. пока все ок.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: как можно сделать matcap в cycles?
« Ответ #10 : 09 Ноябрь 2013, 19:04:16 »
>>но вы молодец.
... аллаверды, спасибо за интересную тему; даже если и есть готовое или более простое решение, то было интересно поднапрячь мозг в сжатые сроки ...
Для Кота

Оффлайн aarrsseennyy

  • Житель
Re: как можно сделать matcap в cycles?
« Ответ #11 : 20 Сентябрь 2018, 13:45:19 »
Некропост, конечно, но в 2.79 я заметил, что не корректно работает скрипт

Оффлайн Samovar

  • Житель
Re: как можно сделать matcap в cycles?
« Ответ #12 : 22 Сентябрь 2018, 10:09:47 »
Вариант без скрипта:

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: как можно сделать matcap в cycles?
« Ответ #13 : 22 Сентябрь 2018, 19:59:47 »
>> Вариант без скрипта:
... если это работает и даёт адекватный результат, то просто супер, поскольку однозначно быстрее в силу того, что можно на вычислять на gpu ...

Оффлайн Samovar

  • Житель
Re: как можно сделать matcap в cycles?
« Ответ #14 : 23 Сентябрь 2018, 14:19:20 »
Не знаю насколько результат адекватен. Для вида именно из камеры, вроде, нормально работает. Во всяком случае, можно настроить масштаб по X и Y, вместо 0.5, поставив 0.48 или 0.49

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 67
Автор: LEXA ANЭGROWND
blender.png
Скачано: 77
Автор: ipv2007
4.png
Скачано: 99
Автор: hiroyukiss
2.png
Скачано: 121
Автор: hiroyukiss

Скачано: 111
Автор: Dilifa12