问题标签 [compute-shader]
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.
c++ - “生成了 GL_INVALID_VALUE 错误。” 通过绑定一个统一块
我在将统一缓冲区对象绑定到多个着色器时遇到了一些问题。
以下代码的执行:
导致错误消息
着色器程序的类型是 QOpenGLShaderProgram。我在这些着色器程序中使用顶点、几何、片段和计算着色器。
的值为GL_MAX_{VERTEX, FRAGMENT, GEOMETRY}_UNIFORM_BLOCKS
14。index
除 4294967295 之外,每个程序的输出都是 0。
opengl - 在 CPU 的 SIMD 上运行计算着色器
使用 opencl 库和 intel 或 amd opencl cpu 驱动程序,可以在 cpu 和 gpu 的 simd 上运行代码,并提供非常好的性能。有没有办法在 cpu 的 simd 上运行计算着色器(GL 或 DX)?
c++ - 跨多个 gpu 同步原子计数器
atomic_uint
我在与动态绑定的计算着色器中使用原子计数器GL_ATOMIC_COUNTER_BUFFER
(与本opengl-atomic-counter 教程 lighthouse3d类似)。
我在粒子系统中使用原子计数器来检查所有粒子是否已达到条件;我希望看到counter==numParticles
所有粒子何时都在正确的位置。
我每帧都映射缓冲区并检查原子计数器是否计算了所有粒子:
在单个 GPU 主机上,代码工作正常并且particleCount
总是到达numParticles()
,但在多 GPU 主机上particleCount
永远不会到达numParticles()
。
我可以直观地检查条件是否已达到并且测试应该为真,但是particleCount 正在上下改变每一帧,但从未达到numParticles()。
GL_ATOMIC_COUNTER_BARRIER_BIT
在我取消映射之前,我已经尝试了一个 opengl 内存屏障particleCount
:
在增加计算着色器中的计数器之前,我尝试了一个 glsl 屏障:
但原子计数器似乎没有跨设备同步。
同步以便原子计数器与多个设备一起使用的正确方法是什么?
c++ - 如何测量计算着色器的时间性能?
我需要测量计算着色器的时间。但这当然不是微不足道的。从OpenGL Wiki -我得到的性能,在着色器调用之前和之后使用 glFinish() 很有用。但他们也说使用它不是很好。是否有可能测量我的着色器的时间?无论如何有可能测量计算着色器的时间吗?
我的代码看起来像这样:
我想我必须glFinish()
在位置插入并在 处(1)
启动计时器(2)
并在 处停止它(3)
。但我不确定它是否真的有效并且会产生正确的计时结果,因为在参考中他们正在谈论渲染并且计算着色器不是渲染,不是吗?
OpenGL Timer_Query也存在,但我不确定它是如何工作的,也不知道它是否对我有用。这些东西对我来说是新的,我不确定我现在是否完全理解它。
这里的答案说,几乎不可能精确测量代码的一部分。最好的方法是测量帧渲染时间,但我只需要计算着色器部分的帧渲染时间就可以了。
你认为最好的选择是什么?只是测量整个帧渲染时间并使用它?或者您是否使用其他测量方法获得了更好的体验?
opengl - 计算着色器中的图像原子加法
我有以下计算着色器:
这给了我这个错误:
0(12) : error C1317: qualified actual parameter #1 cannot be converted to less qualified parameter ("im")
根据OpenGL wiki,我找不到我做错了什么
opengl - 在计算着色器中写入 image2DArray
我有一个计算着色器,我想在其中写入 a 的不同层,GL_TEXTURE_2D_ARRAY
但imageStore
它不起作用。
这是我用来初始化纹理的代码:
计算着色器调用(在每一帧调用):
计算着色器:
计算着色器似乎没有做任何事情。但是,我可以在片段着色器中访问纹理的所有层。
unity3d - 使用着色器进行大量计算
网上几乎所有的教程,教授不同纹理或扭曲视图的着色器。但我想将它用于其他目的。在每一帧中,我有大约 1000 个对象,我想对它们中的每一个进行以下计算:
但问题是我不知道如何将它实现为着色器!我知道它应该在计算着色器中,但我找不到一个非常简单的例子。如果你告诉我如何对给定的输入数组进行这个简单的计算,那对我来说会很棒。
谢谢你。
android - 在 Android 5 (Open GL ES 3.1) 中使用计算着色器
我正在学习 OpenGL ES,特别是 OpenGL ES 3.1 中的计算着色器,特别是 Android 5.0.1 中的计算着色器。
我定义了 3 个着色器(计算、顶点和片段)并附加到两个不同的程序,一个用于计算着色器,一个用于顶点和片段着色器。
当我只使用顶点和片段着色器时我没有问题,但现在我添加了计算着色器,我收到以下错误:
我试图弄清楚我错过了什么,但我是这个话题的新手,我不确定从哪里开始寻找问题。
对象的构造函数是:
绘图功能:
作为参考,着色器在帖子的末尾。
笔记:
- 我在 Android 文档中找不到 GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT。它不应该在那里吗?文档中提到了它。
- 绘制调用使应用程序崩溃。直到 glDrawArrays() 之前一切似乎都很好。
任何关于寻找什么的想法都值得赞赏。
顶点着色器:
片段着色器:
计算着色器:
c# - 在 Unity 运行时更新着色器
我有一个具有漫反射着色器的对象,在运行时我希望着色器切换到漫反射始终可见,但这应该仅在该单元位于名为障碍物的图层中的特定对象后面时触发。
首先,我尝试使用以下代码切换对象着色器,并且在检查器中更改了着色器,但在游戏过程中没有更改。我尝试从资源中放置和调用着色器,还创建了单独的材质,但它不起作用。
这是我在 C# 中使用的代码
至于其余的,我正在考虑使用光线投射,但不知道如何处理。
提前致谢
unity3d - DirectCompute atomic counter
In a compute shader (with Unity) I have a raycast finding intersections with mesh triangles. At some point I would like to return how many intersections are found.
I can clearly see how many intersections there are by marking the pixels, however if I simply increment a global int for every intersection in the compute shader (and return via a buffer), the number I get back makes no sense. I assume this is because I'm creating a race condition.
I see that opengl has "atomic counters" : https://www.opengl.org/wiki/Atomic_Counter, which seem like what I need in this situation. I have had no luck finding such a feature in either the Unity nor the DirectCompute documentation. Is there a good way to do this?
I could create an appendBuffer, but it seems silly as I literally need to return just a single int.