Cg(C for Graphic)语言语义词与语义绑定详述 (转)
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”
语义词( Semantic )与语义绑定( Binding Semantics )
语义词,表示输入图元的数据含义(是位置信息,还是法向量信息),也表明这些图元数据存放的硬件资源(寄存器或者纹理缓冲区)。顶点着色程序和片段着色程序中 Varying inputs 类型的输入,必须和一个语义词相绑定,这称之为绑定语义( binding semantics )。
7.5.1 输入语义与输入语义的区别
语义概念的提出和图形流水线工作机制大有关系。从前面所讲的 GPU 处理流程中可以看出,一个阶段处理数据,然后传输给下一个阶段,那么每个阶段之间的接口是如何确定的呢?例如:顶点处理器的输入数据是处于模型空间的顶点数据(位置、法向量),输出的是投影坐标和光照颜色;片段处理器要将光照颜色做为输入,问题是 “ 片段处理器怎么知道光照颜色值的存放位置 ” ?
在高级语言中( C/C++ ),数据从接口的一端流向另一端,是因为提供了数据存放的内存位置(通常是指针信息);由于 Cg 语言并不支持指针机制,且图形硬件处理过程中,数据通常暂存在寄存器中,故而在 Cg 语言中,通过引入语义绑定( binding semantics )机制,指定数据存放的位置,实际上就是将输入 \ 输出数据和寄存器做一个映射关系(在 OpenGL Cg profiles 中是这样的,但在 DirectX-based Cg profiles 中则并没有这种映射关系)。根据输入语义,图形处理器从某个寄存器取数据;然后再将处理好的数据,根据输出语义,放到指定的寄存器。
记住这一点:语义,是两个处理阶段(顶点程序、片段程序)之间的输入 \ 输出数据和寄存器之间的桥梁,同时语义通常也表示数据的含义,如 POSITION 一般表示参数种存放的数据是顶点位置。
语义,只对两个处理阶段的输入 \ 输出数据有意义,也就是说,语义只有在入口函数中才有效,在内部函数(一个阶段的内部处理函数,和下一个阶段没有数据传递关系)的无效,被忽略( Semantics attached to parameters to non-main functions are ignored(261 页 ) );
语义,分为输入语义和输入语义;输入语义和输出语义是有区别的。虽然一些参数经常会使用相同的绑定语义词,例如:顶点 Shader 的输入参数, POSITION 指应用程序传入的顶点位置,而输出参数使用 POSITION 语义就表示要反馈给硬件光栅器的裁剪空间位置,光栅器把 POSITION 当成一个位置信息。虽然两个语义都命名为 POSITION ,但却对应着图形流水线上不同的寄存器。
说明:在 OpenGL Cg profiles 中,语义绑定指定了输入 \ 输出数据和图形硬件寄存器之间的对应关系;但是在 DirectX Cg profiles 中,则并非如此。在文献【 3 】的第 25 页写到:
In the OpenGL Cg profiles, binding semantics implicitly specify the mapping of varying inputs to particular hardware registers. However, in DirectX based Cg profiles there is no such implied mapping.
在 文献【 3 】的第 260 页写到:
Often, these predefined names correspond to the names of hardware registers or API
resources
7.5.2 顶点着色程序的输入语义
图 13 所示的这组绑定语义关键字被 Cg 语言 的所有 vertex profile 所支持, 一些 profile 支持额外的语义词。
POSITION BLENDWEIGHT
NORMAL TANGENT
BINORMAL PSIZE
BLENDINDICES TEXCOORD0---TEXCOORD7
图13 定点着色程序输入语义词
语义词 POSITION0 等价于 POSITION ,其他的语义词也有类似的等价关系。为了说明语义词的含义,举例如下:
in float4 modelPos: POSITION
表示该参数中的数据是的顶点位置坐标(通常位于模型空间),属于输入参数,语义词 POSITION 是输入语义,如果在 OpenGL 中则对应为接受应用程序传递的顶点数据的寄存器(图形硬件上)。
in float4 modelNormal: NORMAL
表示该参数中的数据是顶点法向量坐标(通常位于模型空间),属于输入参数,语义词 NORMAL 是输入语义,如果在 OpenGL 中则对应为接受应用程序传递的顶点法向量的寄存器(图形硬件上)。
注意,上面的参数都被声明为四元向量,通常我们在应用程序涉及的顶点位置和法向量都是三元向量,至于为什么要将三元向量便为四元向量,又称齐次坐标,具体请看附录 A 。顶点位置坐标传入顶点着色程序中转化为四元向量,最后一元数据为 1 ,而顶点法向量传入顶点着色程序中转化为四元向量,最后一元数据为 0 。
7.5.3 顶点着色程序的输出语义
顶点程序的输出数据被传入到片断程序中,所以顶点着色程序的输出语义词,通常也是片段程序的输入语义词,不过语义词 POSITION 除外。
下面这些语义词适用于所有的 Cg vertex profiles 作为输出语义和 Cg fragment profiles 的输入语义: POSITION , PSIZE , FOG,COLOR0-COLOR1, TEXCOORD0-TEXCOORD7 。
顶点着色程序必须声明一个输出变量,并绑定 POSITION 语义词,该变量中的数据将被用于,且只被用于光栅化! 如果没有声明一个绑定 POSITION 语义词的输出变量,如下所示的代码:
void main_v(float4 position: POSITION,
//out float4 oposition : POSITION,
uniform float4x4 modelViewProj)
{
//oposition = mul(modelViewProj,position);
}
在使用 vp20 和 vp30 编译时会提示错误信息: error C6014: Required output ‘HPOS’ not written 。在使用 vs_2_0 和 vs_3_0 编译时会提示错误信息: error C6014 : Required output ‘POSITION’ not written.
为了保持顶点程序输出语义和片段程序输入语义的一致性,通常使用相同的 struct 类型数据作为两者之间的传递,这是一种非常方便的写法,推荐使用。例如:
struct VertexIn
{
float4 position : POSITION;
float4 normal : NORMAL;
};
struct VertexScreen
{
float4 oPosition : POSITION;
float4 objectPos : TEXCOORD0;
float4 objectNormal : TEXCOORD1;
};
注意:当使用 struct 结构中的成员变量绑定语义时,需要注意到顶点着色程序中使用的 POSITION 语义词,是不会被片段程序所使用的。
如果需要从顶点着色程序向片段程序传递数据,例如顶点投影坐标、光照信息等,则可以声明另外的参数,绑定到 TEXCOORD 系列的语义词进行数据传递,实际上 TEXCOORD 系列的语义词通常都被用于从顶点程序向片段程序之间传递数据
当然,你也可以选择不使用 struct 结构,而直接在函数形参中进行语义绑定。无论使用何种方式,都要记住 vertex program 中的绑定语义( POSITION 除外)的输出形参中的数据会传递到 fragment program 中绑定相同语义的输入形参中。
7.5.4 片段着色程序的输出语义
片段着色程序的输出语义词较少,通常是 COLOR 。这是因为片段着色程序运行完毕后,就基本到了 GPU 流水线的末端了。 片段程序必须声明一个 out 向量(三元或四元),绑定语义词 COLOR ,这个值将被用作该片断的最终颜色值。例如:
void main_f(out float4 color : COLOR)
{
color.xyz = float3(1.0,1.0,1.0);
color.w = 1.0;
}
一些 fragment profile 支持输出语义词 DEPTH ,与它绑定的输出变量会设置片断的深度值;还有一些支持额外的颜色输出,可以用于多渲染目标( multiple render targets , MRTs )。
和顶点着色程序一样,片断着色程序也可以将输出对象放入一个结构体中。不过,这种做法未必方便,理由是:片断着色程序的输出对象少,最常用的就是颜色值(绑定输出语义词 COLOR ),单独的一个向量没有必要放到结构体中。而顶点着色程序输出的对象很多,在有些光照或阴影计算中,往往要输出顶点的世界坐标、法向量、光的反射方向、折射方向、投影纹理坐标等数据,这些数据统一放到结构体中方便管理。
Cg(C for Graphic)语言语义词与语义绑定详述 (转)的更多相关文章
- R语言进行词云统计分析
R语言进行词云统计分析 本文章从爬虫.词频统计.可视化三个方面讲述了R语言的具体应用,欢迎大家共同谈论学习 1.使用 rvest 进行数据的爬取 #如果没有,先安装rvest包 install.pac ...
- go语言之进阶篇值语义和引用语义
1.值语义和引用语义 示例: package main import "fmt" type Person struct { name string //名字 sex byte // ...
- 对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector
一.对象语义与值语义 1.值语义是指对象的拷贝与原对象无关.拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝).比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,v ...
- R语言之词云:wordcloud&wordcloud2安装及参数说明
一.wordcloud安装说明 install.packages("wordcloud"); 二.wordcloud2安装说明 install.packages("dev ...
- R语言︱文本挖掘——词云wordcloud2包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...
- R语言文本挖掘+词云显示(jiebaR包+wordcloud2包)
利用2018年政府工作报告的例子向大家展示一下R语言如何进行文本挖掘的~用到的包有jiebaR和wordcloud2. 1.安装并加载jiebaR install.packages("jie ...
- 第一次学习 CG( c for graphic) 遇到的一大推坑
1.CG开发环境的配置: 具体的工具包下载及整体的配置过程可以参考:https://blog.csdn.net/seamanj/article/details/8300936. 上面网址的内容是对VS ...
- 多线程的指令重排问题:as-if-serial语义,happens-before语义;volatile关键字,volatile和synchronized的区别
一.指令重排问题 你写的代码有可能,根本没有按照你期望的顺序执行,因为编译器和 CPU 会尝试指令重排来让代码运行更高效,这就是指令重排. 1.1 虚拟机层面 我们都知道CPU执行指令的时候,访问内存 ...
- 【练习】rust中的复制语义和移动语义
1.基本类型都是复制语义的 fn main(){ let a = 123; { #[allow(unused_variables)] let b = a; //如果是移动语义,那么后续的a将不再有效 ...
随机推荐
- POJ - 1062 昂贵的聘礼(最短路Dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...
- Android中View的事件分发机制——Android开发艺术探索笔记
原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 点击事件的事件分发就是对MotionEvent事件的分发过程.当一个MotionEvent产生了以后,系统须要把这个事件传递给 ...
- 第04章-VTK基础(2)
[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...
- JfreeChart折线图 CSDN-李鹏飞
今天公司里分配给我的工作是JfreeChart折线图本人之前也没接触过如今让我们大家一起完毕! 在这个公司,用到了太多的JfreeChart,今天就对折线图作一个总结,希望对大家有点帮助,我这里直接是 ...
- scala快速学习笔记(二):控制结构,类和对象
IV.控制结构 1.if/else 除基本用法外,if/else语句能用来赋值,进而代替?:运算符.这得益于在Scala中,每个语句块都有值,就是该语句块最后一个语句的值.请看下面的代码. def a ...
- chmod|chown|chgrp和用法和区别
1.chgrp(改变文件所属用户组) chgrp 用户组 文件名 ###就是这个格了.如果整个目录下的都改,则加-R参数用于递归. 如:chgrp -R user smb.conf 2.c ...
- 百度新算法与网站SEO提升
- python 1: 解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题
问题: 我在ubuntu14.04下用python中的matplotlib模块内的pyplot输出图片不能显示中文,怎么解决呢? 解决: 1.指定默认编码为UTF-8: 在python代码开头加入如下 ...
- UIActivityIndicatorView控件的属性和方法
对于UIActivityIndicatorView的使用,我们一般会创建一个背景View,设置一定的透明度,然后将UIActivityIndicatorView贴在背景View上,在我们需要的时候将这 ...
- 非常精彩的Silverlight 2控件样式
概述 大家是否觉的现在Silverlight 2提供的默认的控件不能满足自己的要求?好在Silverlight的控件可以运用皮肤,微软Silverlight控件的设计者的主管Corrina开发了几套非 ...