Webgl 有可能得到顶点的实际值吗?

Webgl 有可能得到顶点的实际值吗?,webgl,vertex,Webgl,Vertex,我试图从顶点着色器恢复一些顶点数据,但我在互联网上没有找到任何相关信息 我正在使用顶点着色器使用GPU计算我的顶点位置,但我需要获得Javascript中应用程序逻辑的结果。有没有一种不在Javascript中计算的方法可以做到这一点?是OpenGL将顶点处理结果返回到应用程序代码的方法。但这仅适用于webgl 2。变换反馈还输出基本体,而不是顶点,使其不太可能完美匹配 一个新的选择是和。但我认为webgl 2中也缺少这些 简而言之,您要么需要在javascript中计算相同的数据,要么将应用程

我试图从顶点着色器恢复一些顶点数据,但我在互联网上没有找到任何相关信息

我正在使用顶点着色器使用GPU计算我的顶点位置,但我需要获得Javascript中应用程序逻辑的结果。有没有一种不在Javascript中计算的方法可以做到这一点?

是OpenGL将顶点处理结果返回到应用程序代码的方法。但这仅适用于webgl 2。变换反馈还输出基本体,而不是顶点,使其不太可能完美匹配

一个新的选择是和。但我认为webgl 2中也缺少这些

简而言之,您要么需要在javascript中计算相同的数据,要么将应用程序逻辑移动到着色器。如果需要变换顶点数据进行联盟检测,则可以使用边界框测试,并仅在边界框命中时进行顶点级变换

您可以使用多级边界框,其中在整个对象周围有一个大框,然后在下一个边界框级别将对象拆分为小部分,如身体中每个不相交部分的单独框(例如,腿部膝盖和脚踝的拆分)。这样,javascript主要只为每个帧中的每个对象转换单个边界框/球体。仅在对象靠近时变换二级框。然后仅当对象非常接近触摸时才进行逐顶点变换。

是OpenGL将顶点处理结果返回到应用程序代码的方法。但这仅适用于webgl 2。变换反馈还输出基本体,而不是顶点,使其不太可能完美匹配

一个新的选择是和。但我认为webgl 2中也缺少这些

简而言之,您要么需要在javascript中计算相同的数据,要么将应用程序逻辑移动到着色器。如果需要变换顶点数据进行联盟检测,则可以使用边界框测试,并仅在边界框命中时进行顶点级变换


您可以使用多级边界框,其中在整个对象周围有一个大框,然后在下一个边界框级别将对象拆分为小部分,如身体中每个不相交部分的单独框(例如,腿部膝盖和脚踝的拆分)。这样,javascript主要只为每个帧中的每个对象转换单个边界框/球体。仅在对象靠近时变换二级框。然后仅当对象非常接近触摸时才进行逐顶点变换。

在WebGL2中,您可以使用变换反馈(正如Pauli所建议的),并且您可以使用
getBufferSubData
读回数据。虽然理想情况下,如果您只是在另一个绘图调用中使用数据,则不应读回,因为读回速度很慢

变换反馈只是意味着您的顶点着色器可以将其输出写入缓冲区

在WebGL1中,可以通过将顶点渲染到附加到帧缓冲区的浮点纹理来实现。每个顶点都包含一个顶点id属性。您可以使用该属性设置
gl\u位置
。您可以使用
gl.POINT
进行绘制。它将允许您有效地渲染输出纹理中的每个单独像素,从而获得变换反馈。不同之处在于,您的结果将以纹理而不是缓冲区结束。你可以看到


如果您不需要JavaScript中的值,那么您可以使用刚刚写入的纹理作为未来绘制调用的输入。如果您确实需要在WebGL2的JavaScript

中返回值,您可以使用转换反馈(正如Pauli所建议的),并且您可以使用
getBufferSubData
读取数据,尽管理想情况下,如果您只是要在另一个draw调用中使用数据,您不应该将其读取回来,因为读取速度很慢

变换反馈只是意味着您的顶点着色器可以将其输出写入缓冲区

在WebGL1中,可以通过将顶点渲染到附加到帧缓冲区的浮点纹理来实现。每个顶点都包含一个顶点id属性。您可以使用该属性设置
gl\u位置
。您可以使用
gl.POINT
进行绘制。它将允许您有效地渲染输出纹理中的每个单独像素,从而获得变换反馈。不同之处在于,您的结果将以纹理而不是缓冲区结束。你可以看到


如果您不需要JavaScript中的值,那么您可以使用刚刚写入的纹理作为未来绘制调用的输入。如果您确实需要JavaScript中的值,那么这是webgl1的好解决方案。Webgl2具有getBufferSubData函数,可用于读取缓冲区数据。我忘了webgl 1中缺少gl.MapBuffer。我更习惯于编写本机gl代码。感谢您指出
getBufferSubData
。是的,WebGL2中也没有mapbuffer,因为没有安全/简单的方法允许网站映射GPU内存。这是webgl1很好的解决方案。Webgl2具有getBufferSubData函数,可用于读取缓冲区数据。我忘了webgl 1中缺少gl.MapBuffer。我更习惯于编写本机gl代码。感谢您指出
getBufferSubData
。是的,WebGL2中也没有mapbuffer,因为没有安全/简单的方法允许网站映射GPU内存。