zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    spring与redis集成之aop整合方案
    Spring Boot 属性配置和使用
    nexus REST API /artifact/maven/[resolve|redirect] returns unexpected for v=LATEST
    Nginx CORS实现JS跨域
    Spring Boot简介
    关于EOF:
    C语言的那些事
    基础常识
    数组
    基本语句结构
  • 原文地址:https://www.cnblogs.com/calence/p/5222714.html
Copyright © 2011-2022 走看看