Retour aux shaders

Ça y est... Je me sens prêt. Après le dernier projet de VR et la galère que j'ai eu pour trouver de bon shaders, j'ai pris la décision d'écrire les miens avec glsl.

Je vais donc suivre plusieurs tuto pour m'y mettre et le tout avec l'aide de ShaderToy et de Visual Studio Code. Je recommande tout particulièrement cet éditeur de texte qui permettra de visualiser, avec une extension, ses shaders.

screenshot

D'après plusieurs sites, il est possible d'écrire ses shaders pour unity3d avec glsl sans utiliser ShaderLab ou CG. Ce qui est parfait.

Allez... Mon premier shader tout nul en ces temps d'élections.

Shadertoy

/*
**    Subject: French Flag
**    File: flag_France.glsl
**    Author: wolf
*/

#define TIERS .3333

void main() {  
    vec2 uv;
    vec4 r;
    vec4 colorBlue;
    vec4 colorRed;
    vec4 colorWhite;

    colorBlue = vec4(0, 0, 1, 1);
    colorRed = vec4(1, 0, 0, 1);
    colorWhite = vec4(1, 1, 1, 1);
    uv = gl_FragCoord.xy / iResolution.xy;
    if (uv.x < TIERS) {
        r = colorBlue;
    } else if (uv.x > TIERS  && uv.x < TIERS*2) {
        r = colorWhite;
    } else {
        r = colorRed;
    }
    gl_FragColor = r;
}

Unity3D - WebGL

Ici, j'ai adapté le code de visual studio code / shadertoy vers l'engine. J'ai donc créé les fichiers dont j'avais besoin.

Un script pour faire une rotation, la scène, un material qui appliquera le shader à mon cube et bien sûr le shader. Au lieu d'un fichier glsl on se retrouve avec un fichier shader qui sera interprété et compilé par l'engine. J'ai mis en guise d'exemple le code du shader. Le tout est expliqué dans les tutorials au dessus.

Shader "Flags/France" {

    Properties {
        _Blue ("ColorBlue", Color) = (0.0, 0.0, 1.0, 1.0)
        _White ("ColorWhite", Color) = (1.0, 1.0, 1.0, 1.0)
        _Red ("ColorRed", Color) = (1.0, 0.0, 0.0, 1.0)
    }

    SubShader {
        Pass {
            GLSLPROGRAM

            uniform vec4 _Blue;
            uniform vec4 _White;
            uniform vec4 _Red;

            #ifdef VERTEX

                varying vec4 position;

                void main() {
                    position = gl_Vertex + vec4(0.5, 0.5, 0.5, 0.0);
                    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
                }

            #endif

            #ifdef FRAGMENT

                varying vec4 position;

                void main() {
                    vec4 r;

                    if (position.x < 0.333) {
                        r = _Blue;
                    } else if (position.x > 0.333  && position.x < 0.333*2.0) {
                        r = _White;
                    } else if (position.x > 0.333*2.0) {
                        r = _Red;
                    } else {
                        r = vec4(1.0, 1.0, 1.0, 1.0);
                    }
                    gl_FragColor = r;
                }
            #endif
            ENDGLSL
        }
    }
}