带字节的着色器存储缓冲区对象 [英] Shader storage buffer object with bytes

查看:38
本文介绍了带字节的着色器存储缓冲区对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个计算着色器,其中的输出将写入SSBO。现在,此缓冲区的使用者是CUDA,它希望它包含无符号字节。我目前无法找到如何在SSB中为每个索引写入一个字节的方法。使用纹理或图像,规范化浮点到无符号字节的转换由OpenGL处理。例如,我可以附加内部格式为R8的纹理,并按条目存储字节。但是使用SSBO不可能做到这一点。是吗

实际上,我希望能够做到以下几点:

计算着色器:

  #version 430 core
  layout (local_size_x = 8,local_size_y = 8 ) in;
  struct SSBOBlock 
  {
    byte mydata;
  };


  layout(std430,binding = BUFFER_OUTPUT) writeonly buffer bBuffer
  {

     SSBOBlock Ouput[];

  } Out;


   void main()
  {
        //..... Compute shader stuff...
        //.......
       Out.Ouput[globalIndex].mydata = val;//where val is normalized float
   }

推荐答案

我找到了一种将无符号字节数据写入计算着色器的缓冲区的方法。Buffer texture执行此操作。它基本上是以缓冲区作为存储的图像纹理。这样,我可以将图像格式指定为R8,这允许我在缓冲区的每个索引上存储字节大小值。

GLuint _tbo_buffer,_tbo_tex;
glGenBuffers(1, &_tbo_buffer);
glBindBuffer(GL_TEXTURE_BUFFER, _tbo_buffer);
glBufferData(GL_TEXTURE_BUFFER, SCREEN_WIDTH * SCREEN_HEIGHT, NULL, GL_DYNAMIC_COPY);
glGenTextures(1, &_tbo_tex);
glBindTexture(GL_TEXTURE_BUFFER, _tbo_tex);
//attach the TBO to the texture:
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, _tbo_buffer);
glBindImageTexture(0, _tbo_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R8);

计算着色器:

#version 430 core

layout (local_size_x = 8,local_size_y = 8 ) in;
layout(binding=0) uniform sampler2D   TEX_IN;
layout(r8) writeonly uniform imageBuffer mybuffer;

void main(){
   vec2 texSize =  vec2(textureSize(TEX_IN,0));
   vec2 uv      =  vec2(gl_GlobalInvocationID.xy / texSize);
   vec4 tex     =  texture(TEX_IN,uv); 
   uint globalIndex =  gl_GlobalInvocationID.y * nThreads.x +    gl_GlobalInvocationID.x;
  //store only r:
   imageStore(mybuffer,int(globalIndex),vec4(0.5,0,0,0));

}

然后我们可以在CPU上逐字节读取或映射到CUDA缓冲区资源:

 GLubyte* ptr = (GLubyte*)glMapBuffer(GL_TEXTURE_BUFFER, GL_READ_ONLY);

这篇关于带字节的着色器存储缓冲区对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