我注意到我的着色器正在执行CPU代码中需要的计算。我可以将计算结果加载到统一数组中,然后在GPU完成工作后从CPU访问该统一吗?
答案 0 :(得分:0)
据我所知,无法从GPU中检索统一数据。但您可以执行计算并将输出颜色设置为您可以在屏幕上识别的内容,具体取决于计算的预期结果。例如:
#version 330 core
layout(location = 0) out vec4 color;
void main() {
if( Something you're trying to debug )
color = vec4(1, 1, 1, 1);
else
color = vec4(0, 0, 0, 1);
}
这是我所知道的唯一方式,而且我一直都在使用它。
答案 1 :(得分:0)
您可以通过Image Load/Store或SSBOs写入任意数量的数据。虽然图像加载/存储中的图像变量数量受到限制,但这些变量可以引用buffer textures或array textures。这两种方法都可以让您访问或多或少的大量数据来写入:
layout(rgba32f, writeOnly) imageBuffer buffer;
imageStore(buffer, valueOffset1, value1);
imageStore(buffer, valueOffset2, value2);
imageStore(buffer, valueOffset3, value3);
imageStore(buffer, valueOffset4, value4);
SSBO让这更容易:
layout(std430) buffer Data
{
float giantArray[];
};
giantArray[valueOffset1] = data1;
giantArray[valueOffset2] = data2;
giantArray[valueOffset3] = data3;
giantArray[valueOffset4] = data4;
但是,请注意any such writes will be unordered关于来自其他着色器调用的写入。所以覆盖这样的数据将是......有问题的。在尝试阅读之前,您需要进行适当的glMemoryBarrier
调用。
但如果您所做的只是计算操作,那么您应该使用专用的compute shaders。