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 结构体中语义的理解的更多相关文章

  1. SCROLLINFO结构体中fMask和nPage的理解

    还是VC++中有关显示图像的问题. 我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框.涉及对滚动条的操作就不得不提SCROLLINFO这个结构体.只看单词意思就这道这个结构体要储存滚动条的一些 ...

  2. C结构体中数据的内存对齐问题

    转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...

  3. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  4. C结构体中位域

    C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍.程序只是为了了解位域的一些性质,运行时有些编译器可能会报错. 程序代码如下( ...

  5. enginefuncs_t 结构体中的函数

    就是常见的 g_engfuncs 中的函数.AMXX 里就是 fakemeta 的 EngFunc_** // 这些函数由引擎提供给EXTDLL使用.mp.dll hl.dll ... typedef ...

  6. file结构体中private_data指针的疑惑

    转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...

  7. file结构体中private_data指针的疑惑【转】

    本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private ...

  8. 问题解决——在结构体中使用set保存结构体数据

    =====================声明========================== 本文原创,转载请明确的注明出处和作者,并保持文章的完整性(包括本声明部分). 本文链接:http:/ ...

  9. C语言 结构体中属性的偏移量计算

    //计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...

随机推荐

  1. java随机生成字符串(字符随机生成类 生成随机字符组合)

    原文:http://www.jb51.net/article/45006.htm package p2p_web; import java.util.ArrayList; import java.ut ...

  2. FIREDAC记录SQL日志

    FIREDAC记录SQL日志 跟踪SQL日志可以方便开发的时候的程序调试.SQL日志记录会耗费服务费资源,正式部署中间件的时候,建议关闭SQL日志记录. FIREDAC通过使用TFDMoniFlatF ...

  3. tomcat下载安装以及在eclipse中的配置

    eclipse的下载地址是http://www.eclipse.org/downloads/. tomcat的下载地址为http://tomcat.apache.org/ 这两个工具的安装都非常eas ...

  4. INTZ DX format

    http://aras-p.info/texts/D3D9GPUHacks.html 格式 用法 资源 描述 NVIDIA GeForce AMD Radeon 英特尔 阴影映射 D3DFMT_D16 ...

  5. leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)

    题目: Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume t ...

  6. Unity3d / 3ds max 模型分享站点

    http://www.cgrealm.org/model/ 王国3D模型库 http://www.cgjoy.com/ 游戏特效论坛

  7. java gc log

    java full gc 经常带来延迟, 导致性能问题 如下命令使java虚拟机记录gc的log到文件, 帮助分析定位问题. java -Xloggc:./a.log -jar a.jar    // ...

  8. 函数传参,改变Div任意属性的值&&图片列表:鼠标移入/移出改变图片透明度

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. JAVA经常使用集合框架使用方法具体解释基础篇二之Colletion子接口List

    接着上一篇,接着讲讲集合的知识.上一篇讲了Collection接口.它能够说是集合的祖先了,我们这一篇就说说它的子孙们. 一.Collection的子接口 List:有序(存入和取出的顺序一致).元素 ...

  10. 【IOS】mac终端运行.sh文件总是提示permission denied

    如果我目录jni有一个list.sh文件 我直接 nxgametekiMacBook-Air:jni luonan$  ./list.sh ../../Classes 提示 permission de ...