专栏首页FlutterOpenGL ES 之uniform和varying

OpenGL ES 之uniform和varying

一个

有态度

的程序员

uniform

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

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

uniform float uTexPos;

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

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

    fun getMaxVertexUniformNum(): Int {
        var count = IntArray(1)
        GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_UNIFORM_VECTORS, count, 0)
        return count[0]
    }

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

    fun getMaxFragmentUniformNum(): Int {
        var count = IntArray(1)
        GLES20.glGetIntegerv(GLES20.GL_MAX_FRAGMENT_UNIFORM_VECTORS, count, 0)
        return count[0]
    }

设置uniform变量值

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

GLES20.glGetUniformLocation(programHandle, uniformName)

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

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

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类型的变量也可以使用如下方法:

GLES20.glUniform2fv()

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

GLES20.glUniform1i(location,x)

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

GLES20.glUniformMatrix2fv()

varying

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

varying定义格式如下:

varying float color;

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

attribute vec4 vPosition;
varying vec4 color;
void main() {
    color= vec4(1,0,0,1);
    gl_Position = vPosition;
}

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

precision mediump float;
varying vec4 color;
void main()
{
  gl_FragColor = color;
}

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

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矩阵。

本文分享自微信公众号 - 老孟Flutter(lao_meng_qd),作者:老孟Flutter

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenGL ES 环境搭建

    Android工程中OpenGL ES的版本在AndroidManifest.xml中指定:

    老孟Flutter
  • OpenGL ES for Android 播放视频

    我们都知道Android中有VideoView控件可以直接播放视频,既简单又实用,那么为什么我们还要用OpenGL ES来播放视频呢?那是因为使用OpenGL ...

    老孟Flutter
  • OpenGL ES for Android 绘制旋转的地球

    No 图 No Code,上面旋转的地球是不是很酷炫,下面就让我们开始说说如何绘制旋转地球吧?绘制旋转地球需要3个步骤:

    老孟Flutter
  • 微信跳一跳可以用 Python 刷分;macOS 再曝重大安全漏洞,或许已存在 15 年

    转自:开源中国、solidot、cnBeta、腾讯科技等 ? 如果你每次都能挑到各自的正中间的话,可以 + 2 分,如果连着跳到中间会 + 4、+6、+8、+1...

    企鹅号小编
  • 小议如何跳出魔改网络结构的火坑

    知乎上,如何设计一个网络拟合 xx 函数的讨论层出不穷(e.g. 判断一个数是奇数还是偶数、能否被 n 整除);

    CV君
  • 宜信开源|手把手教你安装第一个LAIN应用

    三者都需要从 GitHub 获取已经发布的 LAIN 版本源代码: https://github.com/laincloud/lain/releases

    宜信技术学院
  • 用户体验评估方法汇:可用性测试

    顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscr...

    小老鼠
  • RocketMQ CommitLog 文件规则

    偏移量:每个 CommitLog 文件的大小为 1G,一般情况下第一个 CommitLog 的起始偏移量为 0,第二个 CommitLog 的起始偏移量为 10...

    java404
  • html网页开发基础

    1.可以写网页名称(显示在浏览器的左上方),网页名称用标记<title></title>

    刘金玉编程
  • iOS动态View的探索

    大家一直都在寻求能够动态更新业务的方法,关于这方面的框架也是层出不穷。自从 Facebook 推出 React Native 以后,便以其良好的兼容性和性能优势...

    ios-lan

扫码关注云+社区

领取腾讯云代金券