着色器使用后访问GLSL Uniforms

时间:2017-06-27 13:54:57

标签: opengl glsl

我注意到我的着色器正在执行CPU代码中需要的计算。我可以将计算结果加载到统一数组中,然后在GPU完成工作后从CPU访问该统一吗?

2 个答案:

答案 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/StoreSSBOs写入任意数量的数据。虽然图像加载/存储中的图像变量数量受到限制,但这些变量可以引用buffer texturesarray 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