如何解决可以使用哪些方法来使用GLSL处理2D数组?
我的特定情况是一个计算着色器,用于在n by m matrix
和n legnth vector
之间进行矩阵乘法(其中n
和m
在编译时是未知的)。
解决方法
使用二维图像(请参见glsl - 8.12. Image Functions)
layout(r32f) uniform image2D matrixImage;
void main()
{
// [...]
ivec2 size = ivec2(imageSize(matrixImage));
int n = size.x;
int m = size.y;
for (int j = 0; j < m; j ++)
{
for (int i = 0; i < n; i ++)
{
float val = imageLoad(matrixImage,ivec2(i,j)).x;
// [...]
}
}
// [...]
}
或将数据写入Shader存储缓冲区对象中的一维开放尺寸数组:
layout(std430) buffer TMatrix
{
int n;
int m;
float data[];
} matrix;
layout(r32f) uniform image2D matrixImage;
void main()
{
// [...]
for (int j = 0; j < matrix.m; j ++)
{
for (int i = 0; i < matrix.n; i ++)
{
int index = j * matrix.n + i;
float val = matrix.data[index];
// [...]
}
}
// [...]
}
如果在编译时知道大小,则不必使用开放大小的数组(see GLSL - 4.1.9. Arrays):
const int n = 10;
const int m = 10;
layout(std430) buffer TMatrix
{
float data[n][m];
} matrix;
void main()
{
// [...]
for (int j = 0; j < matrix.m; j ++)
{
for (int i = 0; i < matrix.n; i ++)
{
float val = matrix.data[i][j];
// [...]
}
}
// [...]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。