问题标签 [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++ - 计算着色器中的双精度函数
我想为double类型使用一些内置函数,如 acos() 。但似乎有些只是为了与float一起使用而存在。
在OpenGL Reference Card 4.3中,acos() 被声明为仅可用于浮点数,这里有人要求扩展以在 GLSL 中使用更多双精度函数。
是否有另一种可能访问计算着色器中的某些双精度函数?
directx - 在 DirectX 11 Compute Shader 中加载 Texture2D 数据
我正在尝试从 DirectX11 计算着色器中的 texture2d 读取一些数据,但是,即使纹理对象填充了相同的浮点数,texture2D 对象的“加载”函数仍然返回 0。
这是一个 160 * 120 的纹理 DXGI_FORMAT_R32G32B32A32_FLOAT。以下代码是我创建此资源的方式:
然后我尝试使用 X = Y = 2 和 Z = 1 运行调度,如下所示:
我编写了一个非常简单的 CS 着色器来尝试获取 texture2d 中的数据并将其输出。所以,计算着色器看起来像这样:
我认为我在 CPU 端打印 CS 着色器结果的方式是正确的。
绑定到 UAV 的缓冲区只有 4 个元素。所以,如果我的 texture2d 中的所有浮点数都是 0.7,我应该在 CopyToCPUBuffer 函数中打印 4 个 0.7s 而不是 0.0s。
有谁知道我的代码可能有什么问题,或者有人可以为我提供一个完整的示例或教程,说明如何在计算着色器中正确读取 DirectX 11 texture2d 的数据?
提前致谢。
android - 卡在 Android 5.1.1 (Opengl 3.1) 中的计算着色器
我编写了非常简单的程序来从计算着色器中获取值并将其直接渲染到屏幕上。
我怀疑在调用所有必要的计算着色器方法后着色器存储缓冲区没有绑定到我的 vbo。
我正在分享代码,请查看是否有错误。我没有得到任何编译错误,而且我使用的设备也支持我检查过的 gl 3.1。
除了所有这些,我们还必须在清单中提及任何内容吗?
这是我的渲染器代码
这是我的计算着色器(hellocompute)
这是我的顶点着色器
这是我的片段着色器
我应该在 x = 0.2、0.4、0.6、0.8、1.0 处看到一些黄点
但是在 x=0 处只看到一个点,因为它采用了属性 a_Position 的默认零值。
新值应在调度调用后绑定到 vbo 时反映出来。
opengl - OpenGL Compute Shaders 有时间限制吗?
我正在使用 OpenGL 计算着色器对数据进行一些计算。一切正常,只是运行一个着色器似乎不可能超过 10 秒。我用glBeginQuery(...)
和测量时间glEndQuery(...)
。着色器在 1 毫秒到 10 秒之间运行良好。我只是在没有任何着色器调用的情况下添加一些数据来增加着色器所需的时间。但是当着色器需要超过 10 秒时,我无法添加更多数据。然后,程序冻结,我不能再做任何事情了。我测得的最高值是 11.02 秒。
那么,计算着色器有时间边界吗?还是有什么明显的我做错了?
一些附加信息:我在一个装有 Nvidia GT 555M 的笔记本上工作。我使用 bumblebee 并启动 QtCreator 以optirun
使用 Nvidia 卡运行它。如果您需要更多信息来帮助我,请尽管询问。我只是不知道,需要什么来回答它。
unity3d - #pragma kernal Main 上的语法错误
我有以下着色器:
团结一致。但是,这会产生错误“着色器错误”:解析错误:第 1 行的语法错误//即 #pragma kernal Main
我环顾四周,但#pragma kernal [主函数名称] 似乎是正确的语法我做错了什么?
这是统一的 5.0.1 32 位版本
unity3d - 代码一侧的着色器编译错误
我有以下尝试将柏林噪声转换为 GPU
但是,这在第 57 行给了我一个错误(代码长 47 行)
有人知道那是什么意思吗?它甚至不在我的代码中,所以我不太知道在哪里看。
opengl - 在计算着色器中使用图像加载/存储比纹理采样器有什么优势?
我看不到图像加载/存储的任何优势。
我有相当复杂的计算着色器计算全局照明。我同样实现了这两种变体——基于纹理和基于图像。我看到使用图像时性能下降。
此外,不可能(可能仅在 AMD 上)在同一个着色器中读取和写入纹理。我不知道为什么这是不可能的,但是使用图像有什么好处呢?
我的图像加载/存储变体的着色器源:https ://gist.github.com/achlubek/c96a7f6f4271c5978ef2
c++ - 在计算着色器中使用两个 SSBO 时 imageStore 不写入
当我尝试在我的 ATI HD 5770 上运行它时,我注意到我的一个计算着色器出现错误。我发现当我在着色器中访问多个 SSB 时问题就开始了,尽管 GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 为 8。
经过一番摆弄后,我将有问题的着色器简化为这个 MWE:
当我按原样运行此着色器时,我看不到imageStore
. 删除时,我在图像中b.length();
得到所需的输出。-2
的值在这两种情况下a[0]
都更改为-2
,因此着色器肯定正在运行。
在这两种情况下,着色器都没有编译/链接器错误,glGetError
也不会返回错误。
我在这里做错了吗?
这是(驱动程序)错误吗?毕竟,这不会发生在我的其他 (NVidia) 卡上。
为了完整起见,我使用了这个“最小的”C++ 文件来运行着色器:
更新
似乎有一个类似的问题imageLoad
,它总是在使用超过 2 个 SSBO 时返回 0,在使用 2 个 SSBO 时返回 3,对于少于 2 个 SSBO 的正确值。即使在最新的驱动程序(15.7,之前是 15.5)上也会出现这两个问题。
directx - 计算着色器、缓冲区或纹理
我正在尝试使用计算着色器来实现流体动力学。在这篇文章中,由于这是在计算着色器之前编写的,因此对纹理进行了一系列处理。
对纹理或缓冲区进行每次传递会更快吗?无论如何,最终通道必须应用于纹理。
algorithm - 使用 Revelles 算法以动态统一的方式遍历八叉树 GLSL
我正在尝试使用带有实时光线行进的 revelles 算法在 GLSL(v450)中的计算着色器中遍历我的八叉树。我设法遍历它并获得了图像,但我的 fps 非常低,大约 0-5 fps。由于算法伪代码是递归的,因此我使用堆栈将其转换为循环(因为 GLSL 不允许递归)。问题是,一旦我使这个循环非动态统一,我就会得到大约 30-40 的巨大 fps 下降。
如果我在我的堆栈上使用shared属性,我可以得到这个 fps 备份,仅在全局变量的计算着色器中可用:
使其能够在我的工作组中的所有线程之间共享和使用。问题是我无法将这些与barrier()和/或memoryBarrierShared()函数同步,因为它们似乎需要循环动态统一(参见共享变量 www.opengl.org/wiki/Compute_Shader)。由于我无法同步,图像变得像素化并闪烁。
有没有办法将此算法转换为动态统一循环?当循环变得非动态均匀时,为什么fps会下降?
下面是我的主循环代码。