shader 总结

shaderforge
==
熟练掌握shader编写各种游戏效果

Compute Shader到底是什么?

简单来说,Compute Shader 就是一段运行在 GPU上的程序,这段程序并不需要用来处理网格数据或者是纹理数据的,它是工作在OpenGL或者DirectX的内存空间中的(不像OpenCL那样拥有自己的内存空间),它们可以输出缓冲数据或者纹理并且在多个执行的线程间共享内存。

把在cpu运行的矩形逻辑放到gpu运行
gpu运行完再放回到cpu,放回去的速度慢



//shader是给gpu执行的程序,中文叫着色器
//分为 固定管线着色器 ,顶点片元着色器,表面着色器

表面着色器(Surface Shader),顶点着色器(Vertex Shader),片段着色器(Fragment Shader)=像素着色器(Pixel Shader)


//顶点shader:干预模型形态
//像素shader:干预模型着色

//hlsl 支持direct3d
//cg 支持direct3d和opengl
//glsl 支持opengl

//unity 支持shaderlab然后编译



//mvp
//model  物体
//view   相机
//projection  投影

物体坐标系—>世界坐标系—>相机坐标系—>投影坐标系—>图像(像素)坐标系


//即把正方体的点 转换为2d应该显示的点

o.vertex = UnityObjectToClipPos(v.vertex);
等价于
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);



//即读取贴图的tiling 和offset 来修正 uv坐标

o.uv = TRANSFORM_TEX(v.uv, _MainTex);
等价于
(tex.xy * name##_ST.xy + name##_ST.zw)

tex.xy 为正方体的uv
name##_ST实际上就是_MainTex_ST。
name##_ST.xy就是Tiling的xy值。
name##_ST.zw就是Offset的xy值。

//表面着色器
 
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unlit/NewUnlitShader"
{
Properties
{
_MainTex ("Texture1", 2D) = "white" {TexGen ObjectLinear}
_valueFloat("valueFloat", float) = 1
_valueRange("valueRange", Range(0,10)) = 3
_valueColor("valueColor", Color) = (1,1,1,1)
//属性名-(display , pro) = value
//_MainTex 属性的名字。下划线开始
//"Texture" 显示的名字
//2d      属性的类型
//white   属性的值
}

//统一逻辑
/*Categroy{
Fog{Mode Off}
SubShader{Pass{}}
SubShader{Pass{]}
}*/


SubShader
{
//tags
Tags { "RenderType"="Opaque" }
//common state
LOD 100

//pass 类型
//1regular pass
//lighting material colormaterial separatespecular color fog alpha test ztest zwrite blend colormask offset
//2use pass使用其他shader通道
//3grab pass 截屏保存成纹理给后面使用

//Lighting Off 放哪里都可以

Pass
{
//name必须大写
//name and tag
//render setup
//texture setup

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
//UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};

sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
//o.vertex = UnityObjectToClipPos(v.vertex);
float dist = distance(v.vertex.xyz, float3(0, 0, 0));
float h = sin(dist + _Time.z);
o.vertex = mul(unity_ObjectToWorld, v.vertex);
o.vertex.y = h;
o.vertex = mul(unity_WorldToObject, o.vertex);
//v.vertex.y = h;
o.vertex = UnityObjectToClipPos(o.vertex);

//o.vertex
//o.vertex = float4(1, 1, 1, 1);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
//o.uv = float2(1, 1);
//UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
//UNITY_APPLY_FOG(i.fogCoord, col);



return col;
}
ENDCG
}
}
}

猜你喜欢

转载自blog.csdn.net/a133900029/article/details/80184270