问题标签 [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.
voxel - 具有实例化对象的场景的体素化
我在directx11 中创建了一个简单的场景,它有一个平面作为地板,有几个球体、立方体和矩形墙。只加载了 3 个对象:平面、立方体和球体;但是立方体和球体被多次实例化,具有不同的缩放、位置和旋转。其中两个对象是动态的。
考虑到具有不同比例和旋转的对象实例,我想将整个场景(100x100x20 单位)体素化为 0.2 单位体素。
我已经阅读了几篇关于体素化的文章,并获得了来自 GPU Pro 3 的“Practical Binary Surface and Solid Voxelization with Direct3D 11”的源代码;但是所有这些文章都展示了单个对象的体素化——将它们的三角形分割成一个网格。
我将如何扩展这些方法以解决具有多个对象实例的整个场景?
我唯一能想到的就是我必须对整个场景进行自上而下的八叉树划分。但对于动态场景,这会不会太贵?
对于我的场景,我为每个加载的模型使用一个缓冲区,所以如果我要在计算着色器中进行体素化,我是否需要将所有三个缓冲区复制到一个缓冲区中?我如何考虑模型实例?
谢谢你。
c++ - 着色器中的 DirectX 着色器资源视图
我现在有点困惑,只是想请大家帮助我澄清一些想法。
在 HLSL 着色器(例如计算着色器)中,我可以声明一个 StructuredBuffer sb,对吗?我是否必须将其绑定到寄存器,例如:register(t0)?
从应用程序端,我可以调用 CSSetShaderResources(...)。第一个参数(StartSlot),它与寄存器声明中“t”后面的小数字有什么关系?
如果我将 StartSlot 设置为 0(例如),并将第二个参数设置为 2。我是否告诉 API 我将绑定两个着色器资源视图,一个在 register(t0) 中,另一个在 register(t1) 中?
如果我声明 Texture2D tex[10] : register(t0) 我可以通过调用 CSSetShaderResources(0, 10, ...) 来设置它。这是否意味着寄存器(t0~t9)都用完了?
抱歉,问题如此“迅速”,但我真的很困惑,我的一些测试似乎给出了令人困惑的结果......
任何帮助,将不胜感激。
directx-11 - 在directx 11中一次渲染到多个纹理
我正在尝试使用 C++ directx 11 SDK 一次性渲染两个纹理。我想要一个纹理包含结果图像的每个像素的颜色(我通常在渲染 3D 场景时在屏幕上看到的颜色),另一个纹理包含每个像素和深度的法线(3 个浮点表示正常,1 个浮点表示深度)。现在,我能想到的是创建两个渲染目标,并将第一遍渲染为颜色,第二遍将法线和深度分别传递给每个渲染目标。但是,这似乎是在浪费时间,因为我可以在第一遍中获得每个像素的颜色、法线和深度的信息。那么有没有办法用像素着色器以某种方式输出两个纹理?
任何帮助,将不胜感激。
PS我正在考虑像素着色器中的RWTexture2D或RWStructuredBuffer。一点背景知识:我需要这两个图像在计算着色器中进行进一步处理。这带来了同步的一个附带问题:由于像素着色器(与计算着色器不同)一次写入每个像素,我怎么知道像素着色器何时完成并告诉计算着色器开始图像后处理?
c++ - OpenGL 计算着色器调用
我有一个与新计算着色器相关的问题。我目前正在研究粒子系统。我将所有粒子存储在着色器存储缓冲区中,以便在计算着色器中访问它们。然后我派出一个一维工作组。
我的计算着色器:
但不知何故,并非所有粒子都受到影响。我正在以与此示例中相同的方式执行此操作,但它不起作用。http://education.siggraph.org/media/conference/S2012_Materials/ComputeShader_6pp.pdf
编辑:
在我调用 glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT) 之后,我继续这样:
那么在这种情况下哪个位适合使用?
gpgpu - GPU 上下文切换
我有一个程序,它首先渲染到纹理,然后将纹理传递给计算着色器进行处理,然后通过带纹理的全屏四边形将输出结果渲染到屏幕上。
我在 nVidia 的计算着色器编程指南中读到,每次调度计算着色器时,它都会启动 GPU 设备上下文切换,这不应该经常进行。
我现在很困惑。在我看来,在我的渲染管道中,GPU 两次切换上下文。对?在第一次调度呼叫期间,下一次我正常渲染全屏四边形时。
如果这是正确的,那么我可以通过像这样重新组织我的代码来避免一次切换。首先,渲染到纹理。其次,在计算着色器上进行处理。然后,在下一帧中,渲染结果,然后(仍然在下一帧)渲染纹理的所有更新,在计算着色器上进行处理......所以基本上每一帧的开始我都会渲染最后一帧的结果(第一帧将是一个例外)。那么只会有一个上下文切换,对吧?
但是GPU仍然需要在帧之间进行上下文切换,对吗?所以我的渲染管道的两个版本都有两个上下文切换。性能上不会有任何差异。我对么?
任何帮助,将不胜感激。
directx-11 - 辐照度体积与平铺延迟着色
我在 DirectX 11 中有一个渲染器,它在计算着色器上使用延迟着色和平铺光剔除。我可以以 30-35 FPS 的稳定帧速率运行 1024-2048 个点光源。然而,我没有全局照明。辐照度体积(在孤岛危机3中使用)是更好的解决方案吗?你能在场景中有 2000 个辐照量并有 30 FPS 吗?还是我应该坚持我目前的方法而忘记全局照明?
opengl - imageStore() 的问题(OpenGL 4.3)
我正在尝试将一些数据从计算着色器输出到纹理,但 imageStore() 似乎什么也没做。这是着色器:
应用程序代码在这里:
然后使用该纹理渲染全屏四边形,但目前它仅显示来自视频内存的一些随机旧数据。知道有什么问题吗?
编辑:
这就是我显示纹理的方式:
drawProgram 包括:
和:
片段着色器中最后注释的行产生此输出:渲染输出
顶点数组对象 (vao) 有一个带有 6 个 2D 顶点的缓冲区:
-1.0,-1.0
1.0,-1.0
1.0, 1.0
1.0, 1.0
-1.0, 1.0
-1.0,-1.0
hlsl - 从 RWTexture2D 加载在计算着色器中
我了解 HLSL 着色器模型 5.0 存在一个限制,即无法从非标量类型的 RWTexture2D 资源加载数据。也就是说,以下是非法的:
那么具体的解决方法是什么?我正在尝试在计算着色器中累积到 float4 缓冲区,如下所示:
directx - 使用计算着色器、多个交换链进行延迟着色?
再次嗨。我准备在我的 dx11 引擎中添加延迟着色,但我有一个架构问题。我正在考虑首先使用 MRT 渲染 gbuffer,将其传递给计算着色器,调度,然后输出结果。我的问题是,我应该创建两个交换链,一个用于渲染 gbuffer,一个 uav 用于将计算着色器渲染到后台缓冲区并呈现,还是有另一种方法可以做到这一点?我在这里要避免的是必须使用全屏四边形并在其上渲染 cs 的输出。开销太大。提前致谢。
opengl - 通过计算着色器在 OpenGL 中进行光线追踪
我正在尝试通过计算着色器在 OpenGL 中进行一些光线跟踪,但遇到了一个奇怪的问题。目前我只想显示一个没有任何阴影的球体。我的计算着色器为每个像素发射一条射线,如下所示:
当我运行应用程序时,我得到以下图像:
但是当我在 CPU 上运行相同的算法时,我得到了以下更有说服力的图像:
首先,我认为我没有分派足够多的工作组,因此不是每个像素都有自己的计算着色器调用,但事实并非如此。正如您在 GPU 渲染图像中看到的那样,中间有一个红色像素,这是由计算着色器中的最后一行引起的。这可以为每个其他像素再现。
我目前使用 1024x768 的分辨率,这就是我调度计算着色器的方式:
错误在哪里?浮点计算的准确性会不会有问题?