Shader 之 顶点变形

可以使3D物体通过顶点变形弯曲,常见于跑酷游戏的跑道。可向左、右、上、下弯曲。

Shader "Custom/VertexColorCurved" {
    Properties {
        // Shader需要的6个参数
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _QOffset ("Offset", Vector) = (0,0,0,0)
        _Dist ("Distance", Float) = 100.0

        _BrightnessAmount ("Brightness Amount", Float) = 1.0
        _SaturationAmount ("Saturation Amount", Float) = 1.0
        _ContrastAmount ("Contrast Amount", Float) = 1.0
    }

    SubShader {
        Tags { "Queue" = "Transparent"}
        Pass
        {

            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _MainTex;

            float4 _QOffset;
            float _Dist;

            fixed _BrightnessAmount;
            fixed _SaturationAmount;
            fixed _ContrastAmount;
            float _OpacityAmount;

            struct v2f {
                float4 pos : SV_POSITION;
                float4 uv : TEXCOORD0;
                float3 viewDir : TEXCOORD1;
                fixed4 color : COLOR;
            };

            v2f vert (appdata_full v)
            {
                   v2f o;

                   float4 vPos = mul (UNITY_MATRIX_MV, v.vertex);
                float zOff = vPos.z/_Dist;
                   vPos += _QOffset*zOff*zOff;
                   o.pos = mul (UNITY_MATRIX_P, vPos);
                   o.uv = v.texcoord;

           //o.color.rgb = v.color.rgb;  // 取顶点色

                   return o;
            }

            float3 ContrastSaturationBrightness (float3 color, float brt, float sat, float con) {
                // Increase or decrease these values to
                // adjust r, g and b color channels separately
                float avgLumR = 0.5;
                float avgLumG = 0.5;
                float avgLumB = 0.5;  

                // Luminance coefficients for getting luminance from the image
                float3 LuminanceCoeff = float3 (0.2125, 0.7154, 0.0721);  

                // Operation for brightmess
                float3 avgLumin = float3 (avgLumR, avgLumG, avgLumB);
                float3 brtColor = color * brt;
                float intensityf = dot (brtColor, LuminanceCoeff);
                float3 intensity = float3 (intensityf, intensityf, intensityf);  

                // Operation for saturation
                float3 satColor = lerp (intensity, brtColor, sat);  

                // Operation for contrast
                float3 conColor = lerp (avgLumin, satColor, con);  

                return conColor;
            }  

            half4 frag (v2f i) : COLOR0
            {
                fixed4 renderTex = tex2D(_MainTex, i.uv);  

//                  // Apply vertex color
//                  renderTex.rgb *= i.color.rgb;  // 顶点色和贴图混合

                // Apply the brightness, saturation, contrast operations
                renderTex.rgb = ContrastSaturationBrightness (renderTex.rgb, _BrightnessAmount, _SaturationAmount, _ContrastAmount);

                return renderTex;
            }

            ENDCG
        }
    }

    FallBack "Diffuse"
}
时间: 2024-08-19 14:11:55

Shader 之 顶点变形的相关文章

Cg入门14:Vertex Shader - 几何变换 —顶点扭曲

mul (UNITY_MATRIX_MVP,upPos): 参数说明 由第一个参数UNITY_MATRIX_MVP 矩阵去影响第二个参数upPos向量(或者矩阵) Shader "Sbin/vf35" { SubShader { pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f{ float4 pos : POSITION; fl

[Unity Shader] 逐顶点光照和逐片元光照

书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照. 前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器). 第二种算法是获得顶点的法线(顶点着色器),对法线插值(光栅化过程),根据漫反射公式计算像素颜色(片元着色器). 注:漫反射公式:(光源颜色 * 材质漫反射颜色)* (表面法线矢量 · 表面到光源的矢量) 书中对上两种算法的实现如下: 1 Shader "Unity Shaders Book/Chapter 6/Diffuse V

[小明学Shader]9.顶点方法(Vertex Function)和顶点色

渲染过程中,Shader总是优先对每个顶点进行计算(这里如果我们用顶点方法,那么我们的顶点方法就会被调用);顶点计算出后按照一定的格式输出给下面的流程,其中的某一步就是我们放置的surfa方法,它接收的输入可以进行一定的控制(我们将用顶点方法输出). 整个 shader 相关流程如下: 1. shader 准备对一个顶点进行计算.因我们自定义顶点方法,因此 vert 被调? 2. vert 的第一参数决定该顶点需要带进来哪些属性,我们得到这个属性里的顶点色,把这个顶点色放到 Input 结构中,

Cg入门13: Vertex Shader - 几何变换 —顶点位移

注意:向量进行计算的时候,不仅代表大小,还代表方向.记得代表方向有利于队变换计算的理解 效果如下:

Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画

上一节中说了,在 Surface Shader 中,添加顶点函数,我们可以在 顶点函数中获取到 顶点数据,比如顶点颜色.顶点坐标等. 这一节学习获取顶点坐标,并且修改顶点坐标,来实现顶点动画. 简单介绍原理: 在顶点函数中,获取到顶点坐标 vertex,然后,求float offsetY = sin(vertex.x) ,然后将 offsetY 加到 vertex.y 上,这样就把原来的平面 ,变成了 正弦 波浪. 然后再使用之前学过的 内置变量 _Time ,算式变为 float offset

【转载】基于平均法线实现顶点网格变形控制的总结

原文链接:http://blog.csdn.net/haohan_meng/article/details/22640991 顶点网格的变形功能,这在Unity官方商店的技术展示Demo中有一个案例.自己就是在这个案例的基础上进行的学习.案例中的功能全部都是用JS实现的,自己依样画葫芦,改成了C#,并对其中一些核心代码的工作原理进行了分析与学习,最终形成了这篇总结.其中的不正之处欢迎大家批评指出. 看到文章的标题,我们可能会想,要完成网格模型的变形,需要哪几个要素? 简单来说,就是两个:顶点与法

Ogre参考手册(四)3.1.4-3.1.14 声明顶点、几何、片段程序(Ogre着色器脚本)

3.1.4 声明顶点.几何.片段程序 使用着色程序前需要先对其定义,一个程序定义可以用于多个材质,这仅需要在所使用的材质定义之前定义该程序. 程序定义可以内嵌在.material脚本中(需要放在所有引用的材质之前),或者希望可以在多个.material中使用,可以在外部.program脚本中定义.在.material和.program中的定义完全相同,区别仅在于.program文件会在所有.material之前解析,因此可以确保程序定义会先于任何使用它的材质定义. 程序可以是底层的(依据具体规范

GDC2017【神秘海域 4】中所使用的顶点着色器技术

原文链接 http://game.watch.impress.co.jp/docs/news/1047802.html 会場:San Francisco Moscone Convention Center Naughty Dog的Lead Technical Artist.Andrew Maximov氏 在GDC 2017的最后一天,Naughty Dog在题为[Technical Art Techniques of Naughty Dog: Vertex Shaders and Beyond]

[翻译]利用顶点位移的VR畸变校正

文章英文原网址: http://www.gamasutra.com/blogs/BrianKehrer/20160125/264161/VR_Distortion_Correction_using_Vertex_Displacement.php 利用顶点位移的VR畸变校正 2016年1月29日 Brian Kehren著 在VR开发的最大挑战之一是对高帧率与高分辨率结合的要求.我们通过把顶点转化为“镜头空间”,删除了需要全屏渲染的纹理,这样就可以大规模提高手机性能. 下面的技术使用谷歌的Card