Shader Storage Buffer Object

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/

[14:47:55] Shader warning in 'GenSdfRayMap': Buffer count exceeding default GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS. Shader might not work on all hw. Consider combining separate buffers into one containing struct elements. at kernel ClearTex [14:47:55] Shader warning in 'GenSdfRayMap': Buffer count exceeding default GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS. Shader might not work on all hw. Consider combining separate buffers into one containing struct elements. at kernel Conserva [14:47:55] Shader warning in 'GenSdfRayMap': Buffer count exceeding default GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS. Shader might not work on all hw. Consider combining separate buffers into one containing struct elements. at kernel Distance [14:54:51]OVRGradleGeneration triggered. UnityEngine.Debug:Log (object) [14:54:51] QuestFamily = True: Quest=False, Quest2=True UnityEngine.Debug:LogFormat (string,object[])[15:04:49 FAILURE: Build failed with an exception. [15:05:50]CommandInvokationFailure: Gradle build failed. D:\unity\2021.3.44f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\OpenJDK\bin\java.exe-classpath "D:\unity\2021.3.44f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-7.5.1.jar" org.gradle.launcher.GradleMain "-Dorg[15:05:54] Couldn't create a Convex Mesh from source mesh "Reservoir01" within the maximum polygons limit (256). The partial hull will be used. Consider simplifying your mesh. UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&) [15:05:56] Build completed with a result of 'Failed' in 7022 seconds (7021950 ms) UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&) [15:05:56] UnityEditor.BuildPlayerWindow+BuildMethodException: 4 errors at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (UnityEditor.BuildPlayerOptions options) [0x002da] in <1518627dacca44efa32edd45bc720c48>:0
最新发布
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值