Unity3D
来源:互联网 发布:淘宝卖家店铺装修教程 编辑:程序博客网 时间:2024/05/22 04:47
基本结构
Shader "MyShaderName" { Properties { // 属性 } SubShader { // 针对显卡A的SubShader Pass { // 设置渲染状态和标签 // 开始CG代码片段 CGPROGRAM // 该段代码片段的编译指令,例如: #pragma vertex vert #pragma fragment frag // CG代码写在这里 ENDCG // 其他设置 } // 其他需要的Pass } SubShader { // 针对显卡B的SubShader } // 上述SubShader都失败后用于回调的Unity Shader Fallback "VertexLit"}
白色Shader
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unity Shaders Book/Chapter 5/Simple Shader" { SubShader { Pass { CGPROGRAM // 两个重点的编译指令 // 更通用的表示, name是指定的函数名: // #pragma vertex name // #pragma fragment name #pragma vertex vert // 告诉Unity哪个函数包含了顶点着色器代码 #pragma fragment frag // 告诉Unity哪个函数包含了片元着色器 // POSITION和SV_POSITION都是Cg/HLSL中的语义 // POSITION 告诉Unity把模型的顶点坐标填充到输入参数v中 // SV_POSITION 告诉Unity顶点着色器的输出是裁剪空间中的顶点坐标 float4 vert(float4 v : POSITION) : SV_POSITION { // 把顶点坐标从模型空间转换到裁剪空间中 // UNITY_MATRIX_MVP矩阵是Unity内置的模型*观察*投影矩阵 // mul(UNITY_MATRIX_MVP,*) return UnityObjectToClipPos(v); } // SV_Target是HLSL的一个系统语义, // 把用户的输出颜色存储到一个渲染目标(render target), // 这里输出到默认的帧缓冲中。 // 片元着色器输出的颜色每个分量在[0,1],其中(0,0,0)表示黑色 // (1,1,1)表示白色 fixed4 frag() : SV_Target { return fixed4(1.0, 1.0, 1.0, 1.0); } ENDCG } }}
传递更多数据
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unity Shaders Book/Chapter 5/Simple Shader1" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // 使用一个结构体来定义顶点着色器 struct a2v { // POSITION 语义告诉 Unity,用模型空间的顶点坐标填充vertex变量 float4 vertex : POSITION; // NORMAL语义告诉 Unity,用模型空间的法线方向填充normal变量 float3 normal : NORMAL; // TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量 float4 texcoord : TEXCOORD0; }; float4 vert(a2v v) : SV_POSITION { // 使用v.vertex来访问模型空间的顶点坐标 return UnityObjectToClipPos(v.vertex); } fixed4 frag() : SV_Target { return fixed4(1.0, 1.0, 1.0, 1.0); } ENDCG } }}
顶点着色器和片元着色器通信
Shader "Unity Shaders Book/Chapter 5/Simple Shader2" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; }; struct v2f { // SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间 // 中的位置信息 float4 pos : SV_POSITION; // COLORO语义可以告诉用于存储颜色信息 fixed3 color: COLOR0; }; v2f vert(a2v v) { // 声明输出结构 v2f o; o.pos = UnityObjectToClipPos(v.vertex); // v.normal 包含了顶点的法线方向,其分量范围在[-1.0, 1.0] // 下面的代码把分量范围映射到了[0.0, 1.0] // 存储到o.color中传递给片元着色器 o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5); return o; } fixed4 frag(v2f i) : SV_Target { // 将插值后的i.color显示到屏幕上 return fixed4(i.color, 1.0); } ENDCG } }}
ShaderLab中属性的类型和Cg中变量的类型之间的匹配关系:
float/half/fixed
Cg/HLSL中三种精度的数值类型:
阅读全文
0 0
- Unity3D
- Unity3D
- Unity3D
- Unity3D
- unity3d
- Unity3D
- Unity3D
- Unity3D
- UNITY3D
- Unity3D
- unity3d
- unity3D
- Unity3D
- Unity3d
- Unity3D
- unity3D
- unity3D
- Unity3D
- 动态规划的一个简单列子
- list和tuple
- numpy.transpose高维的理解
- 花椒斥资1亿打造“1218直播节”, 携手北京卫视成就首个上星直播盛典
- python pip安装第三方包速度很慢
- Unity3D
- Docker
- 3.Java变量初始化顺序
- Creational模式
- “戏”说spark---spark 内存管理详解
- ubuntu16.04 sudo:无法解析主机 解决方案
- 操作系统--硬件与软件的桥梁
- 电子科技大学第九届ACM趣味程序设计竞赛第二场(正式赛) 题解
- 算法提高 三进制数位和