sal*_*ali 3 c++ opengl buffer glsl
我有一个可变大小的GLubyte数组.我想将它传递给片段着色器.我见过 这个帖子 和这个帖子.所以我决定使用"Uniform Buffer Objects".但作为GLSL的新手,我不知道:
1 - 如果我要将其添加到片段着色器,我该如何传递大小?我应该创建一个结构吗?
layout(std140) uniform MyArray
{
GLubyte myDataArray[size]; //I know GLSL doesn't understand GLubyte
};
Run Code Online (Sandbox Code Playgroud)
2- C++代码中如何以及在何处关联此缓冲区对象?
3 - 如何处理GLubyte的浮动?
1 - 如果我要将其添加到片段着色器,我该如何传递大小?我应该创建一个结构吗?
size链接 GLSL程序时必须是静态的并且是已知的.这意味着它必须硬编码到实际的着色器中.
SSB可以具有可变长度(最后一个字段可以声明为未经过大小调整的数组myDataArray[]),并且它们还可以存储比UB更多的数据.
在旧版本的GL中,您可以使用缓冲区纹理将大量动态大小的数据传递到着色器,但与SSB相比,这是一个廉价的黑客攻击,您也无法使用struct类似于它的接口访问数据.
3 - 如何处理GLubyte的浮动?
您可以在GLSL数据结构中使用的最小数据类型是32位.uint尽管使用了特殊功能,但您可以根据需要将较小的数据打包并解压缩packUnorm4x8 (...).这是故意完成的,以避免必须定义较小尺寸的新数据类型.
即使不使用任何特殊的GLSL功能,您也可以这样做.
packUnorm4x8 (...) 大致相当于执行以下操作:for (int i = 0; i < 4; i++)
packed += round (clamp (vec [i], 0, 1) * 255.0) * pow (2, i * 8);
Run Code Online (Sandbox Code Playgroud)
它采用一个4分量的浮点值向量,在[0,1]范围内,并进行定点运算,将它们中的每一个打包成一个无符号的归一化(unorm)8位整数,占用它自己的1/4 uint.
更新版本的GLSL引入了内在功能,但是只要着色器已经存在,GPU实际上就是在做这种事情.无论何时GL_RGBA8从着色器读取/写入纹理,您基本上都要打包或解包由32位整数表示的4个8位统一.
| 归档时间: |
|
| 查看次数: |
4365 次 |
| 最近记录: |