问题标签 [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.

0 投票
1 回答
227 浏览

opengl - gl_PointCoord 编译和链接,但在运行时崩溃

我成功地编写了一个带有点精灵的标准基本变换反馈粒子系统。没有闪烁,粒子从一个缓冲区更新到下一个缓冲区,然后渲染,然后输出缓冲区在下一次迭代时成为输入缓冲区。所有 GPU 端的标准变换反馈。精彩的!一个大问题:它只有在我不使用 gl_PointCoord 时才有效。为我的点精灵使用纯色效果很好。但我需要 gl_PointCoord 来做任何有意义的事情。我所有的着色器,无论他们是否使用 gl_PointCoord,编译和链接都很好。但是,在运行时,如果着色器使用 gl_PointCoord(无论 gl_PointCoord 实际上是否在执行路径中),程序就会崩溃。我明确地 glEnable(GL_POINT_SPRITE)。这没有任何影响。省略 gl_PointCoord,设置 glPointSize(100.0f),使用 vec4(1.0,1.0,1.0, 1.)粒子系统渲染得就像大的白色块状正方形(如预期的那样)。但是在成功编译和链接后,以任何方式使用 gl_PointCoord(作为标准纹理查找坐标或程序颜色或其他任何东西)都会在运行时使我的着色器崩溃。我只是不明白为什么。它通过了glShaderSource、glCompileShader、glAttachShader、glLinkProgram。我将我的着色器编译为#version 430 和 440,我什至尝试了 300 es。所有编译,链接,我检查了编译和链接的状态。都好。我正在使用高端的微软 Surface Book Pro,Visual Studio 2015。NVIDIA GeForce GPU。我还确保我所有的驱动程序都是最新的。不幸的是,对于点精灵,我没有来自顶点着色器的广告牌顶点用于插入片段着色器作为纹理坐标。gl_FragCoord 也不起作用(正如我对点精灵的期望)。有谁知道如何解决这个问题或使用另一种技术来处理点精灵的纹理坐标?

glBeginTransformFeedback(GL_POINTS);//如果我的片段着色器使用gl_PointCoord,它在这里很难崩溃。

回复时,请理解我在 GLSL 和 HLSL 中编写着色器、顶点着色器、像素着色器、曲面细分控制、曲面细分评估和几何着色器方面非常有经验。但我并不声称知道一切。我可能忘记了一些简单的事情;我只是不知道那可能是什么。我想这可能是我没有启用的状态。就变换反馈而言,我还通过 glTransformFeedbackVaryings 正确设置了可变属性。C++:

VS 反馈:

PS反馈:

0 投票
1 回答
484 浏览

c++ - 在 OpenGL 中使用带有变换反馈的 GL_SEPARATE_ATTRIBS 时如何读回多个缓冲区?

使用 GL_SEPARATE_ATTRIBS 而不是像 GL_INTERLEAVED_ATTRIBS 那样只读取一个时,如何回读多个变换反馈缓冲区?在此示例中,我设置了两个缓冲区并将它们设置为转换反馈。

使用单个缓冲区,GL_INTERLEAVED_ATTRIBS我可以通过调用来读回单个glGetBufferSubData缓冲区GL_TRANSFORM_FEEDBACK_BUFFER

但是,我如何告诉 OpenGL 我想读回两个缓冲区buffer0并用 ofbuffer1索引?(0,1)glBindBufferBaseGL_TRANSFORM_FEEDBACK_BUFFER

我发现的所有教程总是将其简化为单个缓冲区,GL_INTERLEAVED_ATTRIBS并仅说明可以根据 VAO 输入布局使用单独的缓冲区来匹配 TF 输出,或者根本不读回缓冲区数据。

0 投票
1 回答
387 浏览

opengl - OpenGL 4.3 或 4.5 变换反馈不起作用

有两个调试 printf 段。第一个打印出正确的数据,但第二个没有。我哪里做错了?哦,我使用相同的顶点和片段着色器来获取顶点数据并再次绘制它们。

0 投票
0 回答
228 浏览

opengl - glDrawTransformFeedback 不写入缓冲区

我尝试使用transform特性来创建粒子系统,所以有2个transform buffer和2个array buffer,使用乒乓切换。

而且我的着色器很简单,只需保持添加源位置即可。

如果使用glDrawTransformFeedback(),2个缓冲区将保留原始数据,不会改变。但是如果我切换到glDrawArrays(),那么乒乓球工作,位置值不断增加。

初始代码

执行转换

0 投票
1 回答
306 浏览

java - 在 Android 上正确生成的 Opengl Transform 反馈

我一直在努力在 android 上创建一个有效的转换反馈。到目前为止,我得到的最接近的问题与这个被否决的问题类似:https ://stackoverflow.com/questions/41066101/transform-feedback-altering-render-result

我要创建的内容:

从顶点缓冲区对象渲染为变换反馈。然后使用最终的绘图着色器从变换反馈的缓冲区进行渲染。

我如何理解整个概念:

我了解程序与变量链接的方式(我遵循了这个例子:https ://gist.github.com/hpp/d2d26adc5987002eb520 )在Android上,你必须提供一个“虚拟”片段着色器,否则程序链接将失败而没有消息。

拥有链接程序后,这些是步骤:(代码在java中)

  1. 创建一个 VBO 来读取数据

    /li>
  2. 创建变换反馈缓冲区

    /li>
  3. 每次我想进行计算时,我都会这样称呼:

    /li>
  4. 之后,我应该能够绘制缓冲区的内容:

    /li>

现在,我的问题是:

  • 在这个过程中是否存在固有的错误?
  • 即使我什么都没画,计算部分是否会弄乱我的设备屏幕?(它显示由android更新的随机颜色或图标,如电池和网络)
  • 使用与 GL_TRANSFORM_FEEDBACK_BUFFER 相同的顶点数组对象是否与使用 GL_ARRAY_BUFFER 相同?
0 投票
1 回答
108 浏览

opengl - TransformFeedback 绑定多个输出缓冲区

我正在使用 GL 的 TransformFeedback 功能。是否可以绑定多个输出缓冲区而不是单个缓冲区?假设我有两个输出变量:

我为它们生成了两个缓冲区对象:

我怎样才能绑定id0out0id1out1

我已经尝试过glBindBuffersBaseand glBindBufferRange,但似乎两者都没有。

0 投票
1 回答
577 浏览

c++ - 具有动态几何的 OpenGL 变换反馈

我目前正在尝试使用几何着色器进行变换反馈。几何着色器取一个三角形,用它制作一个棱镜,并在它上面放一个四棱柱(把它想象成一个方尖碑,但只有 3 个而不是 4 个边)。

我使用一次变换反馈得到了正确的结果。但是我想用变换反馈创建额外的几何。我想为 Tetraeder 的每个三角形执行几何着色器过程。

第一次通过后的结果 第一次通过后的结果

第二次通过后的结果 第二次通过后的结果 因此,在第二次通过时,黑色部分不会变为无穷大,应该有另一个分支,您可以左右看到,但那个朝向相机。

我在这里做错了什么?我不确定如何处理两个顶点缓冲区对象不断增加的数据大小,我可能在那里做错了什么。帮助将不胜感激。

在主窗口循环之前变换反馈:

主窗口循环期间的变换反馈:

0 投票
1 回答
154 浏览

opengl-es - 转换反馈:将多个反馈批处理在一起

目标:OpenGL ES >= 3.0。

这是我的应用程序的作用:

即,对于每个网格,它首先使用顶点着色器计算一些每个顶点的东西,将这些东西返回给 CPU,基于此做出一些决定,然后才渲染网格。

这行得通,问题是速度。我们已经在几个基于 OpenGL ES 3.0、3.1、3.2 的设备上进行了测试,在每一个设备上,情况看起来都一样:“glMapBufferRange()”调用将 FPS 降低了大约一半!

我怀疑如果没有 glMapBufferRange(),OpenGL 可以“延迟”渲染,即将多个渲染一起批处理并在自己方便的时候进行,而如果我们调用 glMapBufferRange(),它现在确实需要渲染,这可能会使其变慢(我们得到的数据量很小,我真的不认为这是问题)。

因此,我也想批量处理我的转换反馈,如下所示:

问题是我不知道如何告诉 OpenGL 不将变换反馈输出保存到开头,而是保存到 TRANSFORM_FEEDBACK_BUFFER 中的特定偏移量(这样我可以稍后在循环之后,将手放在所有 TF数据一次返回)。

有什么建议吗?

0 投票
0 回答
116 浏览

c++ - OpenGL c++ 变换反馈值不更新

我们目前正在研究 GPU 粒子系统。我的实现有问题,似乎缓冲区没有更新或绘制。

如果有任何帮助,我将不胜感激!

粒子系统初始化

粒子系统更新

我没有在Draw 调用上花费太多时间。我最初的计划是绘制实例,这需要更多的研究,这就是为什么我试图让粒子模拟首先运行。

我在调试这段代码时也遇到了麻烦,我用过

要检查缓冲区数据,它似乎总是我在 init 中设置的一个元素,没有改变。

着色器类

}

垂直着色器

几何着色器

也许我的隧道视野已经很强大了,但是我自己研究了很多 tuts、线程和示例,我没有弄错!我希望有人可以帮助我,问候!

0 投票
1 回答
302 浏览

c++ - 基于变换反馈的缓慢拾取?

我正在尝试使用转换反馈来实现拾取例程。目前它工作正常,但问题是速度非常低(慢于GL_SELECT)。

现在如何运作:

  1. 使用 with offset 绑定 TBO glBindBufferRange()(开头为 0)。
  2. glBufferSubData()使用(以确保拾取正确)重置内存(TF 变化结构的大小)。主要问题在这里。
  3. 使用几何着色器绘制对象,该着色器检查与拾取射线的交点。如果找到交集,着色器将其写入 TF 变化(最初它没有交集,请参见步骤 2)。
  4. 增加偏移量并使用下一个对象转到步骤 1。

所以,最后我有一个为每个对象挑选数据的数组。

问题是如何避免调用glBufferSubData()每次迭代?可能的解决方案(但我不知道如何实现它们)是:

  • 只写一个 TF 变化。所以没有必要重置其他
  • 用任何其他方式重置数据

有任何想法吗?