Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 以后是否可以重用glsl顶点着色器输出?_Opengl_Glsl_Vertex Shader - Fatal编程技术网

Opengl 以后是否可以重用glsl顶点着色器输出?

Opengl 以后是否可以重用glsl顶点着色器输出?,opengl,glsl,vertex-shader,Opengl,Glsl,Vertex Shader,我有一个巨大的网格(100k三角形),需要绘制几次,并将每个帧混合在一起。是否可以重用网格第一次过程的顶点着色器输出,并在以后的过程中跳过顶点阶段?我希望在顶点管道和光栅化方面节省一些成本 面向OpenGL 3.0,可以使用转换反馈等功能。我将首先回答您的基本问题,然后回答您真正的问题 是的,您可以存储顶点变换的输出供以后使用。这称为变换反馈。它需要OpenGL 3.x类硬件或更好的硬件(又名:DX10硬件) 它的工作方式分为两个阶段。首先,你必须将你的程序设置为有基于反馈的变量。你和我一起做这

我有一个巨大的网格(100k三角形),需要绘制几次,并将每个帧混合在一起。是否可以重用网格第一次过程的顶点着色器输出,并在以后的过程中跳过顶点阶段?我希望在顶点管道和光栅化方面节省一些成本


面向OpenGL 3.0,可以使用转换反馈等功能。

我将首先回答您的基本问题,然后回答您真正的问题

是的,您可以存储顶点变换的输出供以后使用。这称为变换反馈。它需要OpenGL 3.x类硬件或更好的硬件(又名:DX10硬件)

它的工作方式分为两个阶段。首先,你必须将你的程序设置为有基于反馈的变量。你和我一起做这件事。这必须在链接程序之前完成,类似于

完成后,您需要使用
glBindBufferRange
将缓冲区绑定到
GL\u transform\u feedback\u BUFFER
,从而设置将数据写入的缓冲区。然后使用glBeginTransformFeedback启动反馈操作,并按正常方式继续。您可以使用a来获取编写的原语数量(以便以后可以使用
glDrawArrays
绘制原语),或者如果您有4.x类硬件(或AMD 3.x硬件,所有这些硬件都支持ARB_transform_feedback2),您可以。这样可以节省时间

现在来回答你的实际问题:它可能不会帮你买到任何真正的性能

你在画地形。地形并没有真正得到任何变化。通常有一两个矩阵乘法,可能有法线(尽管如果要渲染阴影贴图,甚至没有)。就这样

如果用这样一个简单的着色器将100000个顶点推到GPU上,很可能已经饱和了GPU渲染所有顶点的能力。您可能会在基本装配/设置上遇到瓶颈,而且这不会更快

所以你可能不会从中得到什么。反馈通常用于生成三角形数据供以后使用(有效的伪计算着色器),或用于保存复杂变换的结果,如使用双四元数的矩阵调色板蒙皮等。一个简单的矩阵乘法和go几乎不会成为雷达上的一个亮点


如果你愿意,你可以试试。但很可能你不会有任何问题。通常,最好的解决方案是采用某种形式的延迟渲染,这样对于对象投射的每个阴影,只需渲染一次+X(其中X由阴影映射算法确定)。而且,由于阴影贴图需要不同的变换,您无论如何也无法从反馈中获得任何东西。

100k不是一个错误数字。提及您计划应用程序的硬件/gpu。针对现代消费者pc。我有测试卡,包括nvidia GTS450、GT570、GT650M和一些等效的ati卡。这是针对地形系统的,100k是一个补丁。我试图将每帧绘制的三角形总数控制在100万左右。目前,地形系统消耗约700k。大多数都是特写补丁(最高LOD)@Nicolas是的,它在核心规范中。我的意思是“功能”“可以使用诸如转换反馈之类的功能。”-好吧,那么你似乎已经知道怎么做了。谢谢你的快速回复。我已经在我的引擎中实现了转换反馈。glDrawArrays是否仍然通过顶点管道推送所有数据?也许我应该用“重用光栅化结果”来回答我的问题~@shenbo:是的。这叫做“延迟渲染”。我已经在使用延迟方法进行照明计算。只是想知道是否有任何方法可以完全跳过顶点着色器阶段。到目前为止似乎还不可能。回答被接受。@shenbo:就像尼科尔·博拉斯已经解释过的那样,你很可能已经突破了原始设置的极限。基本体设置以顶点变换的方式在已变换的几何体上进行。因此,在顶点着色器输出上所做的任何缓存都会像以前一样将大量数据输入到基本体设置中,并使其饱和。基于图像的缓存解决方案是已经建议的延迟渲染方法:对于每个帧缓冲区样本,将存储转换后的几何体,以便用于以后通过绘制单个视口大小的四边形开始的计算。@datenwolf:True。我可以画一次网格,然后生成一个屏幕大小的四边形作为进一步着色的像素遮罩。我稍后会尝试:)