Android OpenGLES2.0使用

最近在学习Android OpenGL ES,但是一直没有找到合适的学习资料,偶然看到一个GL的demo,发现这个demo的每个版块都有相应的教程(非常详细),所以现在跟着这个demo一起走下去,一边学习一边记录.

demo地址
demo详细教程

各种详情介绍的博客

混合功能(glBlendFunc)
混合公式

注意事项:

  • 对于GL的操作,要在一个线程里面,这个线程被称为GL线程

GLSurfaceView OpenGL显示的view

setRenderer()						//设置画笔(也就是渲染者)
setRenderMode()				//设置渲染的模式
requestRender()					//告诉它的画笔(GLSurfaceView.Renderer),要重新画画(渲染)
setDebugFlags(int)     
setEGLConfigChooser(boolean)
setEGLConfigChooser(EGLConfigChooser)     
setEGLConfigChooser(int, int, int, int, int, int)     
setGLWrapper(GLWrapper)
setEGLContextClientVersion(2); 		// 设置OpenGl ES的版本为2.0   

GLSurfaceView.Renderer 渲染器

onSurfaceCreated()				//Surface创建的时候被调用
onSurfaceChanged()				//Surface大小改变
onDrawFrame()						//绘制的时候

GLES20 版本2.0

详细介绍 https://blog.youkuaiyun.com/matrix_laboratory/article/details/50897183

glClearColor								//设置清屏的颜色,参数分别对应RGBA
glClear(*)									//GL清理
glCreateShader()			  			//创造[顶点着色器]、[片元(像素)着色器]
glShaderSource()					//加载着色器源代码
glCompileShader()					//编译着色器
glGetShaderiv()						//获取着色器的编译情况
glCreateProgram()					//创建着色器程序
glAttachShader()						//向程序中加入[顶点着色器][片元着色器]
glLinkProgram()						//链接程序
glGetProgramiv()					//获取program的链接情况
glGetAttribLocation()		 		//获取程序中 [顶点位置] [顶点颜色] 属性引用
glGetUniformLocation()				//获取程序中 [总变换矩阵] [位置、旋转变换矩阵] [光源位置] [摄像机位置] 引用
glUseProgram()						//制定使用某套着色器程序
glUniformMatrix4fv()				//将 [总变换矩阵] [位置、旋转变换矩阵] 传入着色器程序
glUniform3fv()						//将 [光源位置] [摄像机位置] 传入着色器程序
glUniform1i()						//给uniform属性赋值
glVertexAttribPointer()			    //将 [顶点位置数据] [顶点法向量数据] 传入渲染管线
glEnableVertexAttribArray()		    //启用 [顶点位置数据] [法向量数据]
glDrawArrays()						//绘制被加载的物体
glGenTextures()						//生成纹理名
glBindTexture()						//绑定到目标纹理
glTexParameterf()					//设置纹理参数
glActiveTexture()					//激活纹理单元

ETC1Util

loadTexture()				//加载纹理

GLUtils

texImage2D()				//从bitmap里面加载2D纹理

GLSL  着色器语言

Shader源代码讲解 https://blog.youkuaiyun.com/grafx/article/details/35561487
Shader网站 https://www.shadertoy.com/
Shader网站 https://www.shadertoy.com/results?sort=newest

'基本类型'
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纹理采样器,可以采集BItmap的纹理数据
samplerExternalOES	//2D纹理采样器,可以采集照相机的纹理数据(要导包: #extension GL_OES_EGL_image_external : require)
sampler3D           //3D纹理采样器


'基本修饰'
attritude:			//一般用于各个顶点各不相同的量。如顶点颜色、坐标等。
uniform:			//一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。
varying:			//表示易变量,一般用于顶点着色器传递到片元着色器的量。
const//常量。

"浮点精度(与顶点着色器不同的是,在片元着色器中使用浮点型时,必须指定浮点类型的精度,否则编译会报错。精度有三种"
lowp:				//低精度。8位。
mediump:			//中精度。10位。
highp:				//高精度。16位。

precision <精度> <类型>	//使用方式制定默认精度


"内建变量--顶点着色器"
(输入变量)
gl_Position:		//顶点坐标
gl_PointSize:		//点的大小,没有赋值则为默认值1,通常设置绘图为点绘制才有意义。

"内建变量--片元着色器"
(输入变量)
gl_FragCoord:		//当前片元相对窗口位置所处的坐标。
gl_FragFacing:		//bool型,表示是否为属于光栅化生成此片元的对应图元的正面。
(输出变量)
gl_FragColor:		//当前片元颜色
gl_FragData:		//vec4类型的数组。向其写入的信息,供渲染管线的后继过程使用。
  • 纹理采样函数

texture 表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样
Lod 后缀,只适用于顶点着色器采样
Proj 表示纹理坐标st会除以q

texture2D 						
//2D纹理采样texture2D拥有三个参数,第一个参数表示纹理采样器。第二个参数表示纹理坐标,可以是二维、三维、或者四维。
//第三个参数加入后只能在片元着色器中调用,且只对采样器为mipmap类型纹理时有效。
texture2DProj					//2D纹理采样
texture2DLod					//2D纹理采样
texture2DProjLod				//2D纹理采样
textureCube
textureCubeLod
texture3D
texture3DProj
texture3DLod
texture3DProjLod

Matrix 矩阵

参考自 https://blog.youkuaiyun.com/junzia/article/details/52817978

setLookAtM()				//设置相机位置
frustumM()					//透视投影(物体离视点越远,呈现出来的越小。离视点越近,呈现出来的越大)
orthoM()					//正交投影(物体呈现出来的大小不会随着其距离视点的远近而发生变化)	
multiplyMM()				//计算变换矩阵			

EffectFactory

SurfaceTexture  表面纹理

setOnFrameAvailableListener()	
updateTexImage()						// 更新纹理

SurfaceTexture

https://blog.youkuaiyun.com/tq08g2z/article/details/77311938

setDefaultBufferSize(100, 100);					//设置默认缓冲区大小
surfaceTexture.setOnFrameAvailableListener();	//当一个新的缓冲区由生产者入对时,你的应用将通过回调 (onFrameAvailable()) 被通知
updateTexImage()								//这将释放之前持有的缓冲区,并从队列中获取新的缓冲区

Surface

new Surface(surfaceTexture);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值