我不熟悉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进行计算。这个是可能的吗?
发布于 2013-07-30 18:25:11
这根本不是着色器的工作方式。他们从渲染管道的一个阶段获取数据,对其进行处理,并输出下一阶段开始工作所需的数据。所以通常,你会有顶点数据输入(顶点着色器),它会被转换成一个适当的向量空间,然后原语(即三角形)将被构造(几何着色,镶嵌着色),然后一组像素将被光栅化,它们的颜色将在像素着色器中计算。然后,像素着色器的输出将与其他像素混合以生成最终图像。着色器的全部目的是使渲染管道更加灵活,但它们的基本设计仍然是通过执行着色器的几个阶段输出图像。
黑客确实存在,允许您使用传统的渲染管道在GPU上进行通用GPU计算。这些黑客通常涉及像绘制到一个2x2纹理和执行你所有的计算在一个像素着色器。然后,您将读取在像素着色器中写入的纹理的颜色缓冲区。
简而言之,您永远无法查询着色器的结果,因为它具有高度并行的流水线特性。您总是要等待管道完成,将所有输入数据推送到每个阶段,然后再读取最后的图像。您可以使用转换反馈缩短进程一点点,并得到一个顶点着色器的输出,但这可能不是你想要的。
现在,您可以完全跳过使用Direct3D或OpenGL,直接以更直接的方式与GPU上的流处理器进行接口。我建议您研究一下OpenCL或CUDA,而不是以从未真正被使用过的方式使用图形管道。
或者,计算机着色器(它绕过传统的呈现管道)在OpenGL和Direct3D的最新实现中公开(需要DX11类硬件,并且目前对驱动程序的支持非常有限)。
发布于 2013-07-30 18:25:01
OpenGL 4.3给你计算着色器。
https://stackoverflow.com/questions/17953757
复制相似问题