shader学习(二)顶点着色器

这篇具有很好参考价值的文章主要介绍了shader学习(二)顶点着色器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、C#脚本设置shader参数

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class class33 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Matrix4x4 SM = new Matrix4x4();//缩放矩阵 随时间动态变换
        SM[0, 0] = Mathf.Sin(Time.realtimeSinceStartup)/4+0.5f;
        SM[1, 1] = Mathf.Cos(Time.realtimeSinceStartup)/8+0.5f;
        SM[2, 2] = Mathf.Sin(Time.realtimeSinceStartup)/6+0.5f;
        SM[3, 3] = 1;
        Matrix4x4 mvp = Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix * transform.localToWorldMatrix;
        GetComponent<Renderer>().material.SetMatrix("sm", SM);
    }
}

2、在shader里做变换和颜色显示

Shader "Custom/shader33.1"
{
    SubShader
    {
        pass {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "unitycg.cginc"
         float4x4 mvp; 
        float4x4 rm;
        float4x4 sm;
        struct v2f
        {
           float4 pos:POSITION;
           fixed4 color : COLOR;
        };
        v2f vert(appdata_base v) {
            v2f o;
            // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
            float4 m = UnityObjectToClipPos(v.vertex);//顶点MVP变换
            o.pos = mul(m, sm);//控制缩放
            //1、控制顶点颜色
            if (v.vertex.x == 0.5 && v.vertex.y == 0.5 && v.vertex.z == -0.5)
                o.color = fixed4(1, 0, 0, 1);
            else
                o.color = fixed4(0, 0, 1, 1);
            // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
            float4 wpos = mul(unity_ObjectToWorld, v.vertex);//转换模型坐标系到世界坐标系
			//2、改变物体位置时会改变颜色
            if (wpos.x > 0)
                o.color = fixed4(1, 0, 0, 1);
            else
                o.color = fixed4(0, 0, 1, 1);   
           //3、颜色周期变换
           if (v.vertex.x == 0.5 && v.vertex.y == 0.5 && v.vertex.z == -0.5)
				o.color = fixed4(_SinTime.w/2+0.5,_CosTime.w/2+0.5, _SinTime.y/2+0.5, 1);
		   else
			    o.color = fixed4(0, 0, 1, 1);
            return o;    
            
        }
        fixed4 frag(v2f IN) :COLOR{
            return IN.color;
        }


        ENDCG
            }
    }
}

3、改变顶点的位置信息

Shader "Custom/shader35"
{
	properties{
		_R("R",range(0,5))=1
	}
	SubShader
	{
		pass {
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		float _R;
		struct v2f
		{
		   float4 pos:POSITION;
		   fixed4 color : COLOR;
		};
		v2f vert(appdata_base v) {
			v2f o;
			//float2 xy = v.vertex.xz;
			//float d =_R-length(xy);//计算模
			float4 wpos = mul(unity_ObjectToWorld, v.vertex);//转换到世界坐标系
			float2 xy = wpos.xz;
			float d = _R - length(xy);
			d= d < 0 ? 0 : d;
			float height = 1;
			float4 uppos = float4(v.vertex.x, height * d, v.vertex.z, v.vertex.w);
			o.pos = UnityObjectToClipPos(uppos);//透视
			o.color = fixed4(uppos.y,uppos.y,uppos.y,1);
			return o;
		}
		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
		ENDCG
		}
	}
}

4.顶点扭曲(做周期旋转)

Shader "Custom/shader36"
{

	SubShader
	{
		pass {
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
	
		struct v2f
		{
		   float4 pos:POSITION;
		   fixed4 color : COLOR;
		};
		v2f vert(appdata_base v) {
			v2f o;
			float angle = length(v.vertex)*_SinTime.w;
		/*	float4x4  m = {
			float4(cos(angle),0,sin(angle),0),
			float4(0,1,0,0),
			float4(-sin(angle),0,cos(angle),0),
			float4(0,0,0,1)
			};*/
			float x = v.vertex.x * cos(angle) + v.vertex.z* sin(angle);
			float z = v.vertex.x * -sin(angle) + v.vertex.z * cos(angle);
			v.vertex.x = x;
			v.vertex.z = z;
			//float4 rm= mul(m,v.vertex);
			//o.pos = UnityObjectToClipPos(rm);
			o.pos = UnityObjectToClipPos(v.vertex);
			o.color = fixed4(0,1,1,1);
			return o;
		}
		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
		ENDCG
		}
	}
}

5、实现波浪效果

