cg文档翻译(边看边翻译的,翻译质量不高)

 

 

<!-- /* 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;} -->

 

1. Program Inputs and Outputs

       编程可以使用GPU操作数据流。Vertices处理操作在顶点,Fragment处理fragment

       程序员可以主要使用CPU处理数据。相比之下,一个程序是多次执行在GPU,一次没一个数据的元素在数据流中。顶点编程是执行一次在每一个顶点,fragment编程是执行一次在每一个fragment

       Cg语言店家的很多的能力,是基于c的模型。新的Cg语言,这些能力带来一些时间去明白因为他们没有直接符合c的能力。然而编程例子在这个文档证明这是很简单的使用cg语言的所有能力的。

1.1 Two Kinds of Program Inputs:

Cg语言可以给用户两种不同的输入方式:

Varying inputs:是被使用到被指明的每一个元素的输入流的数据。例如,varying inputs顶点编程每一个顶点的值是可以被指明的数列。对于fragment编程,varying inputs是一个插入,例如纹理坐标。

Uniform inputs:是被使用到被指明个别的从输入数据的主流值,还有不要去改变每一个流元素。例如,一个顶点元素典型需要变换矩阵 因为 一个 uniform input。通常,uniform inputs是处理图像状态。

 

1.2 Varying Inputs to a Vertex Program:

一个顶点的编程 典型的用户可以有很多不同的 每一个 vertexvarying)输入。例如:编程可能需要应用指明跟随varying inputs为了每一个顶点,典型的顶点序列:

 

1 模型空间位置:

2 模型空间法向量:

3 纹理坐标:

 

在一个合适函数图形渲染关心,在设计可能的每一个顶点是小的和先死的。先指明设置输入是暴露的,在应用中通过图形API。例如,OpenGL41.4提供能力指明顶点数列的法向量。

 

在一个可编程管线中,这里是没有更长的笑得设置每一个先指明输入。他是完美的 合理的为了开发去写顶点编程 那是 使用一个 每一个顶点折射上下文,应用提供这个值和每一个顶点。

 

Cg提供一个弹性机制对于可指明的每一个顶点输入在表单设置先前的名字。每一个程序输入必须捆绑在名字从这个设置上。下面紧挨着一个结构,顶点程序定义绑定他的参数在先前定义好的名字 POSITION NORMALTANGENT 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 profilesbinding semantics 暗中指明了varying inputs mapping 特殊的硬件注册。然而,在cg中的directX profiles 是没有这样的暗语的。

 

Binding semantics可能是直接指明在程序中的参数甚至在结构的元素中。因此,接下来的顶点程序定义的这个规定:

 

Outdata foofloat3 myPosition POSITION

{

/* ... */

// Within the program, the parameters are referred to by

// their variable names: “myPosition”, “myNormal”,

// “myTangent”, and “refractive_index”.

/* ... */

}

 

1.3 Varying outputs to and from Vertex Programs

顶点编程的outputs通过 光栅 制造 可能的 fragment program varying inputs。为了vertex programfragment 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 barmyvf indata

{

Float4 x= indata.uv0;

}

 

接下来binding semantics 是可利用在所有的Cg vertex profiles 从顶点程序输出:POSITION PASIZEFOGCOLOR0-COLOR1and 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 fragmainmyvert2frag indata

{

Float4 tcoord = indata.uv0;

}

 

例子的值与相似的输出顶点联合 semantics 打算为了是被光栅使用。这些值必能确切的使用fragment program,曾经通过没一个显示的输入的结构体,例如indata.pos 值联合 POSITIOn fragment semantic 可能不能读取在 fragmain shader

 

1.4 Varying Outputs from Fragment Programs

Binding semantics 总是需要在 输出fragment programsFragment programs是需要舍命和设置向量输出使用 COLOR semantic。这个值通常是被使用在硬件的最终fragmentcolor。很多fragment profiles也支持 DEPTH output semantic,哪一个允许使用depth value fragment 修改,和很多支持的 color outputshardware 那是支持对个 渲染目标 MRTs

 

因此和vertex programsfragment programs 可能 返回他们的 输出在 主体的结构,然而,他常常更多遍历的两者之间的声明输出 out 参数:

 

Void mainout float4 color COLORout float depth DEPTH

{

Color = diffuseColor * 。。。;

Depth = 。。。;

}

或联合和semantic和返回shader值:

 

Float4 main(。。。。 COLOR

{

Return diffuseColor * 。。。。;

}

接下来的例子表示一个简单的vertex program 那是 计算 漫射和反射光。两个结构体为了 varying dataappin 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 = normalizemul(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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值