OpenGL ES基础(一)

着色器语言
(一)名词解释:
1.图元:
图形软件用来描述各种图形的函数
简单版:图元就是组成图像的基本单元
2.OpenGL渲染管线(重点)
渲染流水线:是显卡芯片内部处理图形信号相互独立的并行处理单元。
简单版:也就是把数据转化到openGL并且生成最终图像的一个过程!
3,GLSL是什么:
GLSL是一门专门为图形开发设计的编程语言

,4,可编程管线的编程阶段(重点)(流水线都干了啥呢??)

5.分析简单的顶点着色器
案例:

version 330 core //版本号

in vec4 vPosition;//in数据入口 ,vec4 (x,y,z,w)向量(w叫做齐次坐标) vPosition变量名//顶点
//矩阵 来做矩阵变换
unifrom mat4 modelViewProjectionMAtrix ;

void main(){
//内置变量
glPosition = modelViewProjectionMAtrix * vPosition;
}
基本语法
注释:// /.../
main没有返回值
每一行的结尾都要有分号

(二)GLSL变量认识:(不要思考C/C++和java)
1.GLSL支持的基本数据类型:
类型 描述
float IEEE 32浮点值
int 32位整数
bool 布尔值
uint double

2.什么是标量:只有大小没有方向

3.变量命名规范:
1.数字和“_”不能作为开头
2.变量名不能包含连续的下划线
3.用户变量不能用“gl”开头
4.见名识意
4.变量的初始化:
float f=1.0;
bool b=true;
int i=15;
5.类型转换(win):
float f=1.0;
bool b=bool(f)
(三)聚合类型——向量

1.什么是向量 :有方向的量
2.向量在着色器中的作用
位置,颜色,纹理
3.基本类型
基本类型(标量) 2d向量 3D向量 4D向量
float vec2 vec3 vec4
int ivec2 ivec3 ivec4
bool bvec2 bvec3 bvec4
1.向量初始化
1,声明变量的初始化
vec3 xyz=vec3(1.0,1.0,1.0);
float x= xyz.x;

vec3 rgb=vec3(1.0,1.0,1.0);
float r=rgb.r;
float g=rgb.g;

vec3 rgb=vec3(1.0 );等价于vec3 rgb=vec3(1.0,1.0,1.0);

2.类型之间等价交换
vec3 xyz1=vec3(1.0,1.0,1.0);
vec3 xyz2=vec3(xyz1);
3.截短,
vec3 xyz1=vec3(1.0,1.0,1.0);
vec2 xy=vec2(xyz1);
4,加长
vec2 xy=vec2(xyz1);
vec3 xyz1=vec3(xy ,1.0);

(四)聚合类型——矩阵
1.矩阵在3D开发中的作用
位移,旋转,缩放
2.矩阵类型

double dmat2 dmat3 dmat4
float mat2 mat3 mat4
22的浮点数矩阵 33的浮点数矩阵 4*4的浮点数矩阵
1.0,1.0
1.0,1.0 1.0,1.0,1.0
1.0,1.0,1.0
1.0,1.0,1.0 1.0,1.0,1.0,1.0
1.0,1.0,1.0,1.0
1.0,1.0,1.0,1.0
1.0,1.0,1.0,1.0

3.矩阵初始化
4.0 0 0
0 4.0 0
0 0 4.0
构建方式:
只传一个值
m=mat3(4.0);

以下三种写法得到效果是一样的:
mat3 m=( 1.0,2.0,3.0,
4.0,5.0,6.0,
7.0,8.0,9.0);

1.0 4.0 7.0
2.0 5.0 8.0
3.0 6.0 9.0
vec3 f1=vec3(1.0,2.0,3.0);
vec3 f2=vec3(4.0,5.0,6.0);
vec3 f3=vec3(7.0,8.0,9.0);
mat3 m=mat3( f1,f2,f3 );

vec2 f1=vec2(1.0,2.0);
vec2 f2=vec2(4.0,5.0);
vec2 f3=vec2(7.0,8.0);
mat3 m=mat3( f1,3.0
,f2,6.0
,f3 ,9.0 );
GLSL首先填充列 然后填充行:

