<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h1 {mso-style-next:正文; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:240%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; font-size:22.0pt; font-family:"Times New Roman"; mso-font-kerning:22.0pt;} h2 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:173%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; font-size:16.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
编程可以使用GPU操作数据流。Vertices处理操作在顶点,Fragment处理fragment。
程序员可以主要使用CPU处理数据。相比之下,一个程序是多次执行在GPU,一次没一个数据的元素在数据流中。顶点编程是执行一次在每一个顶点,fragment编程是执行一次在每一个fragment。
Cg语言店家的很多的能力,是基于c的模型。新的Cg语言,这些能力带来一些时间去明白因为他们没有直接符合c的能力。然而编程例子在这个文档证明这是很简单的使用cg语言的所有能力的。
Cg语言可以给用户两种不同的输入方式:
Varying inputs:是被使用到被指明的每一个元素的输入流的数据。例如,varying inputs顶点编程每一个顶点的值是可以被指明的数列。对于fragment编程,varying inputs是一个插入,例如纹理坐标。
Uniform inputs:是被使用到被指明个别的从输入数据的主流值,还有不要去改变每一个流元素。例如,一个顶点元素典型需要变换矩阵 因为 一个 uniform input。通常,uniform inputs是处理图像状态。
一个顶点的编程 典型的用户可以有很多不同的 每一个 vertex(varying)输入。例如:编程可能需要应用指明跟随varying inputs为了每一个顶点,典型的顶点序列:
1 模型空间位置:
2 模型空间法向量:
3 纹理坐标:
在一个合适函数图形渲染关心,在设计可能的每一个顶点是小的和先死的。先指明设置输入是暴露的,在应用中通过图形API。例如,OpenGL41.4提供能力指明顶点数列的法向量。
在一个可编程管线中,这里是没有更长的笑得设置每一个先指明输入。他是完美的 合理的为了开发去写顶点编程 那是 使用一个 每一个顶点折射上下文,应用提供这个值和每一个顶点。
Cg提供一个弹性机制对于可指明的每一个顶点输入在表单设置先前的名字。每一个程序输入必须捆绑在名字从这个设置上。下面紧挨着一个结构,顶点程序定义绑定他的参数在先前定义好的名字 POSITION ,NORMAL,TANGENT 和 TEXCOORD3.这个应用必须提供顶点数据序列关联先前的名字。
struct myinputs {
float3 myPosition : POSITION;
float3 myNormal : NORMAL;
float3 myTangent : TANGENT;
float refractive_index : TEXCOORD3;
};
outdata foo(myinputs indata)
{
/* ... */
// Within the program, the parameters are referred to as
// “indata.myPosition”, “indata.myNormal”, and so on.
/* ... */
}
我们涉及先定义的名字binding semantics。这些跟随涉及绑定的语言是被提供的在所有的Cg顶点编程概括中。一些cg profiles支持添加绑定的语言定义。
POSITION BLENDWEIGHT
NORMAL TANGENT
BINORMAL PSIZE
BLENDINDICES TEXCOORD0-TEXCOORD7
Binding semantic POSITION0 等同于 POSITION;同样的,其他的binding semantics 有相似的等同。
在OpenGL cg profiles,binding semantics 暗中指明了varying inputs 的mapping 到 特殊的硬件注册。然而,在cg中的directX profiles 是没有这样的暗语的。
Binding semantics可能是直接指明在程序中的参数甚至在结构的元素中。因此,接下来的顶点程序定义的这个规定:
Outdata foo(float3 myPosition : POSITION)
{
/* ... */
// Within the program, the parameters are referred to by
// their variable names: “myPosition”, “myNormal”,
// “myTangent”, and “refractive_index”.
/* ... */
}
顶点编程的outputs通过 光栅 和 是 制造 可能的 fragment program 像 varying inputs。为了vertex program和fragment program 硬件沟通,他们的数据必须彼此通过同意。
因此塔左美子的应用和顶点程序编程和fragment program。
这个例子现实了使用binding semantics 输出 vertex program:
Struct myvf
{
Float4 pout : POSITION;
Float4 diffusecolor : COLOR0;
Float4 uv0 : TEXCOORD0;
Float4 uv1 : TEXCOORD1;
};
Myvf foo()
{
Myvf outstuff;
Return outstuff;
}
这个实例显示图和去使用相似的数据 输入 一个 fragement program:
Struct myvf
{
Float4 diffusecolor : COLOR0;
Float4 uv0 : TEXCOORD0;
Float4 uv1 : TEXCOORD1;
};
Fragout bar(myvf indata)
{
Float4 x= indata.uv0;
}
接下来binding semantics 是可利用在所有的Cg vertex profiles 从顶点程序输出:POSITION ,PASIZE,FOG,COLOR0-COLOR1,and TEXCOODRD0-TEXCOORD7.
所有的vertex programs 必须声明和设置一个vector 输出使用 POSITION binding semantic。这个值是必须光栅。
确保通用性在vetex programs 和 fragment programs,二者必须使用相似的结构体给他们各自的outputs and inputs。
Struct myvert2frag
{
Float4 pos :POSITION;
Float4 uv0 :TEXCOORD0;
Float4 uv1 :TEXCOORD1;
}
Myvert2frag vertmain(。。。)
{
Myvert2frag outdata;
Return outdata;
}
Void fragmain(myvert2frag indata)
{
Float4 tcoord = indata.uv0;
}
例子的值与相似的输出顶点联合 semantics 打算为了是被光栅使用。这些值必能确切的使用fragment program,曾经通过没一个显示的输入的结构体,例如indata.pos 值联合 POSITIOn fragment semantic 可能不能读取在 fragmain 的 shader。
Binding semantics 总是需要在 输出fragment programs。Fragment programs是需要舍命和设置向量输出使用 COLOR semantic。这个值通常是被使用在硬件的最终fragment的color。很多fragment profiles也支持 DEPTH output semantic,哪一个允许使用depth value的 fragment 修改,和很多支持的 color outputs给hardware 那是支持对个 渲染目标 MRTs
因此和vertex programs,fragment programs 可能 返回他们的 输出在 主体的结构,然而,他常常更多遍历的两者之间的声明输出 out 参数:
Void main(out float4 color : COLOR,out float depth : DEPTH)
{
Color = diffuseColor * 。。。;
Depth = 。。。;
}
或联合和semantic和返回shader值:
Float4 main(。。。。 : COLOR)
{
Return diffuseColor * 。。。。;
}
接下来的例子表示一个简单的vertex program 那是 计算 漫射和反射光。两个结构体为了 varying data,appin 和 vertout,也声明。不要担心确定程序是做什么,目标仅仅是给你一个主意 cg code是什么样子的。
Struct appin
{
Float4 position : POSITION;
Float4 Normal : NORMAL;
};
Struct vertout
{
Float4 Hposition : POSITION;
Float4 Color : COLOR;
};
Vertout main(
Appin IN,
Uniform float4x4 ModelViewProj,
Uniform float4x4 ModelViewIT,
Uniform float4 LightVec
)
{
Vertout OUT;
OUT.Hposition = mul(ModelViewProj,IN.Position);
Float3 normalVec = normalize(mul(ModelViewIT,IN.Normal).xyz);
Float3 lightVec = normalize(LightVec.xyz);
Float3 eyeVec = float3(0.0,0.0,1.0);
Float3 halfVec = normalize(lightVec + eyeVec);
Float diffuse = dot(normalVec,lightVec);
Float specular = dot(normalVec,halfVec);
Float3 lighting = lit(diffuse,specular,32);
Float3 diffuseMaterial = float3(0.0,0.0,.1.0);
Float3 specularMaterial = float3(1.0,1.0,1.0);
OUT.Color.rgb = lighting.y * diffuseMaterial +
Lighting.z * specularMaterial;
OUT.Color.a = 1.0;
Return OUT;
}