Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Эффекты/Шейдеры

Ответ
 
Опции темы
Старый 06.01.2018, 18:16   #1
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений
(для 103 пользователей)
Аналог стандартного Terrain шейдера

Взял за основу FourSplit и хотелось бы чтобы все 4 слоя поддерживали Tiling и Offset. Собственно сам шейдер:

     SubShader {
         Tags { "RenderType"="Opaque" }
         LOD 200
         
         CGPROGRAM
         // Physically based Standard lighting model, and enable shadows on all light types
         #pragma surface surf Standard
 
         // Use shader model 3.0 target, to get nicer looking lighting
         #pragma target 2.0
 
         sampler2D _TileTextureR;
         sampler2D _TileTextureG;
         sampler2D _TileTextureB;
         sampler2D _TileTextureA;
         sampler2D _BlendTex;
 
         struct Input {
             float2 uv_TileTextureR;
             float2 uv_TileTextureG;
             float2 uv_TileTextureB;
             float2 uv_TileTextureA;
             float2 uv_BlendTex;
         }; 
 
         void surf (Input IN, inout SurfaceOutputStandard o) 
         {
             fixed4 blend = tex2D(_BlendTex, IN.uv_BlendTex); 
             fixed4 c = 
                 tex2D(_TileTextureR, IN.uv_TileTextureR) * blend.r + 
                 tex2D(_TileTextureG, IN.uv_TileTextureG) * blend.g + 
                 tex2D(_TileTextureB, IN.uv_TileTextureB) * blend.b + 
                 tex2D(_TileTextureA, IN.uv_TileTextureB) * abs(1 - blend.a);
             o.Albedo = c.rgb;
         }
         ENDCG
     }
Стоит заменить

tex2D(_TileTextureA, IN.uv_TileTextureB) * abs(1 - blend.a);
на

tex2D(_TileTextureA, IN.uv_TileTextureA) * abs(1 - blend.a);
Выходит ошибка:
"Too many texture interpolations ... (11 out of max 10)"

В шейдерах не силен, что в коде нужно исправить, чтобы обойти это ограничение?
(Offline)
 
Ответить с цитированием
Старый 06.01.2018, 22:11   #2
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений
(для 103 пользователей)
Ответ: Аналог стандартного Terrain шейдера

Кое что откопал:

https://docs.unity3d.com/Manual/SL-ShaderSemantics.html

Сообщение от docs.unity3d.com
Interpolator count limits

There are limits to how many interpolator variables can be used in total to pass the information from the vertex into the fragment shader. The limit depends on the platform and GPU, and the general guidelines are:

Up to 8 interpolators: OpenGL ES 2.0 (iOS/Android), Direct3D 11 9.x level (Windows Phone) and Direct3 9 shader model 2.0 (old PCs). Since the interpolator count is limited, but each interpolator can be a 4-component vector, some shaders pack things together to stay within limits. For example, two texture coordinates can be passed in one float4 variable (.xy for one coordinate, .zw for the second coordinate).
Up to 10 interpolators: Direct3D 9 shader model 3.0 (#pragma target 3.0).
Up to 16 interpolators: OpenGL ES 3.0 (iOS/Android), Metal (iOS).
Up to 32 interpolators: Direct3D 10 shader model 4.0 (#pragma target 4.0).

Regardless of your particular target hardware, it is generally a good idea to use as few interpolators as possible for performance reasons.
(Offline)
 
Ответить с цитированием
Старый 07.01.2018, 00:47   #3
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Аналог стандартного Terrain шейдера

Юнити трансформирует все эти uv_ в вертексном шейдере и передаёт в пиксельный, и ты не влезаешь в количество передаваемых данных. Можно пойти другим путём - объявить свои собственные Vector4 параметры тайлинга/оффсета и плющить ими одинаковые uv внутри surf функции (типа IN.дефолтныеUv * tilingOffsetR.xy + tilingOffsetR.zw).
Это может быть мизерно медленнее, чем в вертексном, но должно работать и влезать.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Evgen (07.01.2018)
Старый 07.01.2018, 16:31   #4
Evgen
Разработчик
 
Аватар для Evgen
 
Регистрация: 12.01.2011
Адрес: Moscow
Сообщений: 424
Написано 70 полезных сообщений
(для 103 пользователей)
Ответ: Аналог стандартного Terrain шейдера

Впрочем к чему эта морока, скачал стандартный Nature/Terrain/Diffuse с официального сайта, можно использовать... Запустил работает. Единственное немного запнулся с цветами текстуры маски Terrain.

В экспериментах. Для извлечения текстуры маски из готового Terrain в png использовал инструмент:
https://mattgadient.com/2014/09/28/u...tmap-to-a-png/
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:36.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com