Помогите с Шейдером =)

Шейдеры и все-все-все.

Помогите с Шейдером =)

Сообщение Jakobs 28 ноя 2011, 04:41

Честно говоря походу у меня проблема с понятием того как работают шейдера и упираясь в это сложно научится их писать...
вот в чем проблема надо написать шейдер, который будет имитировать грани объектов как в ПиксельАрте, допустим взять куб в объёме без перспективы, и надо сделать так чтоб зрительно видимые ребра внутри куба были светлые а внешние видимые тёмные
Пример:
Изображение

сложно такое сделать?
Аватара пользователя
Jakobs
UNIт
 
Сообщения: 103
Зарегистрирован: 08 янв 2010, 01:09
Откуда: Киев, Украина
  • Сайт
  • ICQ

Re: Помогите с Шейдером =)

Сообщение gnoblin 28 ноя 2011, 05:29

для внешних ребер можно взять рамку из toon шейдера (есть стандартный пакадж)

для внутренних - поискать wireframe шейдер для юнити (или рисовать сетку как-то еще)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Помогите с Шейдером =)

Сообщение Jakobs 28 ноя 2011, 06:27

gnoblin писал(а):для внешних ребер можно взять рамку из toon шейдера (есть стандартный пакадж)

для внутренних - поискать wireframe шейдер для юнити (или рисовать сетку как-то еще)


и первая проблема в Орторграфической камере пропадает рамка из тун шейдера =(
Аватара пользователя
Jakobs
UNIт
 
Сообщения: 103
Зарегистрирован: 08 янв 2010, 01:09
Откуда: Киев, Украина
  • Сайт
  • ICQ

Re: Помогите с Шейдером =)

Сообщение gnoblin 28 ноя 2011, 12:05

запости шейдер, поправим (насколько я помню там в одном месте можно убрать домножение на z (?)) и тогда рамка будет разной толщины в зависимости от расстояния до камеры
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Помогите с Шейдером =)

Сообщение Jakobs 30 ноя 2011, 05:51

gnoblin писал(а):запости шейдер, поправим (насколько я помню там в одном месте можно убрать домножение на z (?)) и тогда рамка будет разной толщины в зависимости от расстояния до камеры

поправил уже =)
проблема осталась с внутренними ребрами =( пока что вижу решении только в том чтоб рисовать в текстуре их...
Аватара пользователя
Jakobs
UNIт
 
Сообщения: 103
Зарегистрирован: 08 янв 2010, 01:09
Откуда: Киев, Украина
  • Сайт
  • ICQ

Re: Помогите с Шейдером =)

Сообщение Ashvar 30 ноя 2011, 08:26

А вот у меня была проблема как избавиться от такого эффекта =)
Можно с нормалями поиграться - сделать нормаль на грани направленной как сумма векторов нормалей поверхности. То есть чтобы нормаль была направлена к смотрящему. При этом если свет идёт от смотрящего то грань будет светлее, а поверхности того же света. Ну тут всё опять же упирается в написание соответствующего шейдера, который бы обрабатывал эти нормали "как надо". Но это точно решаемо!
Ashvar
UNIт
 
Сообщения: 62
Зарегистрирован: 20 ноя 2011, 16:22

Re: Помогите с Шейдером =)

Сообщение IDoNotExist 30 ноя 2011, 08:39

Strumpy Shader Editor ктонибудь пробовал нее? Может быть поможет.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Помогите с Шейдером =)

Сообщение Jakobs 01 дек 2011, 11:03

IDoNotExist писал(а):Strumpy Shader Editor ктонибудь пробовал нее? Может быть поможет.

Сейчас сижу и пробую ^^

Ashvar писал(а):А вот у меня была проблема как избавиться от такого эффекта =)
Можно с нормалями поиграться - сделать нормаль на грани направленной как сумма векторов нормалей поверхности. То есть чтобы нормаль была направлена к смотрящему. При этом если свет идёт от смотрящего то грань будет светлее, а поверхности того же света. Ну тут всё опять же упирается в написание соответствующего шейдера, который бы обрабатывал эти нормали "как надо". Но это точно решаемо!


ууухх сложно, плюс я не имею опыта работы с шейдерами =)

и я думаю сделать так: подсветить все ребра в объекте, и внешние рёбра просто закрыть чёрной рамкой =)
Аватара пользователя
Jakobs
UNIт
 
Сообщения: 103
Зарегистрирован: 08 янв 2010, 01:09
Откуда: Киев, Украина
  • Сайт
  • ICQ

Re: Помогите с Шейдером =)

Сообщение magoga 17 дек 2011, 18:26

я в принципе знаю как и могу написать этот шейдер. есть несколько вариантов. токо мне нужно знать пару моментов.
есть 1 хороший вариант для контурно обводки но он будет нормально работать токо на примитивах типа куба, сферы, цилиндра и пр.
отсюда вопрос: ты намерен использовать этот шейдер токо на кубиках или будут объекты сложной формы?
и второй вопрос на диффуз нужна текстура или цвет будет?
Аватара пользователя
magoga
UNIт
 
