glslcg hlsl语言 cg 哪个是跨平台

10255人阅读
GPU(291)
Shader(131)
其它文章(1413)
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”
&&& In the last year I have never had to write a single HLSL/GLSL shader. Bottom line, I can’t think of any reason NOT to use CG.
&&& shader language,称为着色语言,shade在英语是阴影、颜色深浅的意思,Wikipedia上对shader language的解释为“The job of a surface shading procedure is to choose a color for each pixel on a surface, incorporating any variations in color of the surface itself and
the effects of lights that shine on the surface(Marc Olano)”,即,shader language基于物体本身属性和光照条件,计算每个像素的颜色值。
&&& 实际上这种解释具有明显的时代局限性,在GPU编程发展的早期,shader language的提出目标是加强对图形处理算法的控制,所以对该语言的定义亦针对于此。但随着技术的进步,目前的shader language早已经用于通用计算研究。
&&& shader language被定位为高级语言,如,GLSL的全称是“High Level Shading Language”,Cg语言的全称为“C for Graphic”,并且这两种shader language的语法设计非常类似于C语言。不过高级语言的一个重要特性是“独立于硬件”,在这一方面shader language暂时还做不到,shader language完全依赖于GPU构架,这一特征在现阶段是非常明显的!任意一种shader language都必须基于图形硬件,所以GPU编程技术的发展本质上还是图形硬件的发展。在shader
language存在之前,展示基于图形硬件的编程能力只能靠低级的汇编语言。
&&& 目前,shader language的发展方向是设计出在便捷性方面可以和C++/JAVA相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“尽可能的控制渲染过程”同时“利用图形硬件的并行性,提高算法的效率”。Shader language目前主要有3种语言:基于OpenGL的GLSL,基于Direct3D的HLSL,还有NVIDIA公司的Cg 语言。
&&& 本章的目的是阐述shader language的基本原理和运行流程,首先从硬件的角度对Programmable Vertex Processor(可编程顶点处理器,又称为顶点着色器)和 Programmable Fragment Processor(可编程片断处理器,又称为片断着色器)的作用进行阐述,然后在此基础上对vertex program和fragment program进行具体论述,最后对GLSL、HLSL和Cg进行比较。
3.1 Shader Language原理
&&& 使用shader language编写的程序称之为shader program(着色程序)。着色程序分为两类:vertex shader program(顶点着色程序)和fragment shader program(片断着色程序)。为了清楚的解释顶点着色和片断着色的含义,我们首先从阐述GPU上的两个组件:Programmable Vertex Processor(可编程顶点处理器,又称为顶点着色器)和 Programmable Fragment
Processor(可编程片断处理器,又称为片断着色器)。文献[2]第1.2.4节中论述到:
&&& The vertex and Fragment processing broken out into programmable units. The Programmable vertex processor is the hardware unit that runs your Cg Vertex programs, whereas the programmable fragment processor is the unit that runs
your Cg fragment programs.
&&& 这段话的含义是:顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行片段程序的单元。
顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵(不高于4阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还不行,这是顶点处理器的一个发展方向)。
如上所述,顶点程序运行在顶点处理器上,片段程序运行在片段处理器上,哪么它们究竟控制了GPU渲染的哪个过程。图 8展示了可编程图形渲染管线。
&&& 对比上一章图 3。中的GPU渲染管线,可以看出,顶点着色器控制顶点坐标转换过程;片段着色器控制像素颜色计算过程。这样就区分出顶点着色程序和片段着色程序的各自分工:Vertex program负责顶点坐标变换;Fragment program负责像素颜色计算;前者的输出是后者的输入。
&&& 图 9展示了现阶段可编程图形硬件的输入/输出。输入寄存器存放输入的图元信息;输出寄存器存放处理后的图元信息;纹理buffer存放纹理数据,目前大多数的可编程图形硬件只支持片段处理器处理纹理;从外部宿主程序输入的常量放在常量寄存器中;临时寄存器存放着色程序在执行过程中产生的临时数据。
3.2 Vertex Shader Program
&&& Vertex shader program(顶点着色程序)和Fragment shader program(片断着色程序)分别被Programmable Vertex Processor(可编程顶点处理器)和 Programmable Fragment Processo(可编程片断处理器)所执行。
&&& 顶点着色程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。
图 10展示了在顶点着色器和像素着色器的数据处理流程。在应用程序中设定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到vertex buffer中;纹理信息传递到texture buffer中。其中虚线表示目前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。
顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。例如,输入一个三角面片,顶点着色程序对其进行phong光照计算,只计算三个顶点的光照颜色,而三角面片内部点的颜色按照硬件默认的算法(Gourand明暗处理或者快速phong明暗处理)进行插值,如果图形硬件比较先进,默认的处理算法较好(快速phong明暗处理),则效果也会较好;如果图形硬件使用Gourand明暗处理算法,则会出现马赫带效应(条带化)。
而片断着色程序是对每个片断进行独立的颜色计算,并且算法由自己编写,不但可控性好,而且可以达到更好的效果。
&&& 由于GPU对数据进行并行处理,所以每个数据都会执行一次shader程序程序。即,每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。
3.3 Fragment Shader Program
&&& 片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。
片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一个研究方向。
&&& 附:什么是片断?片断和像素有什么不一样?所谓片断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素都是经过深度比较的。
3.4 CG VS GLSL VS HLSL
&&& Shader language目前有3种主流语言:基于OpenGL的GLSL(OpenGL Shading Language,也称为GLslang),基于Direct3D的HLSL(High Level Shading Language),还有NVIDIA公司的Cg (C for Graphic)语言。
&&& GLSL与HLSL分别提基于OpenGL和Direct3D的接口,两者不能混用,事实上OpenGL和Direct3D一直都是冤家对头,曹操和刘备还有一段和平共处的甜美时光,但OpenGL和Direct3D各自的东家则从来都是争斗不休。争斗良久,既然没有分出胜负,那么必然是两败俱伤的局面。
首先ATI系列显卡对OpenGL扩展支持不够,例如我在使用OSG(Open Scene Graphic)开源图形引擎时,由于该引擎完全基于OpenGL,导致其上编写的3D仿真程序在较老的显卡上常常出现纹理无法显示的问题。其次GLSL 的语法体系自成一家,而HLSL和Cg语言的语法基本相同,这就意味着,只要学习HLSL和Cg中的任何一种,就等同于学习了两种语言。不过OpenGL 毕竟图形API的曾经领袖,通常介绍OpenGL都会附加上一句“事实上的工业标准”,所以在其长期发展中积累下的用户群庞大,这些用户当然会选择
GLSL学习。此外,GLSL继承了OpenGL的良好移植性,一度在unix等操作系统上独领风骚(已是曾经的往事)。
&&& 微软的HLSL移植性较差,在windows平台上可谓一家独大,可一出自己的院子(还好院子够大),就是落地凤凰不如鸡。这一点在很大程度上限制了 HLSL的推广和发展。目前HLSL多半都是用于游戏领域。我可以负责任的断言,在Shader language领域,HLSL可以凭借微软的老本成为割据一方的诸侯,但,决不可能成为君临天下的霸主。这和微软现在的局面很像,就是一个被带刺鲜花簇拥着的大财主,富贵已极,寸步难行。
&&& 上面两个大佬打的很热烈,在这种情况下可以用一句俗话来形容,“鹬蚌相争,渔翁得利”。NVIDIA是现在当之无愧的显卡之王(尤其在AMD兼并ATI之后),是GPU编程理论的奠基者,GeForce系列显卡早已深入人心,它推出的Cg语言已经取得了巨大的成功,生生形成了三足鼎立之势。NVIDIA公司深通广告之道,目前最流行的GPU编程精粹一书就出自该公司,书中不但介绍了大量的GPU前沿知识,最重要的是大部分都用Cg语言实现。凭借该系列的书籍,NVIDIA不光确定了在青年学子间的学术地位,而且成功的推广了Cg语言。我本人就是使用Cg语言进行研发,基于如下理由:
&&& 其一,Cg是一个可以被OpenGL和Direct3D广泛支持的图形处理器编程语言。 Cg语言和OpenGL、DirectX并不是同一层次的语言,而是OpenGL和DirectX的上层,即,Cg程序是运行在OpenGL和 DirectX标准顶点和像素着色的基础上的;
&&& 其二,Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,文献[1]在1.3.1节的标题就是 “Microsoft and NVIDIA’s Collaboration to Develop Cg and HLSL”,所以,HLSL和Cg其实是同一种语言(参见Cg教程_可编程实时图形权威指南29页的致谢部分)。很多时候,你会发现用HLSL写的代码可以直接当中Cg代码使用。也就是说,cg基于知识联盟(Microsoft和NVIDIA),且拥有跨平台性,选择cg语言是大势所趋。有心的读者,可以注意市面上当前的GPU编程方面的书籍,大都是基于CG语言的。(附:Microsoft和NVIDIA联手推出Cg,应该是一种经济和技术上的双赢,通过这种方式联手打击GLSL)
&&& 此外,Cg,即C for graphics,用于图形的C语言,这其实说明了当时设计人员的一个初衷,就是“让基于图形硬件的编程变得和C语言编程一样方便,自由”。正如C++和 Java的语法是基于C的,cg语言本身也是基于C语言的。如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的。Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性提高等。使用cg还可以实现动画驱动、通用计算(排序、查找)等功能。
在曾经的一段时间中有一种流言:NVIDIA将要抛弃Cg语言。并且在网上关于Cg、GLSL、HLSL的优劣讨论中,Cg的跨平台性也受到过广泛的质疑。我在2007年12月参加朱幼虹老师OSG培训班时,他曾专门对Cg、GLSL、HLSL进行了比较,说道:尽管目前还有一些关于Cg和GLSL之间的争议,不过主流的3D图形厂家都开始支持Cg语言。市场经济的选择可以说明一切,时间可以明辨真伪,到2009年末,Cg语言不但没有被抛弃,而且越来越受欢迎。
&&& 我在OGRE官方论坛上,搜索过有关使用Cg和GLSL的讨论帖子,套用其中一个帖子的结尾语来结束本章:
&&& In the last year I have never had to write a single HLSL/GLSL shader. Bottom line, I can’t think of any reason NOT to use CG.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5858225次
积分:71230
积分:71230
排名:第17名
原创:71篇
转载:4285篇
评论:837条
声明:早期转载的文章未标明转载敬请原谅,以后将陆续改过来,向原创者致敬!
有问题可留言
痞子龙3D编程
QQ技术交流群:
(6)(19)(17)(17)(8)(5)(8)(14)(13)(3)(44)(42)(46)(40)(123)(114)(128)(159)(168)(40)(45)(43)(38)(5)(6)(7)(2)(3)(7)(24)(5)(5)(16)(17)(16)(66)(7)(55)(2)(37)(16)(1)(10)(6)(37)(5)(31)(18)(31)(128)(333)(203)(256)(59)(78)(57)(16)(39)(10)(27)(16)(8)(26)(32)(53)(56)(45)(142)(228)(6)(10)(6)(9)(6)(9)(22)(25)(18)(83)(208)(442)(111)(32)(1)GLSL 到 HLSL 参考
转自/zh-cn/library/windows/apps/dn166865/html
以便为 Windows&8 创建游戏时,你需要将你的 OpenGL 着色器语言 (GLSL) 代码移植到 Microsoft 高级着色器语言 (HLSL) 代码。 此处所谈到的 GLSL 兼容 OpenGL ES 2.0;HLSL
兼容 Direct3D 11。有关 Direct3D 11 和之前版本的 Direct3D 之间差别的信息,请参阅。
比较 OpenGL ES 2.0 与 Direct3D 11
OpenGL ES 2.0 和 Direct3D 11 有很多相似之处。它们都有相似的呈现管道和图形功能。但是 Direct3D 11 是呈现实现和 API,而不是规范;OpenGL ES 2.0 是呈现规范和 API,而不是实现。Direct3D 11 和 OpenGL ES 2.0 通常会在以下方面有所不同:
OpenGL ES 2.0
Direct3D 11
硬件和操作系统规范与供应商提供的实现无关
在 Windows 平台上硬件抽象和认证的 Microsoft 实现
对硬件多样性进行了抽象,运行时管理大多数资源
直接访问硬件布局;应用可以管理资源和处理
通过第三方库(例如,Simple DirectMedia Layer (SDL))提供更高级的模块
更高级的模块(如 Direct2D)构建在低级模块上,以简化 Windows 应用的开发
通过扩展名来区分硬件供应商
Microsoft 采用常规方法向 API 中添加可选功能,以便这些功能不会特定于任何特定的硬件供应商
GLSL 和 HLSL 通常会在以下方面有所不同:
注重过程,以步骤为中心(如 C)
面向对象,以数据为中心(如 C++)
着色器编译被集成到了图形 API 中
HLSL 编译器中间二进制表示,然后 Direct3D 将其传递给驱动程序。
注意&&此二进制表示与硬件无关。通常在应用构建时对其进行编译,而不是在应用运行时编译。
存储修饰符
通过输入布局声明进行常量缓冲区和数据传输
典型的矢量类型:vec2/3/4
lowp、mediump、highp
典型的矢量类型:float2/3/4
min10float、min16float
texture2D [Function]
[datatype.Function]
sampler2D [datatype]
[datatype]
行主序矩阵(默认设置)
列主序矩阵(默认设置)
注意&&使用 row_major 类型修饰符来更改一个变量的布局。有关详细信息,请参阅。还可以指定编译器标志或 pragma 来更改全局默认设置。
片段着色器
像素着色器
注意&&HLSL 让纹理和采样器作为两个不同的对象。在 GLSL(如 Direct3D 9)中,纹理绑定是采样器状态的一部分。
在 GLSL 中,将大多数 OpenGL 状态呈现为预定义的全局变量。例如,对于 GLSL,你使用 gl_Position 变量指定顶点位置,使用
gl_FragColor 变量指定片段颜色。在 HLSL 中,将 Direct3D 状态从应用代码显式传递到着色器。例如,对于 Direct3D 和 HLSL,顶点着色器的输入必须与顶点缓冲区中的数据格式相匹配,并且应用代码中常量缓冲区的结构必须与着色器代码中常量缓冲区 ()
的结构相匹配。
将 GLSL 变量移植到 HLSL
在 GLSL 中,将修饰符(限定符)应用于全局着色器变量声明,以为该变量提供一个你的着色器中的特定行为。在 HLSL 中,不需要这些修饰符,因为你使用传递给着色器的参数以及从着色器返回的参数定义了着色器流。
GLSL 变量行为
HLSL 等效内容
将 uniform 变量从应用代码传递到顶点着色器和分段着色器或传递到两者。必须在使用这些着色器绘制任何三角形之前,设置所有 uniform 的值,以便它们的值在绘制三角形网格的整个过程中保持不变。这些值都是 uniform。一些 uniform 是针对整个帧设置的,另一些 uniform 唯一对应于一个特定的顶点像素着色器对。
uniform 变量是每个多边形的变量。
使用常量缓冲区。
请参阅和。
在顶点着色器内初始化一个 varying 变量,并将其传递到片段着色器中具有相同名称的 varying 变量。由于顶点着色器仅设置每个顶点上的 varying 变量的值,因此光栅器会插入这些值(采用透视校正的方式),以生成每个要传递到片段着色器中的片段值。这些变量在各个三角形之间有所不同。
使用从顶点着色器返回的结构作为像素着色器的输入。确保语义值相匹配。
attribute 只是你从应用代码传递到顶点着色器的顶点描述的一部分。与 uniform 不同,你为每个顶点设置每个 attribute 的值,但却允许每个顶点拥有不同的值。attribute 变量是每个顶点的变量。
在 Direct3D 应用代码中定义顶点缓冲区并将其与顶点着色器中定义的顶点输入相匹配。也可以定义索引缓冲区。请参阅和。
在 Direct3D 应用代码中创建输入布局并将语义值与顶点输入中的值相匹配。请参阅。
常量编译到着色器中,从不更改。
使用 static const。static 表示未向常量缓冲区显示该值,const 表示着色器无法更改该值。因此,在编译时我们根据它的初始值来了解该值。
在 GLSL 中,没有修饰符的变量只是普通的全局变量,它们是每个着色器的私有变量。
当将数据传递到纹理(在 HLSL 中为 )及其关联的采样器 (在 HLSL 中为 )时,通常会在像素着色器中将它们声明为全局变量。
将 GLSL 类型移植到 HLSL
使用该表将 GLSL 类型移植到 HLSL。
标量类型:float、int、bool
标量类型:float、int、bool
also、uint、double
有关详细信息,请参阅。
浮点矢量:vec2、vec3、vec4布尔矢量:bvec2、bvec3、bvec4有符号整数矢量:ivec2、ivec3、ivec4
float2、float3、float4 和 float1bool2、bool3、bool4 和 bool1int2、int3、int4 和 int1
这些类型也都有类似于 float、bool 和 int 的矢量扩展:
uintmin10float、min16floatmin12int、min16intmin16uint
有关详细信息,请参阅和。
vector 是定义为 float4 的 also 类型 (typedef vector &float, 4&)。有关详细信息,请参阅。
mat2: 2x2 浮点矩阵mat3: 3x3 浮点矩阵mat4: 4x4 浮点矩阵
float2x2float3x3float4x4also、float1x1、float1x2、float1x3、float1x4、float2x1、float2x3、float2x4、float3x1、float3x2、float3x4、float4x1、float4x2、float4x3
这些类型也都有类似于 float 的矩阵扩展:
int、uint、boolmin10float、min16floatmin12int、min16intmin16uint
也可以使用来定义矩阵。
例如:matrix &float, 2, 2& fMatrix = {0.0f, 0.1, 2.1f, 2.2f};
matrix 是定义为 float4x4 的 also 类型 (typedef matrix &float, 4, 4&)。有关详细信息,请参阅。
float、int、sampler 的精度限定符
该限定符提供最低精度要求,该要求大于 min16float 提供的要求,但小于完整的 32 位浮点。 HLSL 中的等效内容为:
highp float -& float
highp int -& int
该限定符应用于 float 和 int,它等效于 HLSL 中的 min16float 和 min12int。 最低 10 位尾数,与 min10float 不同。
该限定符应用于 float,它提供的浮点范围为 -2 到 2。等效于 HLSL 中的 min10float。
min16float:最低 16 位浮点值min10float
最低固定点有符号 2.8 位值(2 位整数和 8 位小数部分)。8 位小数部分可以包括 1,而非排除 1,目的是为它提供完整的包含范围 -2 到 2。
min16int:最低 16 位有符号整数min12int:最低 12 位有符号整数
该类型用于 10Level9(),其中整数由浮点数来表示。 这是在使用 16 位浮点数模拟整数时可以获得的精度。
min16uint:最低 16 位无符号整数
有关详细信息,请参阅和。
samplerCube
将 GLSL 预定义的全局变量移植到 HLSL
使用该表将 GLSL 预定义的全局变量移植到 HLSL。
GLSL 预定义的全局变量
gl_Position
该变量为 vec4 类型。
例如 - gl_Position =
SV_Position
在 Direct3D 9 中为 POSITION
该语义为 float4 类型。
顶点着色器输出
例如 - float4 vPosition : SV_P
gl_PointSize
该变量为 float 类型。
除非你的目标是 Direct3D 9,否则没有意义
该语义为 float 类型。
顶点着色器输出
gl_FragColor
该变量为 vec4 类型。
例如 - gl_FragColor = vec4(colorVarying, 1.0);
在 Direct3D 9 中为 COLOR
该语义为 float4 类型。
像素着色器输出
例如 - float4 Color[4] : SV_T
gl_FragData[n]
该变量为 vec4 类型。
颜色附件 n 的片段颜色
SV_Target[n]
该语义为 float4 类型。
n 呈现目标中存储的像素着色器输出值,其中 0 &= n &= 7。
gl_FragCoord
该变量为 vec4 类型。
帧缓冲区中的片段位置
SV_Position
在 Direct3D 9 中不可用
该语义为 float4 类型。
像素着色器输入
屏幕空间坐标
例如 - float4 screenSpace : SV_Position
gl_FrontFacing
该变量为 bool 类型。
确定片段是否属于正面基元。
SV_IsFrontFace
在 Direct3D 9 中为 VFACE
SV_IsFrontFace 为 bool 类型。
SV_IsFrontFace 为 float 类型。
像素着色器输入
gl_PointCoord
该变量为 vec2 类型。
某个点中的片段位置(仅限点光栅化)
SV_Position
在 Direct3D 9 中为 VPOS
SV_Position 为 float4 类型。
VPOS 为 float2 类型。
像素着色器输入
屏幕空间中的像素或示例位置
例如 - float4 pos : SV_Position
gl_FragDepth
该变量为 float 类型。
深度缓冲区数据
在 Direct3D 9 中为 DEPTH
SV_Depth 为 float 类型。
像素着色器输出
深度缓冲区数据
使用语义指定位置、颜色等作为顶点着色器输入和像素着色器输入。必须将输入布局中的语义值与顶点着色器输入相匹配。例如,请参阅。有关 HLSL 语义的详细信息,请参阅。
将 GLSL 变量移植到 HLSL 的示例
下面我们介绍在 OpenGL/GLSL 代码中使用 GLSL 变量的示例,然后介绍在 Direct3D/HLSL 代码中的等效示例。
GLSL 中的 uniform、attribute 和 varying
OpenGL 应用代码
// Uniform values can be set in app code and then processed in the shader code.
uniform mat4
uniform mat4
uniform mat4
// Incoming position of vertex
attribute vec4
// Incoming color for the vertex
attribute vec3
// The varying variable tells the shader pipeline to pass it
// on to the fragment shader.
varying vec3 colorV
GLSL 顶点着色器代码
//The shader entry point is the main method.
void main()
colorVarying = //Use the varying variable to pass the color to the fragment shader
gl_Position = //Copy the position to the gl_Position pre-defined global variable
GLSL 片段着色器代码
void main()
//Pad the colorVarying vec3 with a 1.0 for alpha to create a vec4 color
//and assign that color to the gl_FragColor pre-defined global variable
//This color then becomes the fragment's color.
gl_FragColor = vec4(colorVarying, 1.0);
HLSL 中的常量缓冲区和数据传输
下面是如何将数据传递到 HLSL 顶点着色器,然后流动到像素着色器的示例。在你的应用代码中,定义一个顶点缓冲区和一个常量缓冲区。然后,在你的顶点着色器代码中,将常量缓冲区定义为
并存储每个顶点数据以及像素着色器输入数据。这里我们使用名为 VertexShaderInput 和
PixelShaderInput 的结构。
Direct3D 应用代码
C++
struct ConstantBuffer
XMFLOAT4X4
XMFLOAT4X4
XMFLOAT4X4
struct SimpleCubeVertex
// position
XMFLOAT3 // color
// Create an input layout that matches the layout defined in the vertex shader code.
const D3D11_INPUT_ELEMENT_DESC basicVertexLayoutDesc[] =
{ &POSITION&, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,
0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ &COLOR&,
0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
// Create vertex and index buffers that define a geometry.
HLSL 顶点着色器代码
cbuffer ModelViewProjectionCB : register( b0 )
// The POSITION and COLOR semantics must match the semantics in the input layout Direct3D app code.
struct VertexShaderInput
float3 pos : POSITION; // Incoming position of vertex
float3 color : COLOR; // Incoming color for the vertex
struct PixelShaderInput
float4 pos : SV_P // Copy the vertex position.
float4 color : COLOR; // Pass the color to the pixel shader.
PixelShaderInput main(VertexShaderInput input)
PixelShaderInput vertexShaderO
// shader source code
return vertexShaderO
HLSL 像素着色器代码
// Collect input from the vertex shader.
// The COLOR semantic must match the semantic in the vertex shader code.
struct PixelShaderInput
&&& float4 pos : SV_P
&&&&float4 color : COLOR; // Color for the pixel
// Set the pixel color value for the renter target.&
float4 main(PixelShaderInput input) : SV_Target
&&& return input.
将 OpenGL 呈现代码移植到 Direct3D 的示例
下面我们介绍一个在 OpenGL ES 2.0 代码中进行呈现的示例,然后介绍在 Direct3D 11 代码中的等效示例。
OpenGL 呈现代码
// Bind shaders to the pipeline.
// Both vertex shader and fragment shader are in a program.
glUseProgram(m_shader-&getProgram());
// Input asssembly
// Get the position and color attributes of the vertex.
m_positionLocation = glGetAttribLocation(m_shader-&getProgram(), &position&);
glEnableVertexAttribArray(m_positionLocation);
m_colorLocation = glGetAttribColor(m_shader-&getProgram(), &color&);
glEnableVertexAttribArray(m_colorLocation);
// Bind the vertex buffer object to the input assembler.
glBindBuffer(GL_ARRAY_BUFFER, m_geometryBuffer);
glVertexAttribPointer(m_positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, m_colorBuffer);
glVertexAttribPointer(m_colorLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL);
// Draw a triangle with 3 vertices.
glDrawArray(GL_TRIANGLES, 0, 3);
Direct3D 呈现代码
C++
// Bind the vertex shader and pixel shader to the pipeline.
m_d3dDeviceContext-&VSSetShader(vertexShader.Get(),nullptr,0);
m_d3dDeviceContext-&PSSetShader(pixelShader.Get(),nullptr,0);
// Declare the inputs that the shaders expect.
m_d3dDeviceContext-&IASetInputLayout(inputLayout.Get());
m_d3dDeviceContext-&IASetVertexBuffers(0, 1, vertexBuffer.GetAddressOf(), &stride, &offset);
// Set the primitive’s topology.
m_d3dDeviceContext-&IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Draw a triangle with 3 vertices. triangleVertices is an array of 3 vertices.
m_d3dDeviceContext-&Draw(ARRAYSIZE(triangleVertices),0);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4256次
排名:千里之外
转载:22篇
(1)(1)(20)

我要回帖

更多关于 cg hlsl glsl 的文章

 

随机推荐