Shader "Custom/shaderwave"
{

	SubShader
	{
		pass {
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
	
		struct v2f
		{
		   float4 pos:POSITION;
		   fixed4 color : COLOR;
		};
		v2f vert(appdata_base v) {
			v2f o;
			//A*SIN(W*X+T)简谐运动公式
			//F=1/W
			//v.vertex.y += 0.2*sin(v.vertex.x*2 + _Time.y);//横波
			//v.vertex.y += 0.2 * sin(-length(v.vertex.xz) * 2 + _Time.y);//圆形波向外扩散
			v.vertex.y += 0.2 * sin((v.vertex.x+v.vertex.z)+ _Time.y);//鱼鳞波
			v.vertex.y += 0.3 * sin((v.vertex.x - v.vertex.z) + _Time.w);//鱼鳞波叠加
			o.pos = UnityObjectToClipPos(v.vertex);
			o.color = fixed4(v.vertex.y,v.vertex.y,v.vertex.y,1);
			return o;
		}
		fixed4 frag(v2f IN) :COLOR{
			return IN.color;
		}
		ENDCG
		}
	}
}

6、实现漫反射和点光源照射

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Custom/diffuse2"
{

	SubShader
	{
		pass {
		tags{"LightMode" = "ForwardBase"}//光照模型
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		#include "lighting.cginc"

		struct v2f
		{
		   float4 pos:POSITION;
		   fixed4 color : COLOR;
		};
		v2f vert(appdata_base v) {
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertex);
			//o.color = fixed4(0,0,1,1);
			float3 N = normalize(v.normal);//法线归一化
			float3 L = _WorldSpaceLightPos0;//光源位置
			//以下两种方法选1即可
			//L = mul(unity_WorldToObject, float4(L, 0)).xyz;//转换光源到模型坐标系
			//N = mul(unity_ObjectToWorld, float4(N, 0)).xyz;//转换顶点法线到世界坐标系
			/*非等比缩放情况下法向量的世界坐标会有误
			需要修改
			*/
			N = mul( float4(N, 0), unity_WorldToObject).xyz;//转换顶点法线到世界坐标系
		    N = normalize(N);
			float dot1 = saturate(dot(N, L));//控制点积在0-1
			//1、设置平行光
			o.color = _LightColor0 * dot1;
			//o.color.rgb = ShadeVertexLights(v.vertex, v.normal); //光照模型为Vertex
			float3 wpos = mul(unity_ObjectToWorld, v.vertex).xyz;
			//2、设置点光源
			o.color.rgb = o.color.rgb+ Shade4PointLights(unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
				unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,
				unity_4LightAtten0, wpos, N);
			return o;
		}
		fixed4 frag(v2f IN) :COLOR{
			//加入环境光
			return IN.color+UNITY_LIGHTMODEL_AMBIENT;

		}
		ENDCG
		}
	}
}


效果图:
shader学习(二)顶点着色器,学习,着色器
7、实现镜面反射

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Custom/specular"
{
	properties{
		_sp("Specular",color) = (1,1,1,1)
		_shiness("Shiness",range(1,64)) = 8
	}

	SubShader
	{
		pass {
		tags{"LightMode" = "ForwardBase"}//光照模型
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		#include "lighting.cginc"
		float4 _sp;
		fixed _shiness;
		struct v2f
		{
		   float4 pos:POSITION;
		   fixed4 color : COLOR;
		};
		v2f vert(appdata_base v) {
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertex);
			//o.color = fixed4(0,0,1,1);
			float3 N = normalize(v.normal);//法线归一化
			float3 L = _WorldSpaceLightPos0;//光源位置
			//以下两种方法选1即可
			//L = mul(unity_WorldToObject, float4(L, 0)).xyz;//转换光源到模型坐标系
			//N = mul(unity_ObjectToWorld, float4(N, 0)).xyz;//转换顶点法线到世界坐标系
			/*非等比缩放情况下法向量的世界坐标会有误
			需要修改
			*/
			N = mul( float4(N, 0), unity_WorldToObject).xyz;//转换顶点法线到世界坐标系
		    N = normalize(N);

			//diffuse color
			float dot1 = saturate(dot(N, L));//控制点积在0-1
			o.color = _LightColor0 * dot1;
			//o.color.rgb = ShadeVertexLights(v.vertex, v.normal); //Vertex

			//specular color
			float3 wpos = mul(unity_ObjectToWorld, v.vertex).xyz;
			float3 I = -WorldSpaceLightDir(v.vertex);
			float3 R = reflect(I, N);
			float3 V = WorldSpaceViewDir(v.vertex);//顶点到相机的向量
			R = normalize(R);
			V = normalize(V);
			float specularscale = pow(saturate(dot(R, V)), _shiness);
			o.color.rgb += _sp * specularscale;
			//float3 I = wpos - _WorldSpaceLightPos0;

			return o;
		}
		fixed4 frag(v2f IN) :COLOR{
			//加入环境光
			return IN.color+UNITY_LIGHTMODEL_AMBIENT;

		}
		ENDCG
		}
	}
}

