OpenGL ES基础知识回顾

2018-01-25  本文已影响0人  AndyYaWei

OpenGL ES基础知识回顾


一、GLSL着色器语言

(1) 顶点着色器的输入主要为待处理顶点相应的 attribute(属性) 变量、uniform(全局) 变量、采样器以及临时变量,输出主要为经过顶点着色器后生产的varying(易变) 变量及一些内建输出变量。
(2) attribute 变量指的是3D物体中每个顶点各自不同的信息所属的变量,一般顶点的位置、颜色、法向量等每个顶点各自不同的信息都是以attribute 变量的方式传入顶点着色器的。


二、语言基础

-数据类型概述

向量类型 说明
vec2 包含了2个浮点数的向量
vec3 包含了3个浮点数的向量
vec4 包含了4个浮点数的向量
向量类型 说明
ivec2 包含了2个整数的向量
ivec3 包含了3个整数的向量
ivec4 包含了4个整数的向量
向量类型 说明
bvec2 包含了2个布尔数的向量
bvec2 包含了3个布尔数的向量
bvec2 包含了4个布尔数的向量

向量的运算

vec4 a; vec4 b;
a-b :A和B分量相减

矩阵类型 说明
mat2 2 x 2 的浮点矩阵
mat3 3 x 3 的浮点矩阵
mat4 4 x 4 的浮点矩阵
- - -
1 4 7
2 5 8
3 6 9

mat3 m = mat(1,2,3,4,5,6,7,8,9);
mat3 m = mat(vec3(1,2,3), vec3(4,5,6), vec3(7,8,9));

采样器类型 说明
sampler2D 用于访问二维纹理
sampler3D 用于访问三维纹理
samplerCube 用于访问立体贴图纹理

特点

  1. 采样器变量不能再着色器中初始化。
  2. 一般情况下采样器变量都用uniform限定符来修饰,从寄主语言(如java)接收传递进着色器的值。
  3. sampler3D 并不是在所有的OpenGL ES 实现中都支持,因此,如要使用必须首先在着色器代码中进行设置,打开相应的扩展。
struct info{           //声明一个结构体info
    vec3 color;        //颜色成员
    vec3 position;     //位置成员
    vec2 textureCoor;  //纹理坐标成员
}

声明了info类型的结构体之后,就可以像使用内健数据类型一样使用 这 个用户自定义的数据类型了,如:

info CubeInfo;   //声明了一个info类型的变量CubeInfo

对于结构体来说,其他的使用方法都与C语言基本类似。

声明数组的方式:

vec3 position[20]; //声明了一个包含20个vec3的数组,索引从0开始。

vec3 position[];  //声明了一个大小不定的vec3型数组。
vec3 pisition[]5; //再次声明该数组,并且指定大小。
vec3 position[];  //声明了一个大小不定的vec3型数组。
pisition[3] = vec3(3.0);//position需要为一个大小为4的数组
position[20] = vec3(6.0);//position需要为一个大小为21的数组
修饰符 说明
in 输入变量
out 输出变量
inout 输入输出变量
attribute 一般用于每个顶点都各不相同的量,如顶点位置、颜色等(只能修饰顶点着色器的变量)
uniform 一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的量,如当前的光源位置 {一致变量修饰符,(顶点和片元都可以用)}
varying 用于从顶点着色器传递到片元着色器的量(如果说要传递,变量名一致)
const 用于声明常量

三、绘制方式

① GL_POINTS:点类下唯一的绘制方式,用来绘制点。
② GL_LINES:将着色器传入的顶点按顺序两个一组来绘制成线段。
③ GL_LINES_STRIP:按照顶点顺序连接顶点。(不封口)
④ GL_LINES_LOOP:按照顶点顺序连接顶点,并将第一个顶点和最后一个顶点相连。(封口)
⑤ GL_TRIANGLES:按照顶点顺序每3个点组成三角形进行绘制。
⑥ GL_TRIANGLE_STRIP:顶点按照顺序依次组织成三角形进行绘制, 最后实际形成的是一个三角形带。若有 N个顶点将绘制出n-2个三角形 (节省顶点空间)
⑦ GL_TRIANGLE_FAN:将第一个点作为中心点其他点作为边缘点,绘制一系列组成扇形的相邻三角形
⑧ glDrawArrays:按照传入渲染管线顶点本身的顺序及选用的绘制方式将顶点组织成图元进行绘制。称之 为顶点法( 特点:方便 ,但是出现了很多的重复顶点。 )
⑨ glDrawElements:绘制时不但要将顶点序列传入渲染管线,还需要将索引序列传入管线,绘制时跟据索引序列取出顶点值,并根据当前选用的绘制方式组织成图元。

区别:
用GL_TRIANGLES绘制方式(绘制一个正方形)
1.glDrawArrays需要6个顶点
2.glDrawElements需要四个顶点


四、纹理映射

 //重复拉伸
   GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D
                         ,GLES20.GL_TEXTURE_WRAP_S //设置S轴的拉伸方式为重复
                         ,GLES20.GL_REPEAT);

   GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D
                          ,GLES20.GL_TEXTURE_WRAP_T  //设置S轴的拉伸方式为重复
                           ,GLES20.GL_REPEAT);

重复拉伸的方式在很多大场景地形的纹理贴图中很有作用,如将大块地面重复铺满草皮纹理、将大片水面重复铺满水波纹等。如果没有重复拉伸方式,则开发人员只能将大块面积切割为一块一块的小面积矩形,对每一块矩形单独设置0.0 ~ 1.0 内的纹理坐标。这样开发不但繁琐,而且大大增加了顶点的数量,程序运行的效率也会受到很大的影响。因此开发中要注意重复拉伸方式的灵活运用,可以使用重复拉伸方式时就不要去无畏地增加顶点数量了。

(2) 截取拉伸方式

截取拉伸方式中当纹理坐标的值大于1时都看作 1,因此会产生边缘被拉伸的效果。具体情况如下图所示。

从图中可以看出,需要纹理映射的矩形中4个顶点纹理坐标分别为(0,0)、( 4,0)、(0,4)、( 4,4),因此矩形中的各片元纹理坐标范围为S 轴方向 0 ~ 4,T 轴方向0 ~ 4.由于在此种拉伸方式下,大于1的纹理坐标都看作1,因此产生了纹理横向和纵向边缘被拉伸的效果。

   //截取拉伸
   GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
                          GLES20.GL_TEXTURE_WRAP_S,//设置S轴的拉伸方式为截取
                          LES20.GL_CLAMP_TO_EDGE);

   GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
                         GLES20.GL_TEXTURE_WRAP_T,//设置T轴的拉伸方式为截取
                         LES20.GL_CLAMP_TO_EDGE);

所谓纹理采样就是:根据片元的纹理坐标到纹理图中提取对应位置颜色的过程。但是由于被渲染图元中的片元中的片元数量与其对应纹理区域中像素的数量并不一定相同,也就是说图元中的片元与纹理图中的像素并不总是–对应的。

例如,将较小的纹理图映射到较大的图元或将较大的纹理映射到较小的图元时这种情况就会产生。因此通过纹理坐标在纹理图中并不一定能找到与之完全对应的像素,这时候需要采用一些策略使得纹理采样可以顺利进行下去。通常采用的策略有最近点采样、线性采样两种。

  1. 最近点采样
  1. 线性纹理采样
  1. MIN 与 MAG 采样

脚注

生成一个脚注[1].

[TOC]

目录

[TOC]


  1. 这里是 脚注内容.

上一篇下一篇

猜你喜欢

热点阅读