关闭

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

标签: openglGLSL 着色语言
876人阅读 评论(0) 收藏 举报
分类:

先看一个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中常用的数学函数

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4588次
    • 积分:92
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论
  • 卡尔曼滤波器的原理

    u011712406: 假设你有两个传感器,测的是同一个信号。可是它们每次的读数都不太一样,怎么办?取平均。再假设你知道其中...