Как правильно вектор положения источника света чрез vec3?

Для экспериментальных разработок и тем "я нашел чужой исходник, почему он не работает?"

Как правильно вектор положения источника света чрез vec3?

Сообщение Razor_V 28 ноя 2014, 14:32

Всем доброго времени суток! Суть вопроса заключается в том, что если использовать viewDir/lightDir, то результат получатся предсказуемым. А вот если использовать vec3(x,y,z) с значениями введенными ручками, то результат малость не предсказуемый и с побочными эффектами.
Догадываюсь, что viewDir/lightDir не используют x,y,z координаты, но тогда в каком виде они выдают результат?
Razor_V
UNец
 
Сообщения: 12
Зарегистрирован: 19 ноя 2014, 14:56

Re: Как правильно вектор положения источника света чрез vec3?

Сообщение Tolking 28 ноя 2014, 15:10

viewDir/lightDir это не положение - это направление.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2077
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как правильно вектор положения источника света чрез vec3?

Сообщение Razor_V 28 ноя 2014, 19:23

За ответ спасибо! Я малость ошибся в названии темы. Суть вопроса в том, как правильно задать вектор направления в ручную используя три компонента vec3?
Например:
в свойствах шейдера задан вектор(по дефолту он вектор4, но я использую только первых три компонента)....
Далее объявляю этот вектор как переменную...
Дошли до расчета света.
Синтаксис:
Используется csharp
   
 inline fixed3 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten)
 {
float difLight = max(0, dot (s.Normal, lightDir));
float4 col;
col.rgb = s.Albedo * _LightColor0.rgb * (difLight * atten * 2);
col.a = s.Alpha;
return col;
}
 

В данном примере направление вектора рассчитывается от направления вектора нормали(o.Normal) и вектора направленного в сторону источника света(lightDir). Если вместо вектора lightDir использовать свой вектор, то вроде бы все работает, но с косяками в виде чрезмерных засветок из за чего невозможно установить направление источника света с некоторых углов.
Razor_V
UNец
 
Сообщения: 12
Зарегистрирован: 19 ноя 2014, 14:56

Re: Как правильно вектор положения источника света чрез vec3?

Сообщение Tolking 28 ноя 2014, 20:10

Нормализуй свой вектор.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2077
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как правильно вектор положения источника света чрез vec3?

Сообщение Razor_V 01 дек 2014, 15:30

В целом помогло(от засветок), но если в шейдер прикрутить карту нормали, то результат не предсказуемый. При этом если использовать lightDir, то результат освещения не меняется хоть с картой нормали, хоть без(грубо говоря, он правильный и ожидаемый).

По ходу _LD необходимо как то(хз как) иначе задавать, либо конвертировать при помощи формулы(хз- какой).

Синтаксис:
Используется csharp
Shader "Custom/Custom_Diff" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _NormalTex ("Normal)", 2D) = "bump" {}
                _LD ("Light_Dir", Vector) = (1,1,1)
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf BasicDiffuse

                sampler2D _MainTex;
                sampler2D _NormalTex;
                fixed3 _LD;

                struct Input {
                        fixed2 uv_MainTex;
                };
               
               
                inline fixed4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten)
                {
                fixed3 lightD = normalize(_LD);
                fixed difLight = max(0, dot (normalize(s.Normal), lightD));
                fixed4 col;
                col.rgb = s.Albedo * _LightColor0.rgb * (difLight * atten * 2);
                col.a = s.Alpha;
                return col;
                }


                void surf (Input IN, inout SurfaceOutput o) {
//                  o.Normal = UnpackNormal (tex2D (_NormalTex, IN.uv_MainTex));
                        fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                }
                ENDCG
        }
        FallBack "Diffuse"
}
 
Razor_V
UNец
 
Сообщения: 12
Зарегистрирован: 19 ноя 2014, 14:56


Вернуться в Шейдерная кузня

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

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