前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenGL ES 之uniform和varying

OpenGL ES 之uniform和varying

作者头像
老孟Flutter
发布2020-09-11 15:56:05
1.8K0
发布2020-09-11 15:56:05
举报
文章被收录于专栏:FlutterFlutter

一个

有态度

的程序员

uniform

uniform是GLSL中变量类型的限定符,使用uniform限定的变量是只读值,在Shader中无法更改,只能通过应用程序传递给uniform。

uniform变量为全局共享变量,可以在所有的Shader中可以获取,uniform定义如下:

代码语言:javascript
复制
uniform float uTexPos;

uniform 变量通常是存储在GPU的”常量区”,这一区域的内存是有限的,因此uniform有个数限制,但比attribute要多很多,OpenGL 标准化组织规定OpenGL ES 2.0规定至少支持128个顶点uniform和16个片段(Fragment)uniform。

获取支持的顶点uniform最大个数代码如下:

代码语言:javascript
复制
    fun getMaxVertexUniformNum(): Int {
        var count = IntArray(1)
        GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_UNIFORM_VECTORS, count, 0)
        return count[0]
    }

获取支持的片段uniform最大个数代码如下:

代码语言:javascript
复制
    fun getMaxFragmentUniformNum(): Int {
        var count = IntArray(1)
        GLES20.glGetIntegerv(GLES20.GL_MAX_FRAGMENT_UNIFORM_VECTORS, count, 0)
        return count[0]
    }

设置uniform变量值

获取uniform 属性的句柄代码如下:

代码语言:javascript
复制
GLES20.glGetUniformLocation(programHandle, uniformName)

programHandle代表program句柄,uniformName就是uniform属性的名称。

设置uniform值的方法在Android中比较多,代码如下:

代码语言:javascript
复制
GLES20.glUniform1f(location,x)
GLES20.glUniform2f(location,x,y)
GLES20.glUniform3f(location,x,y,z)
GLES20.glUniform4f(location,x,y,z,w)

设置float类型的数据,location表示uniform属性的句柄,后面x,y,z,w是值,参数中(x)/(x,y)/(x,y,z)/(x,y,z,w)分别对应vec2/vec3/vec4类型的uniform。

设置vec类型的变量也可以使用如下方法:

代码语言:javascript
复制
GLES20.glUniform2fv()

设置int类型数据使用如下方法:

代码语言:javascript
复制
GLES20.glUniform1i(location,x)

设置mat类型使用如下方法:

代码语言:javascript
复制
GLES20.glUniformMatrix2fv()

varying

varying是GLSL中限定符,varying限定的变量只能在shader之间传递,是Vertex Shader(顶点着色器)的输出,Fragment Shader(片段着色器)的输入,Shader中的声明和类型要保持一致。

varying定义格式如下:

代码语言:javascript
复制
varying float color;

在Vertex Shader中定义varying变量并设置为vec4(1,0,0,1),代码如下:

代码语言:javascript
复制
attribute vec4 vPosition;
varying vec4 color;
void main() {
    color= vec4(1,0,0,1);
    gl_Position = vPosition;
}

在Fragment Shader中获取color值并使用,代码如下:

代码语言:javascript
复制
precision mediump float;
varying vec4 color;
void main()
{
  gl_FragColor = color;
}

与attribute和uniform一样,varying也有数量限制,OpenGL ES 2.0至少支持8个,获取varying的最大个数,代码如下:

代码语言:javascript
复制
fun getMaxSupportNum(): Int {
        var count = IntArray(1)
        GLES20.glGetIntegerv(GLES20.GL_MAX_VARYING_VECTORS, count, 0)
        return count[0]
    }

varying不仅有个数的限制,还有大小的限制,varying变量最多可以传递32个float数据,或者8个vec4,或者2个mat4矩阵。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老孟Flutter 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档