• OpenGL ES 中Uniform块


    1.采用uniform Block的原因
    如果你的程序中包含了多个着色器,而且这些着色器使用了相同的Uniform变量,你就不得不为每个着色器分别管理这些变量。Uniform变量的location是在程序链接的时候产生的,因此Uniform变量的location会随着着色器的不同而发生变化。因此,这些Uniform变量的数据必须重新产生,然后应用到新的location上。
    而Uniform Block正是为了使在着色器间共享Uniform数据变得更加容易而设计的。有了Uniform Block,我们可以创建一个缓冲区对象来存储这些Uniform变量的值,然后将缓冲区对象绑定到Uniform Block。当着色器程序改变的时候,只需要将同样的缓冲区对重新绑定到在新的着色器中与之相关的Block即可。

    2.uniform block

    在unifom关键字后直接跟随一个block name和大括号,里面是一个或多个uniform变量.,用于与UBO关联。

    uniform BlobSettings {
      vec4 color1;
      vec4 color2;
      float radius1;
      float radius2;
    };

    *Uniform块中的变量依然是全局域的一部分,取用的时候不用Block名。

    uniform BlobSettings{
    vec4 color1;  
      vec4 color2;  
      float radius1;  
      float radius2;
    }Blob;

    *Uniform块中的变量则是在Blob名字域中,取用的时候需要加上Block名。

    3.关联
    对于每一个uniform块,都有一个“索引值”(index),这个索引值我们可以在OpenGL ES中获得,并把它与一个具体的UBO关联起来。

    GLint blockIndex = glGetUniformBlockIndex(nProgramHandler, "BlobSettings");
    GLint nBlockDataSize = 0;
    glGetActiveUniformBlockiv(nProgramHandler, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &nBlockDataSize);

    glGenBuffers(1, &m_nUBO);

    glBindBuffer(GL_UNIFORM_BUFFER, m_nUBO);

    glBufferData(GL_UNIFORM_BUFFER, nBlockDataSize, NULL, GL_DYNAMIC_DRAW);

    glBindBufferRange(GL_UNIFORM_BUFFER, 0, m_nUBO, 0, nBlockDataSize);

    glUniformBlockBinding(nProgramHandler, blockIndex, 0);

    glBindBuffer(GL_UNIFORM_BUFFER, NULL);

  • 相关阅读:
    微信平台的开发与集成
    自定义控件定义样式
    Android万能分辨率适应法
    Openfire配置过程,以及与php交互注意事项。
    Android 最近的一些新的功能
    自定义Ratingbar 评分控件
    解决android有的手机拍照后上传图片被旋转的问题
    Fragment 嵌套使用 Activity has been destoryed
    实现图文混排方法 类似于网易那样的
    Android 自定义View及其在布局文件中的使用示例
  • 原文地址:https://www.cnblogs.com/calence/p/5222714.html
Copyright © 2020-2023  润新知