Сообщения: 98
Зарегистрирован: 22 мар 2010, 21:08

Re: Помогите с Шейдером =)

Сообщение magoga 18 дек 2011, 22:45

вот набросал первую версию, получилось примерно так как и задумывал, правда пока без освещения. )) как будет время доделаю
Изображение
Синтаксис:
Используется glsl
Shader "linedShader"
{
        Properties
        {
                _Color ("Main Color", Color) = (0.5,0.5,0.5,1)
                _OutlineColor ("Outline Color", Color) = (0,0,0,1)
                _InlineColor ("Inline Color", Color) = (0,0,0,1)
                _Outline ("Outline width", Range (.002, 0.008)) = .005
                _MainTex ("Base (RGB)", 2D) = "white" {}

        }

        SubShader
        {
        pass
                {
                        Tags {"Queue"="Geometry"}
                       
                       
                        CGPROGRAM

                        #pragma exclude_renderers gles
                        #pragma vertex vert
                               
                        struct appdata
                        {
                                float4 vertex : POSITION;
                        };

                        struct v2f
                        {
                                float4 pos : POSITION;
                                float4 color : COLOR;
                        };
                       
                        float _Outline;
                        float4 _InlineColor;
                       
                        v2f vert(appdata v)
                        {
                                v2f o;
                                v.vertex.xyz *= 1 -  _Outline * 1.1;
                                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.color = _InlineColor;
                                return o;
                        }
                       
                        ENDCG
                }
       
                pass
                {
                        Tags {"Queue"="Geometry+1"}
                       
                        CGPROGRAM

                                #pragma exclude_renderers gles
                                #pragma vertex vert
                                #include "UnityCG.cginc"
                               
                        struct appdata
                        {
                                float4 vertex : POSITION;
                                float3 normal : NORMAL;
                                float2 texcoord : TEXCOORD0;
                        };

                        struct v2f
                        {
                                float4 pos : POSITION;
                                //float4 color : COLOR;
                                float2 texcoord : TEXCOORD0;
                        };
                       
                         float _Outline;
                        //float4 _Color;
                        float4 _MainTex_ST;
                       
                        v2f vert(appdata v)
                        {
                                v2f o;
                                v.vertex.xyz *= 1 -  _Outline ;
                                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                               

                                float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
                                float2 offset = TransformViewToProjection(norm.xy);
                               
                                o.pos.xy += offset  * _Outline;  // * o.pos.z ;
                                //o.color = _Color;
                                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                                return o;
                }
               
                ENDCG
               
               
               
                SetTexture [_MainTex]
                {
                 combine texture * primary, constant
                }
                SetTexture [_MainTex]
                {
                ConstantColor [_Color]
                 combine constant * previous , texture
                }
               
                }
               
                pass
                {
                        Tags {"Queue"="Geometry+2"}
                        Tags { "LightMode" = "Always" }
                        Cull Front
                        ZWrite On
                        ColorMask RGB
                        Blend SrcAlpha OneMinusSrcAlpha
                       
                       
                        CGPROGRAM
                                #pragma exclude_renderers gles
                                #pragma vertex vert
                                #include "UnityCG.cginc"
                               
                        struct appdata
                        {
                                float4 vertex : POSITION;
                                float3 normal : NORMAL;
                        };

                        struct v2f
                        {
                                float4 pos : POSITION;
                                float4 color : COLOR;
                        };
                       
                         float _Outline;
                         float4 _OutlineColor;
                       
                        v2f vert(appdata v)
                        {
                                v2f o;
                                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

                                float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
                                float2 offset = TransformViewToProjection(norm.xy);

                                o.pos.xy += offset  * _Outline * 2;  // * o.pos.z ;
                                o.color = _OutlineColor;
                                return o;
                }
                ENDCG
                }
        }
}
 
Аватара пользователя
magoga
UNIт
 
Сообщения: 98
Зарегистрирован: 22 мар 2010, 21:08

Re: Помогите с Шейдером =)

Сообщение Guyver 19 дек 2011, 07:28

а можно в 2 прохода:
в 1м чутка утолщаем мешик и рисуем чёрным ...
во 2м рисуем как есть .. с освещением и с чем там ещё нужно

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

кст помоему такое не сбатчится ... так что много плодить мелких обьектов - не советую.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Помогите с Шейдером =)

Сообщение magoga 19 дек 2011, 11:25

ну батч никто не просил ) более того 2х проходный тоже не будет бачится.
если внутренние линии можно руками нарисовать, то можно просто стандартный outline взять и не париться).
Аватара пользователя
magoga
UNIт
 
Сообщения: 98
Зарегистрирован: 22 мар 2010, 21:08


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5