shader学习(二)顶点着色器,学习,着色器文章来源地址https://www.toymoban.com/news/detail-637045.html

到了这里,关于shader学习(二)顶点着色器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenGL ES 2.0 for Android教程(二):定义顶点和着色器

    文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(三) OpenGL ES 2.0 for Android教程(四) OpenGL ES 2.0 for Android教程(五) OpenGL ES 2.0 for Android教程(六) OpenGL ES 2.0 for Android教程(七) OpenGL ES 2.0 for Android教程(八) OpenGL ES 2.0 for Android教程(九) 本章介绍我们

    2023年04月14日
    浏览(43)
  • Unity(三) Shader着色器初探

    学习3D开发技术的时候无可避免的要接触到Shader,那么Shader是个什么概念呢?其实对于开发同事来说还是比较难理解的,一般来说Shader是服务于图形渲染的一类技术,开发人员可以通过其shader语言来自定义显卡渲染页面的算法,从而达到按照自己的想法来渲染出目标效果。 不

    2024年02月07日
    浏览(49)
  • WebGL Shader着色器GLSL语言

    在2D绘图中的坐标系统,默认情况下是与窗口坐标系统相同,它以canvas的左上角为坐标原点,沿X轴向右为正值,沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系,且每个方向都有可使用的值的区间,超出该矩形区间的图像不会绘制: X轴最左

    2024年02月14日
    浏览(46)
  • [ue4] 着色器绑定(Shader Binding)

            当我们在ue4中制作了一个美术材质之后,引擎本身会为我们做很多事情,它会把结点翻译为hlsl,生成多个shader变体,并在多个mesh pass中去选择性的调用所需的shader,其中一个重要的过程就是获取shader绑定的数据。         本文将主要讨论ue4是如何处理来自材质的不

    2024年02月10日
    浏览(47)
  • 【unity shader】水体渲染基础-通过顶点偏移实现波浪

    为了表示宽广水域中的水体变化,往往需要进行水平面的整体运动变化。即对平面的顶点进行位移,以实现波浪的起伏效果。现在对于波浪的构成,如快速傅里叶变换和波浪的统计学理论,在游戏中的应用也相对完善。今天主要是做一个基础的波浪实现:正弦波形。 1.1. 基础

    2024年02月03日
    浏览(49)
  • Unity | Shader(着色器)和material(材质)的关系

    一、前言 在上一篇文章中 【精选】Unity | Shader基础知识(什么是shader)_unity shader_菌菌巧乐兹的博客-CSDN博客 我们讲了什么是shader,今天我们讲一下shder和material的关系 二、在unity中shader的本质 unity中,shader就是一串代码,如下图shader(就是一个平平无奇的shader) 但是,这个sh

    2024年02月02日
    浏览(56)
  • Vulkan教程(13): Graphics pipeline Shader modules(着色器模块)

    Vulkan官方英文原文:Shader modules - Vulkan Tutorial 对应的Vulkan技术规格说明书版本: Vulkan 1.3.2 Unlike earlier APIs, shader code in Vulkan has to be specified in a bytecode format as opposed to human-readable syntax like GLSL and HLSL. This bytecode format is called SPIR-V and is designed to be used with both Vulkan and OpenCL (both Kh

    2024年02月06日
    浏览(37)
  • Unity记录一些glsl和hlsl的着色器Shader逆向代码

    以下内容一般基于 GLSL 300 之后 以下某些代码行,是“伪代码“,绝大部分是renderDoc 逆向产生标准代码 本人OpenlGL零基础,也不打算重头学 目录 Clip() 剔除函数 discard; FS最终颜色输出 out 和最终颜色相加方程 从 discard; 命令可得知,一般通过透明度剔除, _26 == color.a _21.w 刚

    2024年02月07日
    浏览(48)
  • 【Godot4自学手册】第三十九节利用shader(着色器)给游戏添加一层雾气效果

    今天,主要是利用shader给游戏给地宫场景添加一层雾气效果,增加一下气氛,先看一下效果: 一、新建ParallaxBackground根节点 新建场景,根节点选择ParallaxBackground,命名为Fog,然后将该场景保存到Component文件夹下。ParallaxBackground 使用一个或多个 ParallaxLayer 子节点来创建视差效

    2024年04月27日
    浏览(35)
  • 让AI臣服,而不是被它替代!让ChatGPT为我们编写Unity3d Shaderlab的着色器(shader)

    ChatGPT的火热大家应该都有目共睹,文案工作者、翻译工作者和画师等各种行业都在被嘲即将失业。不光是这些岗位的员工,作为资深社畜程序猿也能感受到会受到冲击。网上很多人都在发ChatGPT写的代码,并开始大肆宣扬AI要取代程序员了,今天测一测使用ChatGPT来生成一些代码,

    2023年04月23日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包