2013-07-22 64 views
11

我不是母语为英语的人,当我试图通过www.learnopengl.com上的OpenGL wiki和教程时,通过直觉了解整个概念的工作原理永远不会变得可以理解。有人可以用更抽象的方式解释我的工作原理吗?什么是顶点着色器和片段着色器,以及我们将它们用于什么?什么是openGL中的着色器,我们需要什么?

回答

12

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

着色器是被设计为在一个图形处理器的某些阶段运行的用户定义的程序。

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

但是这对于想要创建许多不同视觉效果的程序员来说太具有限制性。随着技术的进步,GPU供应商开始允许渲染流水线的某些部分被编程为编程语言,如GLSL。

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

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

术语通用GPU(GPGPU)引用了现代GPU的这种增强的可编程性。

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

enter image description here

Image source

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

的两个最重要的有:

  • 顶点着色器:
  • 片段着色器:
    • 输入:一个三角形+(彩色边缘或纹理图像)+闪电的所有像素的2D位置参数
    • 输出:每一个像素的颜色三角形(如果它不是由另一个更接近三角形遮挡)的,通常是顶点

    名称SHA之间

插der对于当前的结构体系并不是非常具有描述性: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 triangle程序都使用超级简单的着色器,而不是像以前那样不赞成的直接API,如glBeginglColor。下面是一个例子:https://stackoverflow.com/a/36166310/895245

一个典型非平凡着色器凉爽应用是动态阴影:

Image source

15

着色器基本上根据几个光照方程为您提供想要渲染的对象的正确着色。所以如果你有一个球体,一个灯光和一个摄像机,那么即使球体只有一种颜色,摄像机也应该看到一些阴影,一些闪亮的部分等等。着色器执行轻方程式计算来为您提供这些效果。

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

片段着色器通过做轻量计算基本上给你每个像素的着色。

+3

因此,我们要在屏幕上绘制的每个对象都会经历所谓的“渲染管线”,该渲染管线首先由顶点组成,然后是具有计算的片段着色器组成整体画面。我对吗? – Tommz

+3

是的,顶点着色器首先工作,片段着色器稍后工作。渲染管道还有其他几个步骤,例如剪切,栅格化等:http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314

+0

什么是Pixel Shader?它是否与Vertex Shader同义? – anonymous

相关问题