Я использую следующий сценарий для актива рисования, найденного на этом веб-сайте .
Когда вы визуализируете лица своего я sh в ультрафиолетовом пространстве меня sh Вы восстанавливаете острова по одному треугольнику за раз. На краях острова может быть так, что из-за недооценки растеризатор не учитывает пиксель, который на самом деле находится на острове. Для этих пикселей ни один пиксельный шейдер не будет выполнен, и у вас останется складка. (текст и изображение взяты с сайта)
Основная идея c состоит в том, что каждый кадр после обновления текстуры краски, я запустите шейдер по всей текстуре и, используя фильтр и предварительно запеченную маску ультрафиолетовых островов, вытяните острова наружу.
Проблема в том, что он не работает на iPhone. Нет ошибок, нет странных раскрасок, похоже, что скрипт не применяется. Я не уверен, откуда возникла проблема. Может быть, для циклов for или буферов команд, используемых в c#.
Shader "Unlit/FixIlsandEdges"
{
SubShader
{
// =====================================================================================================================
// TAGS AND SETUP ------------------------------------------
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
// =====================================================================================================================
// DEFINE AND INCLUDE ----------------------------------
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
// =====================================================================================================================
// DECLERANTIONS ----------------------------------
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
uniform float4 _MainTex_TexelSize;
sampler2D _IlsandMap;
// =====================================================================================================================
// VERTEX FRAGMENT ----------------------------------
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
float map = tex2D(_IlsandMap,i.uv);
float3 average = col;
if (map.x < 0.2) { // only take an average if it is not in a uv ilsand
int n = 0;
average = float3(0., 0., 0.);
for (float x = -1.5; x <= 1.5; x++) {
for (float y = -1.5; y <= 1.5; y++) {
float3 c = tex2D(_MainTex, i.uv + _MainTex_TexelSize.xy*float2(x, y));
float m = tex2D(_IlsandMap, i.uv + _MainTex_TexelSize.xy*float2(x, y));
n += step(0.1, m);
average += c * step(0.1, m);
}
}
average /= n;
}
col.xyz = average;
return col;
}
ENDCG
}
}
}
Я где-то читал, что использование tex2D в циклах for - это большая проблема. нет, поэтому я изменил это на tex2Dlod, но происходит то же самое.
Вы можете проверить Git проект здесь
Я полностью потерян на этом и гугл не очень помогает. Спасибо за любые комментарии.