Рубрики
HLSL HLSL "frag"

HLSL.frag «Функции»

//отобразить пиксель текстуры или нет 
Clip(bool?-1:0);

 

Рубрики
Component "Material" (.mat) HLSL

Material «понятие»

это инстанс шейдера
файл с расширением .mat

экземпляр какого-то шейдера, в котором мы заранее настраиваем значения свойств этого шейдера.

«/» слеш в имени шейдера
разбирает парсингом как меню
чем больше слешей, тем больше вложенностей в меню имени шейдера

Плюсы

  • изменение шейдера можно делать на лету
  • нам не требуется перекомпиляции
  • шейдер хранится в видеопамяти
  • шейдер выполняется всеми тысячами процессоров

Минус

требуется только бинарный шейдер компилировать

Подразделение на секции

  1. Properties
    отображается в инспекторе материала
    в этой секции описываем значения констант для второй секции
    написан на языке ShaderLab и является оберткой Unity для работы с шейдером под множеством устройств
  2. SubShader
    этой секции может быть несколько
    присутствие уникальных особенностей это параметры для Unity
    Tags, Cull,ZWrite,Fog,Blend
  • каждый шейдер
    это минимум три программы по порядку
  1. вертексный #pragma vertex name
  2. геометрический #pragma geo name
  3. фрагметный (пиксельный) #pragma fragment name

Рубрики
CgFx Examples "ShaderLab (CgFx,HLSL)" HLSL Surface Texture Unity

Шейдер «Срез Текстуры»

Shader "Custom/World/Cut"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
	_pov("pov", int) = 0
        _pos("Vector",vector) = (0,0,0,0)
    }
    SubShader
    {
    CGPROGRAM
    //surface
    #pragma surface surf Lambert
    //model
    #pragma target 3.0
    //vars
    sampler2D _MainTex;

    int _pov;
    fixed4 _pos;

    struct Input
    {
        float2 uv_MainTex;
        float3 worldPos;
    };

    void surf(Input IN, inout SurfaceOutput o)
    {
        switch (_pov)
        {
        case 0:
            clip(IN.worldPos.z > _pos.z ? 1 : -1);
            break;
        case 1:
            clip(IN.worldPos.x < _pos.x ? 1 : -1);
            break;
        case 2:
            clip(IN.worldPos.z > _pos.z ? 1 : -1);
            break;
        case 3:
            clip(IN.worldPos.x < _pos.x ? 1 : -1);
            break;
        }

        o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
    }
    ENDCG
}
FallBack "Diffuse"
}