问题标签 [transform-feedback]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opengl - glGetUniformLocation 在使用时在变换反馈期间返回 -1
该函数返回 -1,即使在顶点着色器中定义和使用了 Uniform,我怀疑原因可能是 out 属性可能没有正确绑定到目标缓冲区(不确定是否是这种情况)。如果没有这件制服,我的大部分价值观都会保持不变。
绘制变换反馈
顶点着色器
更新 您都要求提供一些额外的信息。
顶点着色器
反馈变化(我很愚蠢,一开始没有这个问题,尽管我的代码中仍然存在同样的问题)
我还在“绘制变换反馈部分”中添加了 gluseProgram。
opengl - OpenGL:重复使用变换反馈缓冲区会覆盖已建立的纹理
我有一个这种技术的工作实现,用于实例几何体的视锥体剔除。该技术的要点是我们使用顶点着色器来检查对象的边界是否位于视锥内,如果是,我们使用变换反馈缓冲区和几何着色器将该对象的位置输出到质地。然后,在实际渲染过程中,我们可以使用该纹理以及我们发出多少位置的查询,以获取我们正在渲染的对象的相关位置数据,以及在调用 glDrawElementsInstanced 时指定的绘制次数. 我所做的和文章所做的之间的一个区别是,我向纹理发出了一个完整的变换矩阵,而不是一个简单的位置向量,但我怀疑这对我的问题有任何影响。
实际问题:目前我有这个设置,因此,对于每个被渲染的对象类型(即树、盒子、岩石等),实际的渲染过程会立即跟随平截头体剔除渲染过程。这有效,并给出了预期的结果。然而,我想要做的是检查我所有的绘图命令并首先对各种对象进行所有平截头体剔除,然后才进行所有实际渲染,以避免一堆不必要的状态更改(即切换回和在着色器程序之间第四次)。然而,当我这样做时,我遇到了以前建立的纹理——我用于在实际渲染过程中读取位置的纹理——似乎都被最新的截锥体剔除函数调用覆盖了,
例如:我按顺序渲染了 4 棵树、10 个盒子和 3 块岩石,而我将看到的是一棵树、一个盒子和一块岩石,在所有(三个)位置上,我预计只有 3 块岩石成为。我一生都无法弄清楚为什么会这样,因为每次调用该函数时,我都非常清楚地将新缓冲区和纹理绑定到 TRANSFORM_FEEDBACK_BUFFER。为什么以前使用的纹理仍然从最新调用中接收到新数据?
截头体剔除功能的 C 代码:
tar 和 rmesh 显然在每次调用此函数时有所不同。请注意,我在这里留下了几行注释,其中包含删除每个渲染周期之间的缓冲区和纹理的代码,而不是简单地覆盖它们,而是使用该代码对错误模式没有影响。
我难住了。我觉得纹理和缓冲区定义明确并且清楚地保持分开,所以我不明白以前调用 fcullidraw 的纹理如何仍以某种方式绑定并被 TransformFeedback 覆盖,如果这确实发生了,而且它看起来肯定是这样,因为早期的物体会非常整齐地读取岩石的整个变换矩阵,包括“正确”的旋转、平移和一切。
链接的文章确实按照我想要的顺序执行操作——即首先重复截锥体剔除,然后重复渲染——我不确定我看到我做了什么不同。可能是一些小而明显的事情,我可能是个白痴,但在那种情况下,我很想知道我为什么以及如何成为那个人。
编辑:我推动并更新了我的实现,对原始技术进行了改进,在这里建议,它完全摆脱了写入纹理的方法,而是简单地写入绑定到 VAO 的缓冲区,并设置为每个渲染实例使用 VertexAttribDivisor 更新一次。这种方法总体上看起来更干净,顺便说一下,根本没有我原来的问题的额外副作用,因为我不再写入和上传纹理。因此,这对我来说不再是一个实际问题,但我仍然无法回答理论问题,所以如果有人有想法,我仍然全神贯注。
opencv - Opengl:我们能计算出有多少百分比的物体被场景中的其他物体遮住了?
我们正在模拟有很多建筑物的城市。我们需要计算有多少百分比的建筑表面被阳光直接照射(直射光)。是否有任何可行性读取阴影像素并计算它?我们已经尝试将对象渲染为纹理并且在阴影中不读取任何像素。然而,这个值在相机角度上有所不同,似乎不能反映真实值,也不能计算总体百分比。任何人都可以提出替代/更好的方法来解决这个整体问题。我们可以使用最新的技术,例如变换反馈吗?谢谢
webgl2 - Webgl2——转换反馈与转储到 CPU。重新定位 1,000,000 个顶点位置哪个更快?
对于物理粒子系统模拟,我想优化 WebGL2 程序。我想知道使用访问 3D 纹理的变换反馈调整顶点位置是否更快,例如,将我的位置设置为纹理像素中的“color.r”,或者转储整个 3D-纹理返回给 CPU 并从纹理中提取所有顶点的位置值,并将新的顶点数组重新提交给 GPU 以在随后的绘制周期中进行处理。
作为初学者,我不知道什么会更快。我需要使用纹理,因为我的位置计算需要知道 26 个相邻粒子相对于正在计算的顶点的位置。
我没有要显示的代码。在我为任何一种方法编写代码之前,我希望获得一种方法的指导。
我的直觉说,保持在 GPU 上而不是在每个绘制周期来回抽取 1,000,000 个顶点(最少)价值的数据会更快,但这是一个新手直觉,我更喜欢从对他的知识有信心的人那里获得指导。
performance - 几何着色器和 SSBO 性能中的顶点索引
我正在构建一个着色器程序和 GL 主机环境,它可以完成一项相对简单的任务:
- 在多个三角形(补丁)上运行 VS -> TCS -> TES -> GS 着色器阶段集。TES/TCS 确实会产生额外的镶嵌三角形。
- 创建一个由足够多的 vec4 元素组成的简单 SSBO。SSBO 将保存镶嵌的结果,即镶嵌顶点的坐标
- 在 GS 运行期间,GS 会将三角形顶点写入 SSBO,以使单个三角形的顶点步长为三个,即
(triangle1, vert1)
,(triangle1, vert2)
,(triangle1, vert3)
,(triangle2, vert1)
,(triangle2, vert2)
,(triangle2, vert3)
等。
为了索引我的 SSBO,我需要以某种方式推断“triangleID”。我仔细阅读了 GS/Tess 规格并做了一些实验。似乎 GS 内置输入只是没有它。gl_PrimitiveIDIn 似乎指的是在顶点着色器中看到的三角形的原始索引,并且在细分期间它没有增加。
最后,我想到了拥有另一个 SSBO 的想法/解决方法,该 SSBO 将具有一个“原始计数器”,atomicAdd(primCount, 1)
每次执行 GS 时都会递增:
昨天我花了很多时间来完善上面的代码,因为我在路上遇到了各种各样的赛车条件。现在看来,它在我的 GPU/驱动程序上起到了作用,但我不完全确定它是 100% 正确的。
所以我的第一个问题是:
- 在我的情况下推断三角形索引的最佳方法是什么?上面的代码是免费的?
我的第二个问题是关于性能:
- 我有另一个基于变换反馈对象和缓冲区的任务实现,我必须说它的工作速度快 4 倍(每帧 2.0 毫秒对 0.5 毫秒)。我想知道为什么 SSBO 后端比 TF 后端慢得多,我能做些什么来让它运行得更快吗?
PS 完整代码在这里:https ://pastebin.com/SagKZEyi
PSS 使用 DrawArraysIndirect() 更新的代码在这里:https ://gist.github.com/lhog/432af74ba41259e062f18910b5904684
谢谢!
opengl-es - glMapBufferRange 返回 null 并产生一个 GL_INVALID_ENUM?
OpenGL ES 3.0 在这里。我正在尝试读回 TRANSFORM_FEEDBACK 缓冲区的内容,如下所示:
输出是
即它看起来真的像glMapBufferRange() 生成错误1280,谷歌告诉我是GL_INVALID_ENUM。
问题:
根据https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glMapBufferRange.xhtml, glMapBufferRange 绝不应该产生这样的错误。只有 GL_INVALID_VALUE、GL_INVALID_OPERATION 和 GL_OUT_OF_MEMORY 吗?
ios - 使用变换反馈等技术将图像中的特定像素从 GPU 获取到 CPU
我正在开发一个 iOS OpenGLES 3.0 图像过滤器应用程序,它需要从纹理中读取像素数据,然后循环遍历整个像素,提取一些具有某些条件的像素,例如亮度超过阈值,然后使用每个提取的像素在屏幕。
现在我正在使用像素缓冲区对象 (PBO) 来快速读取图像。但随后我必须在 CPU 端提取特定像素。大图像会消耗大量时间。是否有任何 GPU 方面的解决方法来加快“像素提取”过程。
我的一个想法是将图像采样到顶点着色器中,进行提取工作,然后使用变换反馈将它们导出?实施起来可行吗?
opengl - 为什么 glBeginTransformFeedback 需要指定原始类型?
我试图思考为什么 OpenGL 在调用glBeginTransformFeedback时需要知道原始类型。本质上,它只是存储在缓冲区中的数据。
我的猜测是 OpenGL 以某种方式需要它来计算需要多少空间,因此绘制命令可以并行运行,而不会影响彼此的数据。但是当你提交一个绘图命令时,OpenGL 应该能够从绘图中指定的图元类型推断出所需的空间。
在使用几何着色器的情况下,我认为无法预先知道所需的空间量,因为每个单独的执行都可能输出不同数量的图元(我想在硬件中实现这应该是相当具有挑战性的!)。但在那种情况下,我认为指定原始类型glBeginTransformFeedback
无论如何都没有帮助。输出原语类型也可以从绑定的程序中推断出来。
所以在我看来,指定原始类型glBeginTransformFeedback
只是限制了您可以渲染的原始类型。为什么会有这个限制?
javascript - 使用带有变换反馈的两个缓冲区
我正在尝试检索两个不同的变量pos_x
,pos_y
并将它们的值存储到output_data_x
andoutput_data_y
中。我对 webgl 很陌生,在 google 上查找有关转换反馈的教程时遇到了一些问题,因此通过使以下代码起作用,我遇到了各种问题。如果我删除与 y 值相关的所有内容,下面的代码几乎可以工作。
我收到以下错误:
[.WebGL-000027D000342D80] GL_INVALID_OPERATION:绑定的变换反馈缓冲区空间不足。
[.WebGL-000027D000342D80] GL_INVALID_VALUE:映射范围不适合缓冲区尺寸。
WebGL:INVALID_VALUE:bindBufferBase:索引超出范围
javascript - 不能在栅栏上等待
我正在尝试TRANSFORM_FEEDBACK_BUFFER
使用以下代码获取一些数据:
但如果我这样做,我会收到以下警告消息getBufferSubData
:
性能警告:READ-usage 缓冲区被读回而没有在栅栏上等待。这导致了图形管道停顿。
然后,我尝试在之后添加以下代码gl.endTransformFeedback();
:
我在这里遇到的问题status
是总是返回gl.TIMEOUT_EXPIRED
。然后我尝试设置gl.MAX_CLIENT_WAIT_TIMEOUT_WEBGL
为中的timeout
值gl.clientWaitSync
,然后我得到:
WebGL:INVALID_OPERATION:clientWaitSync:超时 > MAX_CLIENT_WAIT_TIMEOUT_WEBGL
如果我设置,也会发生这种情况gl.MAX_CLIENT_WAIT_TIMEOUT_WEBGL - 1
。接下来,我尝试设置gl.TIMEOUT_IGNORED
为timeout
值,使用此设置,status
正在获取gl.WAIT_FAILED
.
为了消除该性能警告,我在这里缺少什么?