图形学笔记 -- Shader Language 入门初探

图形编程可以带来很多的乐趣,然而如果什么东西渲染错误,或者甚至根本就没有渲染,它同样可以给你带来大量的沮丧感!由于我们大部分时间都在与像素打交道,当出现错误的时候寻找错误的源头可能会非常困难。调试 (Debug) 这样的视觉错误与往常熟悉的 CPU 调试不同。我们没有一个可以用来输出文本的控制台,在 GLSL 代码中也不能设置断点,更没有方法检测 GPU 的运行状态。

用 vscode+glsl canvas 插件可以作为一个 shader 开发环境。最终选择了:glsl。

Shader Language?

三大 Shader 编程语言(CG / HLSL / GLSL)。Shader Language 目前主要有 3 种语言:

  1. GLSL ( OpenGL ) 基于 OpenGL 的 OpenGL Shading Language,简称 GLSL;
  2. HLSL ( DirectX ) 基于 DirectX 的 High Level Shading Language,简称 HLSL;
  3. CG ( OpenGL & DirectX capable, made by NVIDIA ) 还有 NVIDIA 公司的 C for Graphic,简称 Cg 语言。

Cg

GLSL 与 HLSL 分别基于 OpenGL 和 Direct3D 的接口,两者不能混用。

Cg 是一个可以被 OpenGL 和 Direct3D 广泛支持的图形处理器编程语言。 Cg 语言和 OpenGL、Direct3D 并不是同一层次的语言,而是 OpenGL 和 DirectX 的上层, 即 Cg 程序是运行在 OpenGL 和 DirectX 标准顶点和像素着色的基础上的。 Cg 由 NVIDIA 公司和微软公司相互协作在标准硬件光照语言的语法和语义上达成了一致开发。 所以,HLSL 和 Cg 其实是同一种语言。

OpenGL / GLSL 渲染环境搭建

  • 显卡驱动支持 OpenGL 3.2 及以上版本。
  • freeglut 库或者 glut 库。
  • glew 库。
  • 集成开发环境(Visual Studio 2013)

OpenGL / GLSL

图 2.6 GPU 的渲染流水线实现。颜色表示了不同阶段的可配置性或可编程性: 绿色表示该流水线阶段是完全可编程控制的, 黄色表示该流水线阶段可以配置但不是可编程的, 蓝色表示该流水线阶段是由 GPU 固定实现的,开发者没有任何控制权。 实线表示该 shader 必须由开发者编程实现,虚线表示该 Shader 是可选的。

图 2.11 OpenGL 和 DirectX 的屏幕坐标系差异。对于一张 512*512 大小的图像,在 OpenGL 中其(0, 0)点在左下角,而在 DirectX 中其(0, 0)点在左上角。

EGL 介绍和使用

EGL 介绍和使用 link

EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口。

通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的。

因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁。

一些牛逼

士郎 Shader — 实时水面模拟与渲染(一)

参考


参考资料快照
参考资料快照

本文短链接:
If you have any questions or feedback, please reach out .