(五)向量和矩阵内的元素访问
1,什么是分量
聚合类型 的元素
例如 vec3 xyz=vec3(1.0,1.0,1.0);
xyz.x
2,分量名称三种形式的集合
分量访问符
(x,y,z,w) 位置坐标
(r,g,b,a) 颜色
(s,t,p,q) 纹理坐标

3,向量与矩阵中的元素访问方式?
1向量:使用分量的名称
2矩阵:可以以二维数组的方式进行访问(索引)
4,向量内元素访问(详解)
例如:vec3 rgb=vec3(1.0,1.0,1.0);
float r=rgb.r;
float g=rgb.g;
数组方式获取
float r1=rgb[0];

5,矩阵内元素的访问
2.0 0 0 0
0 2.0 0 0
0 0 2.0 0
0 0 0 2.0
例如:mat4 m=mat4(2.0);

我要获取矩阵的第二列
vec4 xyzw = m[1];
获取具体的标量
float f=m[2][2];
//也可以这样写 m[2].z;

齐次坐标:就是将n维的向量用一个n+1维来表示!
定义:所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。

例如,二维点(x,y)的齐次坐标表示为(hx,hy,h)。由此可以看出,一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标(6,4,2)、(3,2,1)表示的都是二维点(3,2)。

给出点的齐次表达式[X Y H],就可求得其二维笛卡尔坐标,

即:[X Y H]→= [x y 1], 这个过程称为正常化处理。

在几何意义上,相当于把发生在三维空间的变换限制在H=1的平面内。

那么引进齐次坐标有什么必要,它有什么优点呢?

许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p m1+ m2(m1旋转缩放矩阵, m2为平移矩阵, p为原向量 ,p'为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' = pM的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

其次,它可以表示无穷远的点。n+1维的齐次坐标中如果h=0,实际上就表示了n维空间的一个无穷远点。对于齐次坐标(a,b,h),保持a,b不变,|V|=(x1x1,y1y1,z1*z1)^1/2的过程就表示了标准坐标系中的一个点沿直线ax+by=0 逐渐走向无穷远处的过程。

(六)结构体和采样器
1.什么是采样器
专门来进行纹理采样的;
一般情况下 一个采样器代表了一套或者一副纹理
采样器类型 说明
sampler2D 用来访问2维纹理的
sampler3D 用来访问3维纹理的
samplerCube 立体贴图的纹理
注意:1.采样器的变量不能在 着色器中初始化
2.一般情况下 采样器的变量都是用 uniform 限定符来修饰的,从宿主语言(java)接收传递递进来的着色器的值;
3.sampler3D并不是在所有的OpenGLES实现中都是支持的,(如果非要用,在着色器代码中代开相应的拓展)
1,什么是结构体
简单版:就是从逻辑上将 不同类型的数据组合到一个数据集合中。
2,结构体的作用
简化运算
3,怎么定义一个结构体
struct info{
vec3 color;//颜色
vec3 xyz; //位置
vec2 st; //纹理
}
4,怎么调用结构体元素做为输入参数
info ttt=info ( vec3(,,),vec3(,,),vec2(,));
vec3 color=ttt.color;

(七)数组
1,什么是数组
有限个类型相同的变量集合;
2,GLSL数组特性以及注意事项
1.GLSL支持任意类型的数组,包括结构体数组
2.索引从零开始
3.没有负数索引,索引也不能超出范围
4.数组可以定义为有大小,或者没有大小
float c[3];//有三个float元素
float [3]c;
float c[ ];//未定义位数,稍后可以声明
5.数组数GLSL第一等类型
1,GLSL里面数组有构造函数,并且用函数的参数做返回类型。
2,可以静态初始化一个数组
float c[3]=float[3](1.0,1.0,1.0);
6.GLSL有个隐式的方法 可以返回元素个数(length)
float c[3]=float[3](1.0,1.0,1.0);
int t=c.length;
7.多维数组
float c[3][5];

你可能感兴趣的:(OpenGL ES基础(一))