forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Эффекты/Шейдеры (http://forum.boolean.name/forumdisplay.php?f=170)
-   -   Добавить в шейдер цвет частицы (http://forum.boolean.name/showthread.php?t=20878)

Evgen 19.12.2020 21:28

Добавить в шейдер цвет частицы
 
Есть примитивный шейдер типа Diffuse:

Код:

Shader "Diff" {
        Properties {
                _Color ("Main Color", Color) = (1,1,1,1)
                _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
        }

        SubShader {
                Tags {"Queue"="Transparent+1000" "IgnoreProjector"="True" "RenderType"="Transparent"}

                CGPROGRAM
                #pragma surface surf Lambert alpha

                sampler2D _MainTex;
                fixed4 _Color;

                struct Input {
                        float2 uv_MainTex;
                };

                void surf (Input IN, inout SurfaceOutput o) {
                        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                }
                ENDCG
        }

        Fallback "Transparent/Diffuse"
}

Создаю материал и назначаю данный шейдер.
Вывожу частицу с помощью Emit:

Код:

p.position = pos;
p.velocity = velocity;
p.startSize = size;
p.startLifetime = 100;
p.startColor = Color.red;
obj.GetComponent<ParticleSystem> ().Emit (p, 1);

Однако вместо красной частицы на экран выводится белая.
При этом если использовать любой шейдер типа Particle то все нормально цвет указанный при Emit учитывается.

Что нужно добавить в шейдер, чтобы цвет Emit startColor учитывался в нем. Смотрел исходники unity particle шейдеров но понять что нужно добавить не могу.

pax 22.12.2020 17:20

Ответ: Добавить в шейдер цвет частицы
 
Подозреваю что надо в шейдер в структуру Input добавить строку
PHP код:

float4 color COLOR

А первую строку функции surf заменить на
PHP код:

fixed4 c tex2D(_MainTexIN.uv_MainTex) * _Color IN.color

Т.е. цвет частицы передается через цвета вершин.

Ну и в итоге должно получиться следующее:
PHP код:

Shader "Diff" {
    
Properties {
        
_Color ("Main Color"Color) = (1,1,1,1)
        
_MainTex ("Base (RGB) Trans (A)"2D) = "white" {}
    }

    
SubShader {
        
Tags {"Queue"="Transparent+1000" "IgnoreProjector"="True" "RenderType"="Transparent"}

        
CGPROGRAM
        
#pragma surface surf Lambert alpha

        
sampler2D _MainTex;
        
fixed4 _Color;

        
struct Input {
            
float2 uv_MainTex;
            
float4 color COLOR;
        };

        
void surf (Input INinout SurfaceOutput o) {
            
fixed4 c tex2D(_MainTexIN.uv_MainTex) * _Color IN.color;
            
o.Albedo c.rgb;
            
o.Alpha c.a;
        }
        
ENDCG
    
}

    
Fallback "Transparent/Diffuse"



Evgen 25.12.2020 00:02

Ответ: Добавить в шейдер цвет частицы
 
Ок как-нибудь проверю. Просто уже все сделал.
На сколько я понял цвет частиц задается через цвет вершин, vertexcolor. Но могу ошибаться.
Сделал методом "перебора" так :

Код:

Shader "Diff" {

        Properties {
                _Color ("Main Color", Color) = (1,1,1,0)
                _MainTex ("Base (RGB)", 2D) = "white" { }
        }

        SubShader {
                Tags {"Queue"="Transparent+1500" "IgnoreProjector"="True" "RenderType"="Transparent"}

                Pass {
                        Blend SrcAlpha OneMinusSrcAlpha
                        SetTexture [_MainTex] { combine previous * texture }     
                }
        }
}

Это не CG конечно, но результат то что нужно :cool:


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot