前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「音视频直播技术」OpenGL渲染之着色器

「音视频直播技术」OpenGL渲染之着色器

作者头像
音视频_李超
发布2020-04-02 10:21:53
7110
发布2020-04-02 10:21:53
举报

opengl.png

前言

本文介绍一下OpenGL的基本概念。在OpenGL中,只能画三种图元,点、线、三角型。在OpenGLES2.0之后,引用也GLSL(OpenGL Shader Languge),它类似于C语言的语法。

着色器类型

有两种常用着色器,分别是顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)。

片元着色器是在顶点着色器之后被调用的。

顶点着色器,每个顶点运行一次,确定生成顶点最终的位置。一但确定了位置,OpenGL将利用这些点生成 点、线、三角形。

片元着色器,每个片元运行一次,它用于确定每个片元的点、线、三角形的最终颜色。片元是一个单一颜色的小矩形区域,类似于计算机屏幕上的像素。

加载着色器

加载着色器需要按下面的步骤进行加载:

  1. 根据着色器类型,创建一个着色器。GLES20.glCreateShader(shaderType); 着色器类型包括 GLES20.GL_VERTEX_SHADER(顶点着色器)和 GLES20.GL_FRAGMENT_SHADER(片元着色器)。
  2. 将着色器程序代码与上面创建的着色器绑定在一起。GLES20.glShaderSource(shader, source);。
  3. 编译着色器程序。GLES20.glCompileShader(shader);可以通过 GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 函数获取编译结果。
  4. 创建程序对象。GLES20.glCreateProgram();
  5. 将编译好的着色器与上面创建的程序对象绑定到一起。如GLES20.glAttachShader(program, vertexShader);和 GLES20.glAttachShader(program, fragmentShader);
  6. 最后将这们链接到一起。GLES20.glLinkProgram(program);可以通过 GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);获取链接的状态。

获得Uniform和Attribute位置

着色器中的Uniform和Attribute变量是可以在外面赋值的。在赋值之前,我们首先获取变量的位置。可以通过下面的方法来获取:

  1. 获取 Uniform 位置, GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix"); uMVPMatrix就是着色器中的 Uniform 变量。
  2. 获取 Attribute 位置, GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); aPosition就是着色器中的 Attribute 变量。

将顶点数据与Attribute关联

取得 Attribute 变量位置后,还需要将顶点数组中的数据与 Attribute 变量关联。

  1. 先使 Attribute 变量可用。GLES20.glEnableVertexAttribArray(maPositionLoc);
  2. 关联数据。GLES20.glVertexAttribPointer(maPositionLoc, coordsPerVertex, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);

maPositionLoc: Attribute 变量位置。 coordsPerVertex: 第个顶点坐标占用的数量。如x,y代表2 vertexStride: 每个顶点数据的宽度。 vertexBuffer: 数组

着色器的数据类型

着色器分为 标量,向量,距阵,采样器,结构体,数组几种类型。

标量:布尔型(bool)、整形(int)和浮点型(float)等。

向量:

向量类型

说明

vec2

包含了2个浮点数的向量

ivec2

包含了2个整数的向量

bvec2

包含了2个布尔数的向量

vec3

包含了3个浮点数的向量

ivec3

包含了3个整数的向量

bvec3

包含了3个布尔数的向量

vec4

包含了4个浮点数的向量

ivec4

包含了4个整数的向量

bvec4

包含了4个布尔数的向量

距阵:

矩阵类型

说明

mat2

2x2浮点数矩阵

mat3

3x3浮点数矩阵

mat4

4x4浮点数矩阵

采样:

一般情况下,一个采样器变量代表一幅或一套纹理贴图

采样器

说明

sampler2D

用于访问二维纹理

smapler3D

用于访问三维纹理

samplerCube

用于访问立方贴图纹理

变量限定符

着色器一般包括下在几种变理限定符:

限定符

说明

attribute

一般用于每个顶点都各不相同的量,如顶点位置、颜色等。

uniform

一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的量,如当前光源的位置。

varying

用于从顶点着色器传递到片元着色器的量

const

用于声明常量


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 着色器类型
  • 加载着色器
  • 获得Uniform和Attribute位置
  • 将顶点数据与Attribute关联
  • 着色器的数据类型
  • 变量限定符
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档