OpenGL3.3_C++_Windows(18)

接口块:

  1. glsl彼此传输数据,通过in / out,当更多的变量,涉及数组和结构体
  2. 接口块(Interface Block)类似struct,in / out  + 块名{……}实例名

Uniform缓冲对象:

  1. 首先理解uniform Object:
  2. 负责向glsl传入变量/ 数组 / 结构体……,类似于const,这个不能在glsl内部被修改
  3. glsl在GPU上运行,uniform在着色器程序内部是全局的const,意味着不必通过顶点着色器作为中介
  4. Uniform Buffer Object:
  5. 使用多于一个的着色器时,尽管大部分的uniform变量都是相同(projection和view)的对于每个物体几乎都是不变的(相反model是会不同的),
  6. 防止重复设置,允许我们定义一系列在多个着色器程序中相同的全局Uniform变量,只需要设置相关的uniform一次,当然我们仍需要手动设置每个着色器中不同的uniform
  7. 对比:
  8. uniform相对于着色器程序内部是全局的,而Uniform Buffer相对于多个着色器程序是全局的

使用:

  1. Uniform缓冲对象仍是一个缓冲,glGenBuffers创建Uniform缓冲对象,绑定到GL_UNIFORM_BUFFER缓冲目标,分配足够的内存,相关的uniform数据存入缓冲
  2. 在glsl中:layout (std140) + uniform +name {……};
  3. 访问方式很简单:Uniform块中的变量可以直接访问,不需要加块名作为前缀


Uniform块布局:

  1. layout (std140)意思是说,对它的内容使用一个特定的内存布局。
  2. 为什么要layout呢:
  3. Uniform块的内容储存在一个缓冲对象中<实际上只是一块预留内存,这块内存并不会保存它具体保存的是什么类型的数据,需要告诉OpenGL内存的哪一部分对应着着色器中的哪一个uniform变量
  4. 需要知道的是每个变量的大小(字节)和(从块起始位置的)偏移量,来让我们能够按顺序将它们放进缓冲中
  5. 默认布局为共享shared布局:
  6. 可以为了优化而对uniform变量的位置进行变动的(从而优化存储空间),但是因此无法知道每个uniform变量的偏移量,也就不知道如何准确地填充我们的Uniform缓冲了。
  7. std140布局规范:
  8. 声明了每个变量的偏移量都是由一系列规则所决定的,显式地声明了每个变量类型的内存布局,因此可以手动计算出每个变量的偏移量,保证了内存布局在每个声明了这个Uniform块的程序(glsl)中是一致的
  9. 基准对齐量:在Uniform块中所占据的空间
  10. 对齐偏移量:从块起始位置的字节偏移量,对齐字节偏移量必须等于基准对齐量(当前)的倍数
  11. 对齐偏移量(初始为0) =  上一次对齐偏移量 +  上一个变量的基准对齐量(满足这一次对齐偏移量的倍数)
  12. 还有一个紧凑布局packed:是不能保证这个布局在每个程序中保持不变的(即非共享),因为它允许编译器去将uniform变量从Uniform块中优化掉,

使用:

  1. 我们在c++中初始了uniform缓冲,并在需要使用的glsl中都创建了uniform块,并且进行了layout,但是,如何才能让OpenGL知道哪个Uniform缓冲对应的是哪个Uniform块呢?
  2. 绑定点:
  3. 可以将一个Uniform缓冲链接至它,一个uniform对应一个绑定点,相同的uniform对应同一个绑定点
  4. 那么如何绑定Uniform块呢:
    1. Uniform块链接到绑定点:glUniformBlockBinding(着色器id,Uniform块索引,链接到的绑定点)
    2. Uniform块索引:glGetUniformBlockIndex(着色器id,Uniform块的名称)
  5. OpenGL 4.2版本起:layout(std140, binding = 2) uniform name{ ... };这样就不用再调用glGetUniformBlockIndex和glUniformBlockBinding了
  6. 还需要绑定Uniform缓冲对象到相同的绑定点上:
    1. glBindBufferBase(目标,一个绑定点索引,Uniform缓冲对象)
    2. 或者
    3. glBindBufferRange(目标,一个绑定点索引,Uniform缓冲对象,附加的偏移量,大小参数)可以绑定Uniform缓冲的特定一部分到绑定点中
  7. 首先定义数据,开始向Uniform缓冲中添加数据:可以使用(非必须)glBufferSubData()一点点填充缓冲的特定区域,需要偏移量,和大小。指定从何处开始填充这个大小的缓冲。
  8. 用glBufferSubData有什么好处?
  9. 主要目的是优化性能和资源管理。当只需要修改缓冲区的一小部分数据时,使用glBufferSubData可以避免重新发送整个数据集,从而节省带宽和提高渲染效率。也可以方便分开传输。
  10. 任何大型的渲染程序都可能同时激活有上百个着色器程序,这是不用一个一个的传入glsl,只需要对于所有glsl共有统一,且在glsl中const的变量,传入一次就好了

理解3D贴图:

  1. 首先2D贴图如何映射到平面上:渲染每个顶点时,在顶点数据中包含texcoord,对应纹理texture的st坐标,
  2. 而对于3维的texture坐标stp,也是差不多的意思
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值