顶点片元着色器
作者:追风剑情 发布于:2014-6-17 21:59 分类:Shader
顶点片元着色器不使用灯光交互,实际着色器代码用CG或HLSL语言编写,嵌入在着色器的通道块中。在着色器开始处,可以使用编译指令#pragma,常用编译指令如表所示:
顶点片元着色器常用编译指令
编译指令 | 说明 |
#pragma vertex <name> | 声明以name为名字的函数是顶点程序 |
#pragma fragment <name> |
声明以name为名字的函数是片元程序 |
#pragma fragmentoption <option> |
添加选项到编译的OpenGL片元程序,通过OpenGL的ARB_fragment_program可以查询到所允许的规范的选项列表。这个指令对顶点程序或者不是以OpenGL为编译目标的程序无效。 |
#pragma target <name> |
着色器目标编译 |
#pragma only_renderers <names> |
仅用给定的渲染器编译着色器。默认情况下用所有的渲染器都编译着色器。当选择多个渲染器时用空格隔开 |
#pragma exclude_renderers <names> |
不用给定的渲染编译着色器。默认情况下用所有的渲染器都编译着色器。当选择多个渲染器时用空格隔开 |
#pragma glsl |
用桌面OpenGL平台编译着色器时,将Cg/HLSL转换成GLSL而不是默认的ARB顶点片元着色器 |
提示
每个顶点片元着色器必须包含一个顶点程序或者片元程序(或者两者兼有),因此需要一个#pragma vertex命令或者#pragma fragment命令(或者两者兼有)。
默认情况,Unity将顶点程序编译成着色模型1.1(Shader Model1.1),片元程序将编译成着色模型(Shader Model2.0)。使用#pragma target将着色器编译成其他兼容的等级。目前支持下面这些目标。
#pragma target default
编译成默认目标,在Direct3D 9环境中编译成顶点着色器1.1(Vertex Shader1.1)和像素着色器2.0(Pixel Shader2.0)。
ARB_vertex_program有128个指令限制,ARB_fragment_program有96个指令限制(32个纹理+64位算术运算),16个临时寄存器和4个间接纹理。
#pragma target 3.0
编译成着色模型3.0(Shader Model3.0),在Direct3D 9环境中编译成顶点着色器3.0(Vertex Shader3.0)和像素着色器3.0(Pixel Shader3.0)。
ARB_vertex_program没有指令限制,ARB_fragment_program有1024位指令限制(512位纹理+512位算术运算),32个临时寄存器和4个间接纹理。可以使用#pragma profileoption命令扩展这些限制值。如:#pragma profileoption MaxTexIndirections=256增加间接纹理上限到256个。
提示
编译成着色模型3.0时,顶点和片元程序需要同时存在。着色模型(Shader Model)是Direct3D的标准,由顶点着色器(Vertex Shader)和像素着色器(Pixel Shader)两个着色语言规范组成,和本书中的顶点程序、片元程序在本质上是一样的。
Unity支持多种渲染API(比如:Direct3D 9 和 OpenGL),默认情况下被支持的渲染器会编译所有着色器程序,但可以使用#pragma only_renderers或#pragma exclude_renderers指令来指定渲染器编译着色器。目前支持的渲染器如表所示。
Unity渲染器
渲染器 | 渲染器指令代码 |
Direct3D 9 | d3d9 |
OpenGL | opengl |
OpenGL ES 2.0 | gles |
Xbox 360 | xbox360 |
PlayStation 3 | ps3 |
Flash | flash |
下面的代码片段表示只用Direct3D 9渲染器编译着色器:
#pragma only_renderers d3d9
CG顶点程序必须在结构体中传递顶点数据。几种常用的顶点结构体定义在文件UnityCG.cginc中。在大部分情况下仅仅使用它们就够了。主要结构体如下所列。
appdata_base
包含顶点位置、法线和一个纹理坐标。
appdata_tan
包含顶点位置、切线、法线和一个纹理坐标。
如果想访问个别的顶点数据,必须另外声明顶点结构体。结构体中的成员必须是表中所列出的成员。
顶点结构体成员
成员 | 说明 |
float4 vertex | 顶点位置 |
float3 normal | 顶点法线 |
float4 texcoord | 第一UV坐标 |
float4 texcoord1 | 第二UV坐标 |
float4 tangent | 切线向量(用在法线贴图中) |
float4 color | 每个顶点(per-vertex)颜色 |
以下着色器代码通过顶点程序输入结构体使用了顶点位置和第一纹理坐标。这在网格中调式UV坐标是非常有用的。UV坐标是可见的红色和绿色,坐标以外应用的是取值范围在0到1之间的蓝色值:
Shader "!Debug/UV 1" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata {//顶点输入结构体 float4 vertex : POSITION;//顶点坐标 float4 texcoord : TEXCOORD0; //第一UV坐标 }; struct v2f { float4 pos : SV_POSITION;//纹理坐标 float4 uv : TEXCOORD0;//第一UV坐标 }; v2f vert (appdata v) { //顶点程序 v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex);//计算顶点位置 o.uv = float4(v.texcoord.xy, 0, 0);//计算UV坐标 return o; } half4 frag(v2f i) : COLOR {//片元程序 half4 c = frac(i.uv); if (any(saturate(i.uv) - i.uv))//计算片元颜色 c.b = 0.5; return c; } ENDCG } } }
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号