OpenGL和OpenGL Shading Language的关系?
1个回答
展开全部
打个比方,你的PC上运行着一个使用了 opengl 的客户端程序,这个客户端程序同时会访问一个服务器(显卡)提供的服务,那么 shader 就是你上传到服务器上进行运行的程序。
这个“服务器”(显卡)比较特殊,提供很特定的服务(把客户端提供的 3d 几何图形,根据摄像机位置等参数,经过一系列计算,转换成屏幕显示缓冲区 [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。
这个“服务器”(显卡)比较特殊,提供很特定的服务(把客户端提供的 3d 几何图形,根据摄像机位置等参数,经过一系列计算,转换成屏幕显示缓冲区 [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。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询