0

我不熟悉 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 执行计算。这可能吗?

4

2 回答 2

2

OpenGL 4.3 为您提供计算着色器

于 2013-07-30T18:25:01.563 回答
2

这根本不是着色器的工作方式。他们从渲染管道的一个阶段获取数据,对其进行处理并输出在下一阶段开始工作所需的数据。所以通常情况下,您将有顶点数据输入(顶点着色器),它将被转换为适当的向量空间,然后将由它构造图元(即三角形)(几何着色器,镶嵌着色器),然后一组像素将是光栅化并且它们的颜色将在像素着色器中计算。然后将像素着色器的输出与其他像素混合以生成最终图像。着色器的全部目的是使渲染管道更加灵活,但它们的基本设计仍然是通过执行多个着色器阶段来输出图像。

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

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

如今,您可以完全跳过使用 Direct3D 或 OpenGL,并以更直接的方式直接与 GPU 上的流处理器交互。我建议您不要以从未真正打算使用的方式使用图形管道,而是查看OpenCLCUDA

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

于 2013-07-30T18:25:11.813 回答