GLSL着色语言的学习(一)渲染管线流程

原创 2015年11月21日 20:40:55

先看一个shader模拟海岸面的例子。。。
四不四很强大,而且都是依靠强大的数学计算来完成,好吧,数学真的很重要。。。。

打好基础更重要。。。。

1.首先了解渲染管线,就是一系列数据处理流程。

在OpenGL中,会用到不同的四种不同的着色阶段,其中最常用的就是顶点着色器和片源着色器,前者处理顶点数据,后者处理光栅化的片元数据。下面来详细解释每一步。


(1)首先接受用户传进来的数据(vertex Array或Buffer objects)

(2)顶点着色器(常用的三个修饰符attribute、uniform、varying)


顶点着色器的输入

attribute:
传递属性值到vertex shader,如:空间位置,法向量,顶点,颜色,纹理坐标。
只读,并且只能修饰float,vec2,vec3,vec4,mat2,mat3,mat4,不能声明数组或结构体。并且,属性只在顶点着色器才有,片元没有。

uniforms:
修饰的是全局变量,一般表示变换矩阵,材质,光照参数,颜色。
只读,因为顶点着色器和片渊着色器可共享同一个uniform块,因此在两个着色器中,uniform声明要一致。

顶点着色器的输出
varying:
顶点着色器计算每个顶点的值(颜色,纹理坐标等)写入varying变量,然后片元着色器使用该值,因此varying在顶点着色器可写,在片元着色器只读。作为顶点着色器和片元着色器之间传递插值数据,因此也声明一致。

下面是vertex的一段代码

position是三维,我们变成齐次坐标:vec4(position,1.0),齐次坐标用4个分量来表示空间中的点,实现了平移,旋转,缩放的统一(在后续数学回忆章节再讲这一伟大发明),也用来区分点(x,y,z,1)和向量(x,y,z,0)。下面我们讲一下projectionMatrix*viewMatrix*modelMatrix*vec4(position,1.0)。。。。
点的坐标vec4左乘模型矩阵modelMatrix,指的是点在空间中的位置变化,包括平移、旋转、缩放。现在我们得到的是空间中的点经过一系列变换在世界坐标系中的位置。。。。。
然后左乘视图矩阵viewMatrix,就是将观察者至于原点的一个变换。有时视图矩阵经常和模型矩阵放到一起,叫模型视图矩阵,modelViewMatrix。。。。
最后左乘投影矩阵projectionMatrix,将这些顶点坐标映射到二维屏幕上。。。。。

(3)几何着色器

几何着色器位于顶点着色和片元着色之间,根据顶点信息批量处理几何图形,因此几何着色器输入变量都是数组类型。(还有一种细分着色器,是在顶点着色器处理每个顶点的关联数据之后,进一步描述一个物体的形状,结果就是几何图元的数量增加,并且模型的外观会变得更为平顺。在这里值着重介绍顶点着色器和片元着色器)

(4)图元装配

前面着色阶段处理的都是顶点数据,那么这些顶点是如何构成几何的信息也会被传递到OpenGL,图元装配就是将这些顶点与相关的几何图元之间组织起来,将一堆顶点数据根据原始链接关系还原出网络结构,然后准备下一步的裁剪和光栅化。

(5)裁剪

顶点可能会落在我们绘制的窗口之外,要把它和相关的图元剪切。

(6)光栅化

剪切之后马上要执行的工作就是光栅化,就是将更新后的图元传递到光栅化单元,生成对应的片元。
比如找出三角形所覆盖的像素,这时候完成坐标(10.48,20.51)——>(10,20)像素位置的转化。

(7)片元着色器


前面讲顶点着色器的输出varying,varying变量在光栅化阶段被线性插值计算后,在片元着色器作为输入。。。
samplers:一种特殊的uniform,用于呈现纹理。。。。
下面是片元着色器的代码,计算顶点法向量vNormal和入射光方向两个向量的点积,计算得到的diffuse就是点光源的强度


到现在,大概的流程讲完了,
这都是看资料和书自己总结的,如果有硬伤,小伙伴一定要指出来哇~~(*@ο@*) ~







接下来我会总结下数学知识,矩阵变换、四元数、欧拉角,,,,还有GLSL中常用的数学函数

OpenGL着色语言GLSL

OpenGL着色语言GLSL 1、OpenGL的可编程管线 ①顶点着色阶段:接收顶点数据,独立处理每个顶点。 ②细分着色阶段:可选阶段。在OpenGL管线内部生成新的几何体。 ③几何着色阶段:...
  • husheng0
  • husheng0
  • 2015年11月30日 23:32
  • 1411

GLSL内置函数(便于查找)

float radians (float degrees) vec2 radians (vec2 degrees) vec3 radians (vec3 degrees) vec4 radians (...
  • fztfztfzt
  • fztfztfzt
  • 2015年04月21日 21:33
  • 1584

GPU编程之GLSL(五)——二维离散卷积

本程序共分为7个文件:
  • Sun7_She
  • Sun7_She
  • 2014年08月13日 21:00
  • 1970

OpenGl中使用着色器的基本步骤及GLSL渲染简单示例

OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行是在G...
  • dcrmg
  • dcrmg
  • 2016年12月14日 23:34
  • 5701

通过GLSL来实现绘制像素的裁剪

GLSL中含有内置的变量gl_FragCoord,其描述片段着色器的片段(对应像素)所在的坐标。基于上次的GLSL纹理贴图,我们可以增加像素的过滤,例如,我们要过滤掉片段坐标小于100的像素,则可以写...
  • davidsu33
  • davidsu33
  • 2013年12月16日 16:31
  • 1438

Shader特效——“Kuwahara Filter”的实现 【OpenCV】【GLSL】

本文代码参考自 skelking 的一篇博客 《kuwahara filter 实现》 Kuwahara 是一种降噪低通滤波器,能够较好的保留物体的边缘。 基本思想就是 将Kuwahara 的模板...
  • panda1234lee
  • panda1234lee
  • 2016年08月11日 19:06
  • 1301

Posterization Post Processing Effect (GLSL)(皮肤去除老化变光滑滤波)

More shaders are available here: Geeks3D Shader Library. Image posterization is the tranfor...
  • fish_mai
  • fish_mai
  • 2016年10月21日 16:27
  • 275

OpenGLES2.0着色器语言glsl

OpenGLES2.0中是强制使用可编程的渲染管线的,使用的是glsl着色器语言,因为着色器语言是使用的GPU,即图形处理单元,而不是CPU,这样可以使CPU从繁重的几何计算和像素的处理中解脱出来了。...
  • u013467442
  • u013467442
  • 2016年01月15日 16:27
  • 2591

GLSL着色语言的学习(二)光照模型

1.一般构造图形的四个步骤 (1)三维建模构造物体在场景中的几何结构(结构) (2)转换成二维(投影) (3)确定场景中可见面(消隐) (4)计算可见面的颜色(光照) 2.光照知识 在这里需要补充一下...
  • u011712406
  • u011712406
  • 2015年11月23日 22:58
  • 655

哈哈镜滤波

Unity上对于图像的处理,如果单纯使用代码,那么很遗憾,程序基本会跑死,毕竟是直接对像素的操作,读取写入都是比较耗费CPU和内存的。 所以,这次因为项目需要想实现类似哈哈镜的效果,想来想去,还是觉...
  • fish_mai
  • fish_mai
  • 2016年10月21日 16:10
  • 628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GLSL着色语言的学习(一)渲染管线流程
举报原因:
原因补充:

(最多只允许输入30个字)