Можно ли как-то извлечь переменную из шейдера?

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

Можно ли как-то извлечь переменную из шейдера?

Сообщение 4ufak 05 янв 2012, 11:15

Например, если я хочу узнать средний цвет пикселя. Анализировать из скриптов - это примерно миллион пикселей, по которым надо пройти, и вряд ли это будет быстро. Делать отдельный рендер в текстуру меньшего размера - тоже не катит, сцена и так сложная.

А из шейдера это можно сделать побыстрее. Например, как я понял, вот так:

Синтаксис:
Используется glsl
Shader "Hidden/Test Effect" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
        }
       
        SubShader {
                Pass {
                        ZTest Always Cull Off ZWrite Off
                        Fog { Mode off }
       
                        CGPROGRAM
                                #pragma vertex vert_img
                                #pragma fragment frag
                                #pragma fragmentoption ARB_precision_hint_fastest
                                #include "UnityCG.cginc"
                               
                                uniform sampler2D _MainTex;
                                fixed total_r = 0;
                                fixed total_g = 0;
                                fixed total_b = 0;
                               
                                fixed4 frag (v2f_img i): COLOR {
                                        fixed4 orig = tex2D(_MainTex, i.uv);
                                       
                                        total_r += orig.rr;
                                        total_g += orig.gg;
                                        total_b += orig.bb;
                               
                                        return orig;
                                }
                        ENDCG
                }
        }
       
        Fallback off
}


Только вот как потом из него извлечь total_r, total_g и total_b?
Аватара пользователя
4ufak
UNец
 
Сообщения: 39
Зарегистрирован: 23 мар 2011, 18:50
Откуда: Россия, Москва
  • ICQ

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение Woolf 05 янв 2012, 13:13

Только через костыли в виде, к примеру, некой выходной текстуры с нужным вам цветом.
Я бы рекомендовал для решения данной задачи делать именно через рендер в текстуру таокго же размера, как и исходная, но на выходе вы получите текстуру со средним цветом. Тем более, вам что, каждый кадр это делать надо?
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение 4ufak 05 янв 2012, 14:14

Да, каждый кадр.

Сделал рендер в текстуру - 32 * 32 пикселя, занимает 0.4 мс. Неплохо, надеюсь, такого размера хватит.
Аватара пользователя
4ufak
UNец
 
Сообщения: 39
Зарегистрирован: 23 мар 2011, 18:50
Откуда: Россия, Москва
  • ICQ

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение gnoblin 05 янв 2012, 14:42

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

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение 4ufak 05 янв 2012, 15:04

Хотел сделать нечто вроде HDR. (Кстати, почти сделал - осталось подобрать пару формул для более качественной работы). Только вот сейчас почитал, что, во-первых, в Unity 3.5 (бета-версия которой уже готова) есть готовый HDR, и, во-вторых... Вот, короче. То есть, моя версия явно был негодна. Теперь сижу и думаю - доделывать мою версию или скачать Unity 3.5.

Кстати, вот здесь - очень неплохой, на мой вкус, HDR. На Unity, не 3.5. Там и строчка интересная есть - "64Fp render texture;". Знать бы, как это делается.
Аватара пользователя
4ufak
UNец
 
Сообщения: 39
Зарегистрирован: 23 мар 2011, 18:50
Откуда: Россия, Москва
  • ICQ

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение waruiyume 05 янв 2012, 15:09

Вопрос из той-же оперы: как получить вершины из вертекс шейдера?
Вода и физика воды, мысли, идеи?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение Woolf 05 янв 2012, 15:17

waruiyume писал(а):Вопрос из той-же оперы: как получить вершины из вертекс шейдера?
Вода и физика воды, мысли, идеи?


ответ из той же оперы - НЕВОЗМОЖНО! Только в виде текстуры. Так уж устроены видеокарты, в неё можно, назад - нельзя. Я сразу предупреждаю - чтение данных из текстуры, находящейся в видеопамяти ОЧЕНЬ медленная операция.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение Woolf 05 янв 2012, 15:19

4ufak писал(а):Хотел сделать нечто вроде HDR. (Кстати, почти сделал - осталось подобрать пару формул для более качественной работы). Только вот сейчас почитал, что, во-первых, в Unity 3.5 (бета-версия которой уже готова) есть готовый HDR, и, во-вторых... Вот, короче. То есть, моя версия явно был негодна. Теперь сижу и думаю - доделывать мою версию или скачать Unity 3.5.

Кстати, вот здесь - очень неплохой, на мой вкус, HDR. На Unity, не 3.5. Там и строчка интересная есть - "64Fp render texture;". Знать бы, как это делается.


Сказали бы раньше, вам бы и ответили про то, что он уже есть ) Правда, в про онли.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение 4ufak 06 янв 2012, 12:40

А вот еще одно применение извлечению переменной из шейдера: нужно добиться того, чтобы блик на объекте был очень маленьким. И резким. Как тут, например. Вот кусок шейдера, который получился у меня (собирал на Strumpy Shader Editor):

Синтаксис:
Используется glsl
                        inline half4 LightingBlinnPhongEditor_PrePass (EditorSurfaceOutput s, half4 light){
                                float4 Subtract0 = light - _Minimum.xxxx;
                                float4 Max0 = max (Subtract0, float4 (0.0, 0.0, 0.0, 0.0));
                                float4 Multiply1 = Max0 * _Multipler.xxxx;
                                return Multiply1;
                        }


light - освещенность участка, так? В этом коде, если освещенность меньше, чем _Minimum, вернется ноль, иначе - много-много-много (_Multipler - нечто очень большое). Но для разных источников света нужен разный _Minimum. Т.е., в идеале - я сохраняю куда-нибудь максимальное значение light из предыдущего кадра, а затем в качестве _Minimum использую ([предыдущий light] - [небольшое число]).

Либо, может, передавать шейдеру координаты ближайших источников света, и рассчитывать блики вручную... :-?

Так чаще всего, пока опишу свою проблему - решение, пусть и не самое лучшее, но найду. А может, можно обойтись одним шейдером?
Аватара пользователя
4ufak
UNец
 
Сообщения: 39
Зарегистрирован: 23 мар 2011, 18:50
Откуда: Россия, Москва
  • ICQ

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение gnoblin 06 янв 2012, 12:51

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

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение 4ufak 06 янв 2012, 13:07

Да, но блик никогда не получается по-настоящему маленьким.

Изображение
Аватара пользователя
4ufak
UNец
 
Сообщения: 39
Зарегистрирован: 23 мар 2011, 18:50
Откуда: Россия, Москва
  • ICQ

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение 4ufak 06 янв 2012, 13:13

Задача снимается, похоже, шейдером такое не сделать. Нужны слишком высокополигональные модели.
Аватара пользователя
4ufak
UNец
 
Сообщения: 39
Зарегистрирован: 23 мар 2011, 18:50
Откуда: Россия, Москва
  • ICQ

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение gnoblin 06 янв 2012, 17:57

да вроде у всех блики нормальные, попробуйте bumped spec с картой нормалей :)

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

Re: Можно ли как-то извлечь переменную из шейдера?

Сообщение gamoga 07 янв 2012, 00:15

если у стандартного спекуляр шейдера получается недостаточно узкий блик, то можно либо увеличить в свойствах шейдера
(_Shininess ("Shininess", Range (0.01, 1)) = 0.07) Range (0.01, 1) >> Range (0.01, 6)
ну или
в строке (o.Specular = _Shininess;) >> (o.Specular = _Shininess * 10) сделать
gamoga
UNец
 
Сообщения: 1
Зарегистрирован: 20 авг 2010, 00:43


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

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

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