问题标签 [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.
opengl - 从 OpenGL 计算着色器获取动态数据的最佳方式是什么?
目前我正在编写一个计算着色器,它实现了行进立方体。但是我仍然在努力解决一些关于如何从计算着色器中获取三角形信息或其他一些动态数据的问题。
在我看来有两种方法:
- 创建一个足够大的SSBO(我认为,现在也可以创建一个具有动态大小的,但我不确定)并在着色器中使用原子计数器将我的数据写入缓冲区。但我认为,由于原子计数器,这是非常低效的。
- 分几个步骤做行进立方体的东西。首先,获取案例并将三角形的数量保存在纹理或其他缓冲区中。然后。使用前缀 sum 来获取三角形的数量。根据该总和创建一个缓冲区,并让每个着色器将其三角形信息写入缓冲区。
我知道这两种方式没有详细描述,但是理解思路应该足够了。我现在的问题是:还有其他很好的可能性可以从计算着色器中获取信息,我不知道吗?
c++ - DirectX 11 - 计算着色器:写入输出资源
我刚刚开始使用 DirectX 11 中的计算着色器阶段,在写入计算着色器中的输出资源时遇到了一些不需要的行为。我似乎只得到零作为输出,据我了解,这意味着在计算着色器中执行了越界读取。(越界写入导致无操作)
创建计算着色器组件
输入资源
ID3D11Buffer*
首先,我为输入数据创建一个。在创建用于输入到计算着色器阶段的 SRV 时,这将作为资源传递。如果输入数据永远不会改变,那么我们可以在创建 SRV 后释放ID3D11Buffer*
对象,因为 SRV 将充当资源的句柄。
但是,我想更新每一帧的输入数据,所以我只是保留缓冲区供我使用以进行映射。
使用新创建的缓冲区作为资源创建 SRV
输出资源
现在我需要为 Compute 着色器创建一个要写入的资源。我还将创建要读取的缓冲区的系统内存版本。我将使用ID3D11DeviceContext::CopyResource 方法将数据从连接到无人机的计算着色器输出缓冲区复制到系统内存版本以执行映射并将其内容保存回系统内存。
创建计算着色器可以写入的读写缓冲区
创建缓冲区的系统内存版本以从中读取结果
为计算着色器创建 UAV 以写入结果
执行计算着色器(每帧)
C++
HLSL
我很抱歉这个问题的内容量很大。我已经仔细构建了它,因此您可能会发现它更容易获得概述。
传递给着色器的元素数量为 32。
对我的问题有什么建议吗?谢谢!
opengl - 带有图像加载/存储的 GL_ARB_SPARSE_TEXTURE
截至撰写本文时,我在 Win8.1 最新的 NV 驱动程序上使用 OpenGL 4.4 的稀疏纹理。一切似乎都可以正常复制到已提交区域中。但是,当我尝试对稀疏纹理(具有混合的已提交/未提交区域)进行着色器 imageLoad/imageStore 操作时,纹理会到处乱七八糟(值看起来很混乱或像随机内存内容)。
扩展规范 ( https://www.opengl.org/registry/specs/ARB/sparse_texture.txt ) 声明所有着色器和客户端读取到未提交区域的内容都未定义并且写入被丢弃。但是,我在任何地方都找不到任何明确提及 imageLoad imageStore 的内容。它确实提到了 FBO 附件(我想避免,因为我正在使用计算着色器)。
关于图像加载/存储,稀疏纹理的正确行为是什么?
c++ - 在 OpenGL 驱动程序中调用 QOpenGLShaderProgram::link() 时出现分段错误?
目前,我正在尝试实现一个计算着色器。为此,我使用了一个模板,它使用 Qt 来处理 OpenGL 的东西。要创建计算着色器,使用此函数,它适用于其他一些计算着色器:
正如我所说,这适用于所有其他计算着色器。呼叫线路时出现问题
我没有在着色器中更改导致错误的大东西。我刚刚添加了一个基本的 naiv 邻居搜索。为了弄清楚,当错误发生时,我尝试注释掉一些行,看看它现在是否正在编译。从中,我得到了由于//relevant line
以下着色器函数中标有的两行而发生错误的信息:
我希望在简化此着色器的同时,我没有删除对此至关重要的东西。我用地址清理器编译它,它的输出是:
有谁知道为什么会出现这个问题以及如何解决它?我真的不知道现在该怎么办。
系统信息:
- 64 位 OpenSuse 13.1
- 英伟达 GT 555M
- 直接运行程序
optirun qtcreator
Valgrind 输出:
的输出在这里optirun valgrind -v ./projectname
在线
glslangValidator 输出:
快速解决:
i = i+1-1;
在相关行之前添加该行可以解决错误。
visual-studio-2013 - MSVS2013:使用 FXC 编译 HLSL 文件。这个的SM4 hcs输出什么时候会比SM5 hcs好?
不幸的是,我不能在这里分享代码(专有),但我的问题是:我有一个 HLSL(它是 Groestl 哈希函数的 gpu 实现)文件,可以在 SM4 和 SM5 中通过 FXC 进行编译。在我的 GPU(AMD Radeon 7800 HD 系列)上,使用 SM4 hcs 可获得 3.6 MH/s,使用 SM5 hcs 可获得 6.6 MH/s。
相同的代码,SM4 与 SM5 相比,性能显着提高。在编译 SM5 时是否存在已知的 fxc 是“愚蠢”的情况/是否有已知的方法可以诱骗它变得不愚蠢?
...或者也许我在吠叫错误的树,也许这可能是我的 GPU 独有的东西?我将如何检查这个?
c++ - 虽然计算着色器中的循环使我的视频卡驱动程序崩溃
我正在尝试使用 HLSL 在计算着色器中实现二进制搜索。它不是经典的二分搜索,因为搜索键和数组值都是float
. 如果没有与搜索键匹配的数组值,则搜索应该返回最后一个索引(minIdx
并且maxIdx
此时匹配)。这是经典二进制搜索的最坏情况,因为它需要最大数量的操作,我知道这一点。
所以这是我的问题:
我的实现如下所示:
这导致我的视频驱动程序在程序执行时崩溃。我没有收到编译错误。
但是,如果我使用 anif
而不是while
我可以执行它并且第一次迭代按预期工作。
我已经进行了几次搜索,我怀疑这可能与计算着色器中的动态循环有关。但我之前没有使用计算着色器的经验,也没有使用 HLSL 的经验,这就是为什么我感到有些失落。
我正在用cs_5_0
.
谁能解释我做错了什么或至少提示我一些文档/解释?任何能让我开始解决和理解这个问题的东西都会非常感激!
sharpdx - DX 11 Compute Shader\SharpDX Deferrerd Tiled lighting,Point light 问题
我刚刚将我的引擎从 XNA 移植到 SharpDX(DX11)。
一切都很顺利,我已经克服了大部分问题而无需寻求帮助,直到现在我真的被困住了,也许我只需要另一双眼睛来查看我的代码 idk,但它就在这里。
我正在实现基于 tile 的照明(目前仅点光源),我的代码基于 Intel 示例,因为它不像 ATI 那样混乱。
所以我的问题是灯光随着相机移动,我到处寻找解决方法,我已经尝试了所有方法(我疯了吗?)。
我只是确保我所有的法线和光向量都在视图空间中并归一化(仍然相同)。
我已经尝试过反向视图、反向投影、两者的混合以及来自网络的其他一些位,但我无法修复它。
所以这是我的CPU代码:
这是我的 CS 着色器代码:
所以我知道剔除是有效的,因为有灯光,它们只是随着相机移动。
会不会是惯用手的问题?
我是否正确设置了 CPU 指示灯代码?
我把空间弄乱了吗?
我错过了什么?
我从深度重建我的位置错了吗?(不要认为这是因为剔除有效)
附言。我这样写出深度:
opengl - 带字节的着色器存储缓冲区对象
我正在开发一个计算着色器,其中输出被写入SSBO。现在,这个缓冲区的使用者是 CUDA,它希望它包含无符号字节。我目前无法找到如何在 SSBO 中为每个索引写入一个字节的方法. 使用纹理或图像,标准化浮点到无符号字节的转换由 OpenGL 处理。例如,我可以附加内部格式为 R8 的纹理并为每个条目存储字节。但是使用 SSBO 是不可能的。这是否意味着除了 bool数据类型 SSBO 中的所有数字存储类型只能是每个条目至少 4 个字节?
实际上,我希望能够做到以下几点:
计算着色器:
gpgpu - DirectX 11 Compute Shader 设备同步?
背景:在 GPGPU 平台上执行基准测试/比较。
问题:调度 DirectX 11 计算着色器时的设备同步。
寻找相当于cudaDeviceSynchronize()的clFinish(...)来公平比较我的算法的执行方式。
CUDA 和 OpenCL 函数在阻塞/非阻塞问题上更加清晰。然而,DirectCompute 与图形管道(我正在学习并且非常不熟悉)更相关,因此我很难确定 Dispatch 调用是否阻塞或之前的内存分配/传输是否已完成。
代码 DX_1:
代码 DX_2:
结果(2^2 到 2^11 个元素的平均时间):
注意:这些时间是在连接屏幕的桌面 GPU 上运行的,预计会有一些不稳定的时间。时间不应该包括主机到设备的缓冲区传输。
注意 2:这些是非常短的序列(4 - 2048 个元素),有趣的测试是针对最多 2^26 个元素的问题大小进行的。
c - SSBO 是更大的 UBO?
我目前正在使用 UBO 在 OpenGL 4.3 中进行渲染,以将我所有的常量数据存储在 GPU 上。(诸如材料描述、矩阵等之类的东西)。它可以工作,但是 UBO 的小尺寸(在我的实现中为 64kB)迫使我多次切换缓冲区减慢渲染速度,我正在寻找类似的方法来存储几 MB。
经过一番研究,我发现 SSBO 完全允许这样做,但也有不需要的“功能”:它们可以从着色器中写入,并且可能读取速度较慢。
是否有比 SSBO 更好的解决方案来向着色器提供大块数据?我觉得我遗漏了一些东西,为什么 UBO 应该限制在几 kB 而存在能够处理更多数据的更灵活的解决方案?如果着色器存储缓冲区是我正在寻找的,有没有办法确保它们不被着色器修改?