ну взагалі, принцип по якому робляться аутлайн шейдера приблизно однаковий ..
вони просто роблять офсет Норман точки, і ріют це під звичайної геометрії.
і така рванина як ти зобразив з'являється тільки коли групи згладжування у обекта різні.
в загальному щоб аутлайн був нормальний, його потрібно кидати на меш, де все Еджі м'які.
інших способів обійти подібні косяки я не знаю. та й взагалі як на мене, їх немає))
magoga писал (а): ну взагалі, принцип по якому робляться аутлайн шейдера приблизно однаковий ..
вони просто роблять офсет Норман точки, і ріют це під звичайної геометрії.
і така рванина як ти зобразив з'являється тільки коли групи згладжування у обекта різні.
в загальному щоб аутлайн був нормальний, його потрібно кидати на меш, де все Еджі м'які.
інших способів обійти подібні косяки я не знаю. та й взагалі як на мене, їх немає))
че-т я не допер ось цю фразу
вони просто роблять офсет Норман точки, і ріют це під звичайної геометрії.
нормаль - це ж просто вектор, який перпендикулярний точці, і це ж начебто значення від 0 до 1, або нє? Яким чином зміна нормалі може відобразити лінію?
нормаль - це ж просто вектор, який перпендикулярний точці, і це ж начебто значення від 0 до 1, або нє? Яким чином зміна нормалі може відобразити лінію?
не зовсім так. та він нормалізований має значення від 0 до 1 і вони використовуються чисто для направлення.
float3 norm = mul ((float3x3) UNITY_MATRIX_IT_MV, v.normal);
float2 offset = TransformViewToProjection (norm.xy);
o.pos.xy + = offset * _Outline;
кароче. float3 norm = mul ((float3x3) UNITY_MATRIX_IT_MV, v.normal); -берется нормал (напрямок) кожної точки, TransformViewToProjection (norm.xy) - конверт в екранні координати,
o.pos.xy + = offset - і прабляются а o.pos (позіі точок ..) (o.pos.xy - екранні координати кожної точки + offset (екранні напрямки кожного Норман))
ну і потім ще можна помножити _Outline. проблема в тому, що якщо у тебе жорсткий едж. то у кожної точки ставноіся 2 Норман, що вказують в різні боки. і через це при прібаленіі offset і виходить що куб у тебе розлетівся, тк кожна його сторона офсет куди вказує нормалі у точок
блииин, че ж ви не сказали про додаткову бібліотеку і appdata_base, пів години витратив на це. Слухайте, я ось так запив
Shader "beginners / 1 flat color" # 123;
Properties # 123;
_Color # 40; "_Color". Color # 41; = # 40; 1.0. 1.0. 1.0. 1.0 # 41;
_Outline # 40; "Outline". Range # 40; 0. 1 # 41; # 41; = 0.5
# 125;
SubShader # 123;
Pass # 123;
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _Color;
float _Outline;
struct vertexInput # 123;
float4 vertex. POSITION;
float4 normal. NORMAL;
# 125; ;
struct vertexOutput # 123;
float4 pos. SV_POSITION;
float4 col. COLOR;
# 125; ;
vertexOutput vert # 40; appdata_base v # 41;
# 123;
vertexOutput o;
o. pos = mul # 40; UNITY_MATRIX_MVP. v. vertex # 41; ;
float3 norm = mul # 40; # 40; float3x3 # 41; UNITY_MATRIX_IT_MV. v. normal # 41; ;
float2 offset = TransformViewToProjection # 40; norm. xy # 41; ;
o. pos. xy + = offset * _Outline;
return o;
# 125;
float4 frag # 40; vertexOutput i # 41 ;. COLOR
# 123;
return _Color;
# 125;
хз че тут не так, але у мене об'єкти просто розростається в усі сторони, Аутлайн ніякої нема
magoga писал (а): ну вона не додаткова а як там не є стандартна, appdata_base, appdata_full тощо. це просто набір стандартних інпут для вертек шейдеров ..
до речі якщо її юзаешь то тобі
struct vertexInput
float4 vertex. POSITION;
float4 normal. NORMAL;
>;
ну потрібен ..
да я понел, що не потрібен. Та тільки нафіга взагалі створювати свої структури, якщо можна юзати стандартні? Так само я не розібрався, чому при тому коді, який я скинув, об'єкт збільшується в усі три сторони, через це ніякого Аутлайн нету, а цілий аутоб'ект. Кстате, цей шейдер же повинен мати два проходи? У першому малюється аутлайн, а в другому звичайний об'єкт?
Просто куб - це не той об'єкт, який добре виглядає з оутлайном. Зменшіть відстань для оутлайна ( "товщину" лінії).
так ні ж, у мене зовсім не те, тут треба хімічити з глибиною, ящітаю. Ось як куб виглядає без Аутлайн, з найменшим Аутлайн, і з цим же Аутлайн але з іншого боку
p.s. дивитися знизу вгору!
Для освітлення, потрібні нормалі, спрямовані як на зображенні зліва, а для видавлювання Аутлайн, як нормалі справа. Зробіть 2 набору нормалей, 1вие- нехай зберігаються в нормальний, а другі в кольорах вершин.
Так чи інакше, потрібно робити 2 паса: 1 Cull Front, 2 Cull Back, т.ч. ИМХО швидше ніж 2 окремих об'єкта, буде тільки, для скінед мешів.
-------------
Аутлайн, можна малювати і пост ефектом, в проекті shader-replacement. є приклад Аутлайн, по різницями глибин і нормалей.
пост обробка нажоріста имхо.
а от зробити 2 пака нормалей, один в кольорі другий в звичайному нормале, це норм. колір для Аутлайн, звичайні нормалі для освітлення.