OpenGL中的着色器是什么?我们需要它们是什么?

时间:2013-07-22 14:02:37

标签: opengl shader

我不是以英语为母语的人,当我试图通过www.learnopengl.com上的openGL wiki和教程时,直觉也无法理解整个概念是如何运作的。有人可以用更抽象的方式向我解释它是如何工作的吗?什么是顶点着色器和片段着色器以及我们将它们用于什么?

2 个答案:

答案 0 :(得分:20)

OpenGL wiki给出了一个很好的定义:

  

Shader是一个用户定义的程序,设计用于在图形处理器的某个阶段运行。

过去,显卡是不可编程的硅片,它执行一系列固定算法:点/颜色/灯进来,使用固定算法(通常沿https://en.wikipedia.org/wiki/Phong_reflection_model出现2D图像)。

但对于想要创造许多不同视觉效果的程序员来说,这太过限制了。

随着技术的进步,GPU供应商开始允许渲染管道的某些部分被编程为编程语言,如GLSL。

然后将这些语言转换为semi-undocumented instruction sets,这些语言在内置于较新GPU的小型“CPU”上运行。

直到不久前,着色器语言were not even Turing complete

术语通用GPU(GPGPU)是指现代GPU的可编程性增强。

在OpenGL模型中,只有下图的蓝色阶段是可编程的:

enter image description here

Image source

着色器从前一个流水线阶段获取输入(例如顶点位置,颜色和光栅化像素),并将输出自定义到下一个阶段。

最重要的两个是:

  • 顶点着色器:
  • 片段着色器:
    • 输入:三角形的所有像素的2D位置+(边缘颜色或纹理图像)+亮化参数
    • 输出:三角形的每个像素的颜色(如果它没有被另一个更近的三角形遮挡),通常在顶点之间插值

名称​​着色器对于当前的结构不是很具描述性:GLSL中的“着色器”也管理顶点位置,更不用说OpenGL 4.3 GL_COMPUTE_SHADER,它允许任意计算完全不相关渲染,就像OpenCL一样。

TODO可以单独用OpenCL有效地实现OpenGL,即使所有阶段都可编程吗?当然,必须有性能/灵活性权衡。

带有着色器的第一个GPU使用不同的专用硬件进行顶点和片段着色,因为它们具有完全不同的工作负载。但是,当前的体系结构对所有着色器使用单一类型的硬件(基本上是小型CPU),这样可以节省一些硬件重复。这个概念被称为:https://en.wikipedia.org/wiki/Unified_shader_model

enter image description here

Image source

要真正理解着色器及其所能做的一切,您必须查看许多示例并学习API。例如,https://github.com/JoeyDeVries/LearnOpenGL是一个很好的来源。

在现代OpenGL 4中,即使是hello world三角形程序也使用超级简单的着色器,而不是像glBeginglColor那样的旧版已弃用的直接API。以下是一个示例:https://stackoverflow.com/a/36166310/895245

非平凡着色器的一个经典酷应用是动态阴影:

Image source

答案 1 :(得分:17)

着色器基本上根据几个光方程为您提供要渲染的对象的正确颜色。因此,如果您有球体,灯光和相机,那么相机应该会看到一些阴影,一些闪亮的部分等,即使球体只有一种颜色。着色器执行光方程计算以获得这些效果。

顶点着色器将虚拟空间(您的三维模型)中每个顶点的3D位置转换为它在屏幕上显示的二维坐标。

片段着色器基本上通过进行光计算为您提供每个像素的着色。