细谈Open GL里的Program和Shader

本文详细介绍了OpenGL中的Program和Shader对象,Program作为Shader的容器,可以挂载多个Shader。Shader分为Vertex Shader和Fragment Shader,分别处理顶点数据和像素数据。创建Shader和Program涉及编译、链接等步骤。此外,还探讨了着色语言的数据类型和顶点着色器、片元着色器的语法,以及如何加载和调试Shader程序。

Program和Shader对象

Program相当于当前渲染管线所使用的程序,是Shader得容器,可以挂载多个Shader.

Shader相当于一个C模块,首先需要对Shader脚本进行编译,然后将编译好的Shader挂载到Program上,在OpenGL的渲染中使用Program来使Shader生效。

Vertex Shader负责将顶点数据进一步处理 ,Fragment Shader将像素数据进一步处理。所以Vertex Shader中的代码针对每个点都会调用一次,Fragment Shader中的代码针对每个像素都会调用一次。

 

创建Shader的流程如下:

1、调用glCreateShader()创建一个Shader对象;

2、调用glShaderSource()创建加载Shader脚本源码;

3、调用glCompileShader()编译Shader脚本;

 

创建Program的流程如下:

1、调用glCreateProgram()创建一个Program对象;

2、调用glAttachShader()将创建好的Shader进行挂载;

3、调用glLinkProgram()执行链接操作;

4、最后在需要使用Shader时,调用glUseProgram()应用当前Shader;

 

着色(Shader)语言:

着色语言是一种类C的编程语言,但不支持double,byte,short,long,并且取消了C中的union,enum,unsigned以及位运算等特性。着色语言中有许多内建的原生数据类型以及构建数据类型,如:浮点型(float)、布尔型(bool)、整型(int)、矩阵型(matrix)以及向量型(vec2、vec3等)等。总体来说,这些数据类型可以分为标量、向量、矩阵、采样器、结构体以及数组等。

支持的数据类型如下:

float bool int   基本数据类型

Vec2      包含了2个浮点数的向量

Vec3      包含了3个浮点数的向量

Vec4      包含了4个浮点数的向量

Ivec2      包含了2个整数的向量

ivec3      包含了3个整数的向量

ivec4      包含了4个整数的向量

bvec2               包含了2个布尔数的向量

bvec3               包含了3个布尔数的向量

bvec4               包含了4个布尔数的向量

mat2                2*2维矩阵

mat3                3*3维矩阵

mat4                4*4维矩阵

sampler1D           1D纹理采样器

sampler2D           2D纹理采样器

sampler3D           3D纹理采样器

 

Vertex Shader的语法

变量类型 + 变量数据类型 + 变量名

变量类型有三种:

1、attribute: 就是顶点数据(Vertex Data)包含的属性,位置,颜色或其他,顶点数据包含多少属性,这里就可以写多少,通过glEnableVertexAttribArray和glVertexAttribPointer激活和传值。

2、varying: 传递给Fragment Shader的变量,Fragment Shader是无法直接接受顶点数据的,因为它处理的是像素级别的数据。传递给Fragment Shader的值是根据像素位置差值计算之后的值。

3、uniform: 可以理解为全局变量,所有顶点处理程序共享这个变量。

变量数据类型有(见上面数据类型介绍)

 

 

顶点着色器介绍

1.1 顶点着色器示例代码

uniform mat4 uMVPMatrix; //应用程序传入顶点着色器的总变换矩阵

Attribute vec4 aPosition;     //应用程序传入顶点着色器的顶点位置

Attribute vec2 aTextureCoord;//应用程序传入顶点着色器的顶点纹理坐标

Attribute vec4 aColor; //应用程序传入顶点着色器的顶点颜色变量

varying vec4 vColor; //用于传递给片元着色器的顶点颜色数据

Varying vec2 vTextureCoord; //用于传递给片元着色器的顶点纹理数据

void main()

{

gl_Position = uMVPMatrix * aPosition;  //根据总变换矩阵计算此次绘制此顶点位置

vColor = aColor; //将顶点颜色数据传入片元着色器

vTextureCoord = aTextureCoord;  //将接受的纹理坐标传递给片元着色器

}<

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值