Объясните пару строчек кода
Добавлено: 14 авг 2013, 20:21
Нашел на форуме движка ПостЭффект радиального размытия, добавил изменение цвета для своих нужд. В принципе всё работает, почти всё устраивает, но хочется понять как работает размытие. Почти всё понятно кроме парочки строчек. Вот код:
теперь вопросы Что это за сэмплы, откуда их взяли и с чем их кушать???
что вообще здесь происходит???
и почему среднее арифметическое(если я правильно понял)равно sum/11 если сэмплов 10
Синтаксис:
- Shader "MyShaders/radialBlur" {
- Properties {
- _MainTex ("Input", RECT) = "white" {}
- _BlurStrength ("", Float) = 0.5
- _BlurWidth ("", Float) = 0.5
- }
- SubShader {
- Pass {
- ZTest Always Cull Off ZWrite Off
- Fog { Mode off }
- CGPROGRAM
- // Upgrade NOTE: excluded shader from DX11, Xbox360, OpenGL ES 2.0 because it uses unsized arrays
- #pragma exclude_renderers d3d11 xbox360 gles
- #pragma target 3.0
- #pragma vertex vert
- #pragma fragment frag
- #pragma fragmentoption ARB_precision_hint_fastest
- #include "UnityCG.cginc"
- struct v2f {
- float4 pos : POSITION;
- float2 uv : TEXCOORD0;
- };
- uniform sampler2D _MainTex;
- uniform half _BlurStrength;
- uniform half _BlurWidth;
- uniform half _iWidth;
- uniform half _iHeight;
- uniform float _Colr;
- uniform float _Colg;
- v2f vert (appdata_img v)
- {
- v2f o;
- o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
- o.uv = MultiplyUV (UNITY_MATRIX_TEXTURE0, v.texcoord);
- return o;
- }
- half4 frag (v2f i) : COLOR {
- half4 color = tex2D(_MainTex, i.uv);
- // некоторые образцы позиций
- half samples[10] = half[](-0.08,-0.05,-0.03,-0.02,-0.01,0.01,0.02,0.03,0.05,0.08); // вот это мне непонятно
- //вектор к центру экрана
- half2 dir = 0.5 * half2(_iHeight,_iWidth) - i.uv;
- //расстояние до центра
- half dist = sqrt(dir.x*dir.x + dir.y*dir.y);
- //нормализация направления
- dir = dir/dist;
- //дополнителные сэмплы в сторону экрана
- half4 sum = color;
- for(int n = 0; n < 10; n++) //и вот это непонятно
- {
- sum += tex2D(_MainTex, i.uv + dir * samples[n] * _BlurWidth * _iWidth);
- }
- //11 Сэмплов. ??? почему 11 если samples[10]
- sum *= 1.0/11.0;
- //сила размытия в зависимости от расстояния до центра экрана
- half t = dist * _BlurStrength / _iWidth;
- t = clamp(t, 0.0, 1.0);
- //объединяем оригинальную текстуру с размытой
- color = lerp(color, sum, t);
- //добавляем цвет
- color.r*=_Colr;
- color.g*=_Colg;
- return color;
- }
- ENDCG
- }
- }
- }
теперь вопросы Что это за сэмплы, откуда их взяли и с чем их кушать???
Синтаксис:
- half samples[10] = half[](-0.08,-0.05,-0.03,-0.02,-0.01,0.01,0.02,0.03,0.05,0.08); // вот это мне непонятно
что вообще здесь происходит???
Синтаксис:
- //дополнителные сэмплы в сторону экрана(Перевёл гуглом:D)
- half4 sum = color; //и вот это непонятно
- for(int n = 0; n < 10; n++)
- {
- sum += tex2D(_MainTex, i.uv + dir * samples[n] * _BlurWidth * _iWidth);
- }
и почему среднее арифметическое(если я правильно понял)
Синтаксис:
- sum *= 1.0/11.0;