Shader 结构体中语义的理解
Shader编写通常会遇到语义
1 float4 vert(float4:POSITION):SV_POSITION
2 {
3 return mul(UNITY_MATRIX_MVP,v);
4 }
POSITION与SV_POSITION都是Cg/HLSL中的语义,是不可省略的。
float4:POSITION就是将模型的顶点坐标作为vert()的参数。
有时候顶点处理函数vert()需要更多的参数,这时候就用到了结构体作为输入。
1 struct input_data
2 {
3 float4 vertex : POSITION;//模型顶点坐标
4 float4 texcoord : TEXCOORD0;//材质的第几套纹理坐标
5 };
6 float4 vert(input_data m):SV_POSITION
7 {
8 return mul(UNITY_MATRIX_MVP,m.vertex);
9 }
当然也可以采用结构体来进行输出。
1 Shader "Custom/red" {
2 SubShader {
3 Pass{
4 CGPROGRAM
5 // Physically based Standard lighting model, and enable shadows on all light types
6 #pragma vertex vert
7 #pragma fragment frag
8
9 struct input_data
10 {
11 float4 vertex : POSITION;//模型顶点坐标
12 float3 normal:NORMAL;//法线,凑结构体数用的,实际没用
13 float4 texcoord : TEXCOORD0;//材质的第几套纹理坐标,凑结构体数用的,实际没用
14 };
15
16 struct output_data
17 {
18 float4 pos: SV_POSITION;//SV_POSITION语义告诉Unity,pos里包含了顶点在裁剪空间的位置信息
19 fixed3 color : COLOR0;
20 };
21
22 output_data vert(input_data i)
23 {
24 output_data o;
25 o.pos=mul(UNITY_MATRIX_MVP,i.vertex);
26 o.color=fixed3(1.0,0,0);
27 return o;
28 }
29
30 fixed4 frag(output_data m):SV_Target//将颜色显示在屏幕上,SV_Target表示把输出的数据当做颜色存储到渲染目标中,用COLOR也可以
31 {
32 return fixed4(m.color,1);//输出红色
33 }
34 ENDCG
35 }
36 }
37 }
由上述代码可以看出vert的输出结构体被输出到frag函数中了。
仔细一想,这些结构体只有输入的结构体比较重要,与外部数据息息相关。input_data接收了模型的顶点位置,法线和贴图坐标。把这些宝贵信息送给顶点着色器函数vert();
而自定义的输出结构体其实和外界数据就没什么关系,顶多作为数据的存储载体,给片段着色器提供数据罢了,标上语义也就是个形式,注意语义还是要写的,虽然没啥意义。
但是SV_POSITION是个例外,顶点着色器的输出结构体中必须包含它,否则渲染器将无法得到裁剪空间中的顶点坐标,也就无法把顶点渲染到屏幕上。毕竟顶点着色器顶点
着色器,如果输出的连顶点坐标都没了,它还有啥意义。
frag()片段着色器后面跟着的那个SV_Target就是我们所弄出来的数据到底要输出什么,改变模型的什么。这里是输出颜色,其实COLOR也可以。
注意以上为了便于理解才写成input_data,output_data.实际书写时,一般把input_data书写为appdata,output_data书写为v2f(vert to frag)
Shader 结构体中语义的理解的更多相关文章
- SCROLLINFO结构体中fMask和nPage的理解
还是VC++中有关显示图像的问题. 我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框.涉及对滚动条的操作就不得不提SCROLLINFO这个结构体.只看单词意思就这道这个结构体要储存滚动条的一些 ...
- C结构体中数据的内存对齐问题
转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...
- C语言结构体中的函数指针
这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...
- C结构体中位域
C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍.程序只是为了了解位域的一些性质,运行时有些编译器可能会报错. 程序代码如下( ...
- enginefuncs_t 结构体中的函数
就是常见的 g_engfuncs 中的函数.AMXX 里就是 fakemeta 的 EngFunc_** // 这些函数由引擎提供给EXTDLL使用.mp.dll hl.dll ... typedef ...
- file结构体中private_data指针的疑惑
转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...
- file结构体中private_data指针的疑惑【转】
本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private ...
- 问题解决——在结构体中使用set保存结构体数据
=====================声明========================== 本文原创,转载请明确的注明出处和作者,并保持文章的完整性(包括本声明部分). 本文链接:http:/ ...
- C语言 结构体中属性的偏移量计算
//计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...
随机推荐
- 监控目前所有连接SQL SERVER的用户信息
原文:监控目前所有连接SQL SERVER的用户信息 if object_id('p_getlinkinfo','P')is not null drop proc p_getlinkinfo go c ...
- linux命令详解:basename命令
转:http://www.cnblogs.com/lwgdream/archive/2013/11/05/3407768.html 前言 bashname命令用于获取路径中的文件名或路径名(获取的时候 ...
- 6、Python模块
最常用的两个模块: os #可以允许python调用执行系统命令,如shell sys #处理与python程序本身的事情 Python自带200多个常用模块 Python官网收集了2 ...
- 装饰者模式对HttpServletRequest进行增强
package cn.web.servlet; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpS ...
- Elasticsearch 索引实例
1.简述 ElasticSearch包含了一系列的感念,比如索引(indexing).搜索(search)以及聚合(aggregations),现在我们主要介绍indexing. 在Elasticse ...
- 在scala中:: , +:, :+, :::, +++的区别总结
初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. 4种操作符的区别和联系 :: 该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表. ...
- 转:Spring mvc中@RequestMapping 6个基本用法小结
Spring mvc中@RequestMapping 6个基本用法小结 发表于3年前(2013-02-17 19:58) 阅读(11698) | 评论(1) 13人收藏此文章, 我要收藏 赞3 4 ...
- 内容提供器(ContentProvider)
一.简介内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性.目前,使 ...
- [Python]BeautifulSoup—HTML解析包
在用Python写爬虫时,一个常见的操作是对抓下的HTML做分析处理,得到想要的内容.一般的方法为使用Python的re库中.用正則表達式来解析文本.只是这样的方法适用于全部的文本.而针对于特定格式的 ...
- Nginx:subrequest的使用方式
参考资料<深入理解Nginx> subrequest是由HTTP框架提供的一种分解复杂请求的设计模式. 它可以把原始请求分解为许多子请求,使得诸多请求协同完成一个用户请求,并且每个请求只关 ...