Shader Storage Buffer Object

原创 2016年07月31日 12:39:30

Shader Storage Buffer Object是GLSL着色器的buffer,不同于uniform buffer在着色器不可修改,shader storage buffer是可读可写的。修改的内容给其他着色器调用或者应用程序本身。

Buffer Block

layout (std430, binding=1) buffer shader_storage_block_data
{
    vec3 uLightDirectionE;
    vec3 uMaterialAmbient;
    vec3 uMaterialDiffuse;
    vec3 uLightAmbient;
    vec3 uLightDiffuse;
};

采用内存布局方式为430,绑定点为1。

初始化

    m_ShaderStorageBlockData.uLightDirectionE = glm::vec4(1, 1, 1, 0);
    m_ShaderStorageBlockData.uMaterialAmbient = glm::vec4(0.3, 0.3, 0.3, 0);
    m_ShaderStorageBlockData.uMaterialDiffuse = glm::vec4(0.9, 0.9, 0.9, 0);
    m_ShaderStorageBlockData.uLightAmbient = glm::vec4(0.6, 0.6, 0.6, 0);
    m_ShaderStorageBlockData.uLightDiffuse = glm::vec4(0.9, 0.9, 0.9, 0);

    m_ShaderStorageBlockIndex = glGetProgramResourceIndex(m_pEffect->getProgramID(0), GL_SHADER_STORAGE_BLOCK, "shader_storage_block_data");
    GLint SSBOBinding=0, BlockDataSize = 0;
    glGetIntegerv(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &SSBOBinding);
    glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &BlockDataSize);

    glGenBuffers(1, &m_SSBO);
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_SSBO);
    glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(shader_storage_block_data), &m_ShaderStorageBlockData, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

建立连接

建立buffer block和shader storage buffer的连接,也是通过绑定点完成。

    GLuint BindingPointIndex = 1;
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, BindingPointIndex, m_SSBO);
    glShaderStorageBlockBinding(m_pEffect->getProgramID(0), m_ShaderStorageBlockIndex, BindingPointIndex);
    m_pMesh->render();
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

其实SSBO和UBO用法类似,所以参照Uniform Buffer Object即可。

参考资料

【1】https://www.opengl.org/wiki/Shader_Storage_Buffer_Object
【2】http://www.geeks3d.com/20140704/tutorial-introduction-to-opengl-4-3-shader-storage-buffers-objects-ssbo-demo/

Opengl学习笔记之ShaderStorageBufferObject和AtomicCounter

Shader Storage Buffer Object 也是一种缓冲区对象,用于存储与检索着色器语言的数据,简称SSBO,类似于UBO。存储SSBO的缓冲区对象绑定到SSBO bindin...

Storage and Buffer Manager实现文档

  • 2012年04月29日 11:43
  • 288KB
  • 下载

Storage and Buffer Manager实现

  • 2015年11月11日 16:59
  • 126KB
  • 下载

data storage manager和buffer manager实现

中国科学技术大学软件学院  真实姓名 原创作品版权所有转载请注明出处 一、  实验目的 为了了解数据库buffer管理器的工作原理,对数据库底层结构有进一步的了解,编写一个data storage ...

Storage and Buffer Manager C++实现

  • 2012年04月29日 11:42
  • 2.23MB
  • 下载

Storage and Buffer ManagerJAVA实现

  • 2012年04月29日 11:40
  • 1.12MB
  • 下载

OpenGL超级宝典第七版学习笔记-着色器存储块(shader storage block)

20170321-shader storage block 1、 shader storage block与uniform block最大的区别是在shader中可以对前者进行写入操作,甚至是对其成...
  • hjzyzr
  • hjzyzr
  • 2017年03月29日 05:20
  • 507

Shader Storage Block对象及其使用

前面介绍了opengl中的uniform对象,今天继续介绍一种新的对象---Shader Storage Block,我们简称为SSB对象,相比之前的uniform block,这种新的数据类型最大的...

对象存储(Object-based Storage)概述

什么是对象存储?多次在不同场合被问起这个问题,于是就想写篇小综述文章。网上查找资料时,找到几篇不错的资料,不想做重复工作,简单整理一下,供自己和大家参考。 什么是对象存储(OSD)? 存储局域网(S...
  • liuben
  • liuben
  • 2014年01月08日 00:03
  • 16469

swift之storage node上的object updater的实现

1. Demaon:updater: 每个storage node上都有两个updater的后台进程: /usr/bin/python /usr/bin/swift-container-upd...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Shader Storage Buffer Object
举报原因:
原因补充:

(最多只允许输入30个字)