GL调用着色器并获取输出颜色

时间:2013-07-30 17:40:49

标签: c opengl glsl

我不熟悉OpenGL,但如果有可能我想做的话,我可能想深入研究它。基本上,我想在GL着色语言中编写着色器并查询此着色器以获取某些输出值。我一直在浏览一些在线文章,从我看到的,着色器似乎是由OpenGL直接执行并映射到几何体。

为了清楚起见,我想写一些梦想代码

// Load the GL shader `shader`
// ...

// GLShaderOutput and glQueryShader are imaginary names

GLShaderOutput out = glQueryShader(shader, /* input parameters */);

// Obtain the received data

Color color;
glGetOutputParameter(out, "gl_FragColor", &color);

着色器的实现或使用着色器计算数据的确切代码可能是任意的。我只想用GLSL进行计算。这可能吗?

2 个答案:

答案 0 :(得分:2)

OpenGL 4.3为您提供compute shaders

答案 1 :(得分:2)

这不是着色器的工作方式。它们从渲染管道的一个阶段获取数据,处理它并输出在下一阶段开始工作所需的数据。通常,你会有顶点数据输入(顶点着色器),它将被转换为适当的向量空间,然后将从它构造基元(即三角形)(几何着色器,曲面细分着色器),然后一组像素将是栅格化并且它们的颜色将在像素着色器中计算。然后,像素着色器的输出将与其他像素混合以产生最终图像。着色器的重点是使渲染管道更加灵活,但它们仍然基本上设计为通过执行几个着色器阶段输出图像。

确实存在允许您使用传统渲染管道在GPU上进行通用GPU计算的黑客。这些黑客通常涉及绘制2x2纹理和在像素着色器中执行所有计算等操作。然后,您将回读在像素着色器中写入的纹理的颜色缓冲区。

简而言之,由于事物的高度并行流水线特性,您永远无法查询着色器的结果。您总是必须等待管道完成将所有输入数据推送到每个阶段,然后您回读最终图像。您可以使用变换反馈来略微缩短过程,并获得顶点着色器的输出,但这可能不是您想要的。

现在,您可以完全跳过使用Direct3D或OpenGL,并以更直接的方式直接与GPU上的流处理器连接。我建议你研究 OpenCL CUDA ,而不是以某种方式使用图形管道。

或者,计算着色器(绕过传统的渲染管道)暴露在最新的OpenGL和Direct3D实现中(需要DX11类硬件,目前驱动程序支持非常有限)。