Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl 使用着色器进行计算_Glsl_Data Transfer_Shader - Fatal编程技术网

Glsl 使用着色器进行计算

Glsl 使用着色器进行计算,glsl,data-transfer,shader,Glsl,Data Transfer,Shader,是否可以使用着色器计算某些值,然后返回这些值以供进一步使用 例如,我将网格发送到GPU,并提供一些有关如何修改(更改顶点位置)的参数,然后取回生成的网格?我认为这是不可能的,因为我还没有看到任何从着色器到CPU的通信变量。我用的是GLSL,所以只有统一的,心房和不同的。我应该使用阿曲布他或制服,它们在渲染后仍然有效吗?我可以更改这些变量的值并在CPU中读取它们吗?GPU中有映射数据的方法,但这些方法会被更改并且有效吗 这就是我思考这个问题的方式,尽管可能还有其他方式,这对我来说是未知的。如果有人

是否可以使用着色器计算某些值,然后返回这些值以供进一步使用

例如,我将网格发送到GPU,并提供一些有关如何修改(更改顶点位置)的参数,然后取回生成的网格?我认为这是不可能的,因为我还没有看到任何从着色器到CPU的通信变量。我用的是GLSL,所以只有统一的,心房和不同的。我应该使用阿曲布他或制服,它们在渲染后仍然有效吗?我可以更改这些变量的值并在CPU中读取它们吗?GPU中有映射数据的方法,但这些方法会被更改并且有效吗

这就是我思考这个问题的方式,尽管可能还有其他方式,这对我来说是未知的。如果有人能向我解释这一点,我会很高兴,因为我刚刚读了一些关于GLSL的书,现在我想编写更复杂的着色器,我不想放弃目前不可能的方法


谢谢

我最好的猜测是将您发送到一个库,该库是为利用GPU实现行为模型而创建的。我认为,如果您可以在库中制定您的修改,您可以从它的抽象中获益


关于cpu和gpu之间来回传递的数据,我将让您浏览文档,我不确定这一点

这在使用Open CL、Microsoft Direct Compute(DirectX 11的一部分)或CUDA的现代图形卡上很容易实现。使用普通着色器语言(例如GLSL、HLSL)。作为Nvidia和ATI图形卡的前两款产品,cuda是Nvidia的独家产品


这些是专门用于计算图形卡上的内容的库。我不会使用普通的3D API来实现这一点,尽管有一些变通方法是可能的。

好问题!欢迎来到图形处理单元上的通用计算的新世界()

使用像素着色器可以执行您想要执行的操作。加载纹理(即:数据),应用着色器(执行所需计算),然后使用“渲染到纹理”(Render to texture)将结果数据从GPU传递到主内存(RAM)

有一些为此目的而创建的工具,最著名的是OpenCLCUDA。它们极大地帮助了GPGPU,使这种编程看起来几乎和CPU编程一样

它们不需要任何3D图形体验(尽管仍然是首选:)。您不需要对纹理进行处理,只需将数组加载到GPU内存中即可。处理算法是用C++的一个稍微修改过的版本编写的。
我建议从CUDA开始,因为它是最成熟的:

现在您可以使用OpenGL中的着色器缓冲区对象在着色器中写入可以在主机中读取的值。

正如testalino所写,CUDA是特定于nVidia的。当我运行Radeon时,我是否会遇到速度减慢的问题,或者甚至可能在Radeon上运行CUDA?OpenCL是否效果不佳,或者为什么不推荐它作为第一个使用?@Raven是的,CUDA完全是nVidia特有的。如果我选择CUDA+nVidia。既然你有ATI,你就必须选择OpenCL。据我所知,CUDA更成熟,工具更好,等等。就性能而言,我不认为有显著差异。@Raven,如果我已经使用Direct X,我会选择Direct Compute,如果我使用Open GL,我会选择Open CL。我决不会因为所述的原因而使用CUDA。您不能确保使用您的应用程序的每个人都有NVIDIA卡。谢谢您的意见。因为你说我讨厌那些我不能完全玩的physx游戏+我在学习openGL而不是CG或DirectX,我认为openCL将最适合我的需要。@Raven如果你有ATI,那么这是唯一的选择。