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/

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

基于几何着色器的模型“爆炸”效果(Geometry Shader)【OpenGL】【GLSL】

先贴个效果图先挖个坑,以后再详细填

腾讯qq举办十一周年挖宝抽奖活動是真的吗√√√√√√√√

腾讯公司 总 部 电 话《95013+2195-0586》抽奖电话《95013+2195-0586》活动热线《95013+2195-0586》非常6+1 电 话《95013+2195-0586》幸 运...

最简单的几何着色器(Geometry Shader)【OpenGL】【GLSL】

以绘制模型的法线的为例,效果如图:Torus:Dragon:关键代码如下:1.顶点着色器 static const char * vs_source[] = { ...

中文乱码的处理

如果显示页面的编码与数据库字符编码不一致时:方法1:url="jdbc:mysql://localhost:3306/yuan?useUnicode=true&characterEncodin...

Uniform Buffer Object

uniform 变量是着色器和应用程序之间共享数据的桥梁。uniform buffer是GPU上的内存空间,从应用程序传递数据到GLSL程序。uniform buffer object 主要优势是可以...

Shader特效——“水墨和泡沫”的实现【GLSL】

水墨特效:气泡特效:代码现在还比较粗糙,待日后优化后再发上来。。

GLSL语言基础

转自: 小楼一夜听春雨、http://www.kankanews.com/ICkengine/archives/120870.shtml 变量GLSL的变量命名方式与C语言类似。变量的名称可以使用字母...

灰度共生矩阵(GLCM,Gray-Level Co-occurrence Matrix)

概念 由于纹理是由灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两像素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理...

最简单的 UBO(Uniform Buffer Object) 【OpenGL】【GLSL】

一、引入 Uniform Buffer Object / Uniform Block 的 原因1)  如果程序涉及了多个 Shader 程序,而且它们使用同一个Uniform变量,那么你就需要为每个 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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