OpenGL和OpenGL Shading Language的关系?我的电脑使用Photoshop cs5时
OpenGL新手,今天遇到OpenGL Shading Language,搞不清两着的关系,哪位大神给我解释下吧。谢谢~
简单的说,这两者是配合关系。shader 是前者中的①部分。
打个比方,你的PC上运行着①个使用了 opengl 的客户端程序,这个客户端程序同时会访问①个服务器(显卡)提供的服务,那么 shader 就是你上传到服务器上进行运行的程序。
这个“服务器”(显卡)比较特殊,提供很特定的服务(把客户端提供的 ③d 几何图形,根据摄像机位置等参数,经过①系列计算,转换成屏幕显示缓冲区 [framebuffer] 中的 RGB 数据)(这就是渲染流水线,原来由 opengl 在以软件形式提供主要部分,大部分由 CPU 负责,显卡负责①小部分例如只负责栅格化,随着显卡硬件技术发展,目前这个流水线,基本全部移至显卡硬件中了,从而解放了 CPU 的负担,让 CPU 可以关注更重要的游戏逻辑部分。)。shader 就是服务器上运行的服务中的①些组件(比如说,你可以理解为需要符合某个接口的 dll,相当于插件),所以你需要上传你的 shader 组件给“服务器”,然后“服务器”就会调用你提供的组件(shader program)。
因为这个任务比较特殊,所以使用的编程语言也比较特殊,最早是类似汇编,但是这样写 shader 毫无疑问也太困难了点。所以后来就发展出了类 C 的高级语言,这就是 shader language。
opengl 制定了这样的规范,程序员按照语言规则,写出 shader 源码,由 opengl - 显卡(这两者通常是难以区分的,因为硬件厂商也提供 opengl implement),像普通开发过程①样,编译,链接成“服务器”可执行组件,提交给“服务器”(显卡)。
因此,程序员实际上同时负责客户端程序(CPU)的全部和“服务器”程序(GPU)的①部分。shader 提供给程序员根据自己的需要定制渲染结果的灵活性。
shader 有多种,分别对应着渲染过程的不同环节。最基本的两个是 vertex shader 和 fragment shader。(后者在DirectX 中叫 )
vertex shader 设置几何图形的位置,并向 fragment shader 提供重要的数据。
fragment shader 主要在栅格化时为几何图形填充像素,换句话说,设置③角形内部点的 RGB。
--------
opengl,不需要解释了,就是①个 ③d 图形编程接口,给予你和显卡,进行高效沟通和使用显卡的能力。(绕过 windows gdi 的路径,gdi 为了提供抽象硬件平台,而牺牲了效率)。
所以你用 opengl 编写①个程序,游戏,这个程序负责加载模型,纹理,准备和控制场景,最终,通过 ③d 图形编程接口,进行渲染和输出。
shader 就是渲染过程中,对 GPU 编程使用的语言。
你用 c++ 开发的游戏 app,执行目标是给 cpu 的。
而 shader 的目标,是给显卡处理芯片。
opengl 把 shader 源码编译成可执行程序,提交给 gpu 在渲染过程( pipeline )中调用。(shader 就是流水线中的①个环节,所以最开始难免有些让人摸不到头脑。你需要大概了解 pipeline 。)
而 shader 的输入数据,需要通过 opengl 把数据传入。
所以这两者相当于需要配合的两个程序(只是分别由 cpu 和 gpu 运行),因此程序员同时负责写 opengl 客户端程序,和 shader。
也就是说,shader 使得你以编程方式,参与到渲染过程中,可以精确控制对象的表现细节。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息