阅读 100

OpenGL ES学习第二篇:OpenGL ES概述

本文你可以了解到

  • 简单了解下OpenGL是啥
  • OpenGL能做点啥
  • OpenGL的工作流程
  • OpenGL中用到的基本数据类型

简述

  • OpenGL(Open Graphics Library):是一个跨平台接口库,用于二维或者三维图像的处理和渲染。

  • 可以做滤镜:亮度、对比度、饱和度、色调曲线、白平衡、灰度、素描、卡通、浮雕以及各种混合模式

  • OpenGL 接口需要运行与EGL环境中

  • GLSL(OpenGL Shading Language):着色器语言

渲染管线

  • 几何图元:包括点、直线、三角形,均是通过顶点(vertex)来指定
  • 模型:根据几何图元创建的物体
  • 渲染:计算机根据模型创建图像的过程
  • 帧缓冲区(FrameBuffer):保存图形硬件为控制屏幕上所有像素的颜色和强度所需的全部信息
  1. 指定几何对象glGrawArrays
模式可选值
- GL_POINTS
- GL_LINES
- GL_TRIANGLE_STRIP
复制代码
  1. 顶点处理

  2. 根据模型视图和投影矩阵进行变换来改变顶点的位置

  3. 根据纹理坐标与纹理矩阵来改变纹理坐标的位置

  4. 如果涉及三维的渲染,还要处理光照计算和法线变换

这里输出是以gl_Position来表现具体的顶点位置,如果以点(GL_POINTS)来绘制几何图元,还应该输出gl_PointSize。

  1. 图元组装

阶段2后,模型顶点和纹理坐标均以确定,然后在图元组装阶段会根据应用程序送往图元的规则(GL_POINTS、GL_TRIANGLE_STRIP等)来将纹理组装成图元

  1. 栅格化操作

将图元数据分割为更小的单元(==片元==)并对应与帧缓冲区的各个像素。一个片元可能包含窗口的颜色、纹理坐标等属性。片元的属性是根据根据顶点坐标利用插值来实现的,栅格化操作实际上就是确定好每一个片元是什么

  1. 片元处理

通过纹理坐标取得纹理(texture)中相对应的片元像素值(texel),然后根据自己的业务处理来变换片元的颜色,这里输出的是g l_FragColor,表示修改后的像素的最终结果。

  1. 帧缓冲操作

执行帧缓冲的写入操作,负责将最终的像素值写到帧缓冲区。

修饰符和基本数据类型

  • const:声明非可写的编译时常量变量
  • attribute:用于经常改写的信息,只能在顶点着色器中使用
  • uniform:用于不经常更改的信息,可用在顶点着色器和片元着色器
  • varying:用于修饰从顶点着色器向片元着色器传递的变量

数据类型,int、float、bool

highp float:32bit : 一般用于顶点坐标vertex Coordinate medium float:16bit : 一般用于纹理坐标texture Coordinate lowp float:8bit : 一般用来表示颜色

//向量类型: 将物理坐标和纹理坐标传递到vertex shader中
attribute vec4 position;

//矩阵类型:传入矩阵改变原始的像素数据,4*4的浮点矩阵
uniform lowp mat4 colorMatrix;

//实例:传递一个矩阵到实际的shader中
glUniformMatrix4fv(colorMatrixLocation, 1, false, colorMatrix);

//纹理类型,一般在fragment shader中使用,二维纹理声明如下
uniform sample2D texSample;
//当客户端收到该句柄,就可以为它绑定一个纹理
glActiveTexture(GL_TEXTURE0);//激活纹理
glBindTexture(GL_TEXTURE_2D, texId);
glUniform1i(glUniformTexture, 0);
复制代码

传递类型:使用varying在vertex shader和fragment shader直接传递参数==version3有变化,使用会更简单点==

首先在vertex shader中声明这个类型的变量代替纹理的坐标点,并对这个变量进行赋值

attribute vec2 texcoord;
varying vec2 v_texcoord;
void main(void){
v_texcoord = texcoord;//计算顶点坐标
}
复制代码

然后在fragment shader中也声明同名的变量,再使用texture2D方法取出二维纹理中该纹理坐标点上的纹理像素值。

varying vec2 v_texcoord;
vec4 texel = texture2D(texSample, v_texcoord);
复制代码

内置变量

vec4 gl_position;//设置顶点转换到屏幕坐标的位置,vertex shader一定要更新这个变量
复制代码
float gl_pointSize;//在粒子效果的场景下,需要为粒子设置大小
复制代码
vec4 gl_FragColor;//指定当前纹理坐标所代表的像素点最终颜色值
复制代码

END: 简单了解下名词概念就可以开始OpenGL开发了

文章分类
Android
文章标签