2016-11-15 91 views
0

这可能看起来像一个基本问题,但是如何处理/操作在OpenGL中通过着色器创建的对象?从着色器操纵OpenGL对象

我总是需要不同的对象的坐标,以便在我的宿主程序中使用,根据这些坐标创建/操作不同的对象,然后将它们发送回顶点/片段/几何着色器。

我有我最初的顶点坐标,我在我的主要程序定义,但一旦他们达到了几何着色器,该位置是通过计算:

gl_Position = projection_matrix * view_matrix * vec4(square_point,1); 
EmitVertex(); 

而现在,例如,我需要在屏幕上选择并用鼠标移动它们。但是我不能想象得到确切坐标的简单方法。 我试图在我的主程序中进行位置数学运算,但我似乎没有得到与几何着色器计算出的坐标相同的坐标。并且计算CPU上的所有数据对于我拥有的对象数量来说并不是最佳的。

我曾经想过通过缓冲区来做一些GPU-> CPU数据检索,但是有太多的对象和很多坐标,以至于它是无情的。

我想有另一种方法来解决这个问题,只是我可能没有OpenGL的工作原理。

+0

你是否正确地处理转换后的'w'坐标?这是在Geometry Shader运行之后发生的一个步骤(将所有4个向量组件分开)。如果您捕获发射的顶点并比较这些顶点,它们将不会执行此步骤。 –

+0

@ AndonM.Coleman - 我不这么认为。我正在应用我提出的确切公式。 –

回答

0

您可以使用所谓的着色器存储缓冲区对象SSBO。您可以使用buffer限定符在着色器中创建它们。然后你进行必要的计算并通过glMapBufferRangememcpy下载你的数据。