我不是母语为英语的人,当我试图通过www.learnopengl.com上的OpenGL wiki和教程时,通过直觉了解整个概念的工作原理永远不会变得可以理解。有人可以用更抽象的方式解释我的工作原理吗?什么是顶点着色器和片段着色器,以及我们将它们用于什么?什么是openGL中的着色器,我们需要什么?
回答
的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的模型中,仅在以下图的蓝色阶段是可编程的:
着色器从前一个流水线阶段(例如顶点位置,颜色和栅格化像素)获取输入,并将输出定制到下一个阶段。
的两个最重要的有:
- 顶点着色器:
- 输入:在三维空间中的点的位置
- 输出:在点(使用4D矩阵乘法)的2D投影。参见:https://stackoverflow.com/a/36046924/895245
- 片段着色器:
- 输入:一个三角形+(彩色边缘或纹理图像)+闪电的所有像素的2D位置参数
- 输出:每一个像素的颜色三角形(如果它不是由另一个更接近三角形遮挡)的,通常是顶点
名称SHA之间
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中,甚至hello world triangle程序都使用超级简单的着色器,而不是像以前那样不赞成的直接API,如glBegin
和glColor
。下面是一个例子:https://stackoverflow.com/a/36166310/895245
一个典型非平凡着色器凉爽应用是动态阴影:
着色器基本上根据几个光照方程为您提供想要渲染的对象的正确着色。所以如果你有一个球体,一个灯光和一个摄像机,那么即使球体只有一种颜色,摄像机也应该看到一些阴影,一些闪亮的部分等等。着色器执行轻方程式计算来为您提供这些效果。
顶点着色器将虚拟空间中的每个顶点的3D位置(您的3D模型)转换为它出现在屏幕上的2D坐标。
片段着色器通过做轻量计算基本上给你每个像素的着色。
- 1. 什么是图着色需要?
- 2. 什么是R中的因子,为什么我们需要它
- 3. 什么是仿函数,为什么我们需要它们?
- 4. 什么是EJB回调,为什么我们需要它们?
- 5. DavLockDB:我们需要什么?
- 6. 为什么我们需要ioc容器
- 7. Windows上的Spark - 什么是winutils,为什么我们需要它?
- 8. 什么是OWASP?为什么我们需要这个?
- 9. 什么是jquery noConflict,为什么我们需要这个?
- 10. ELF文件 - 什么是部分,为什么我们需要它?
- 11. 什么是mcrypt,为什么和我们需要它在哪里?
- 12. Maven快照究竟是什么,为什么我们需要它?
- 13. 什么是__i686.get_pc_thunk.bx?我们为什么需要这个电话?
- 14. 什么是伴侣对象,为什么我们需要它?
- 15. 什么是OpenGL次要颜色有用?
- 16. 为什么我们在OpenGL 2的运行时编译着色器?
- 17. 我们的意思是什么?要么 ???
- 18. 装配需要什么?为什么我们使用它们?
- 19. 为什么我们需要.htaccess的worpdress?
- 20. 模型中有什么?为什么我们需要使用它
- 21. 什么是顶点着色?
- 22. 什么是立体着色器?
- 23. 为什么我们需要simple_one_for_one?
- 24. 为什么我们需要TensorFlow tf.Graph?
- 25. 为什么我们需要使用prompt.start()?
- 26. 为什么我们需要scalaz.stream迭代?
- 27. 为什么我们需要WCF
- 28. 为什么我们需要Anaconda 2.7?
- 29. 为什么我们需要编写log.isDebugEnabled?
- 30. 为什么我们需要ng-click?
因此,我们要在屏幕上绘制的每个对象都会经历所谓的“渲染管线”,该渲染管线首先由顶点组成,然后是具有计算的片段着色器组成整体画面。我对吗? – Tommz
是的,顶点着色器首先工作,片段着色器稍后工作。渲染管道还有其他几个步骤,例如剪切,栅格化等:http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314
什么是Pixel Shader?它是否与Vertex Shader同义? – anonymous