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

Tom*_*mmz 18 opengl shader

我不是母语是英语,当我试图通过openGL的维基和教程www.learnopengl.com得到的,它永远不会结束的直觉概念如何整部作品可以理解的.有人可以用更抽象的方式向我解释它是如何工作的吗?什么是顶点着色器和片段着色器以及我们将它们用于什么?

Cir*_*四事件 23

OpenGL的维基提供了一个很好的定义:

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

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

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

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

然后将这些语言转换为半无证书指令集,这些指令集运行在内置于较新GPU的小型"CPU"上.

直到不久之前,着色器语言甚至还没有图灵完整.

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

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

在此输入图像描述

图像来源.

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

最重要的两个是:

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

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

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

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

在此输入图像描述

图像来源.

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

在现代的OpenGL 4,甚至世界你好三角形程序使用超级简单着色器,而不是像旧的过时即时的API glBeginglColor.这是一个例子:https://stackoverflow.com/a/36166310/895245

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

图像来源.


jh3*_*314 17

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

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

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

  • 因此,我们要在屏幕上绘制的每个对象都经过所谓的"渲染管道",它首先包含顶点,然后是片段着色器,它们通过计算得到整体图像.我对吗? (3认同)
  • 是的,顶点着色器首先工作,片段着色器稍后工作.渲染管道还有其他几个步骤,如剪切,栅格化等:http://www.opengl.org/wiki/Rendering_Pipeline_Overview (3认同)

归档时间:

查看次数:

12431 次

最近记录:

6 年 前