Opengl 如何从计算着色器获取输出
我正在使用marching cubes算法和simplex noise开发一个程序生成的地形模拟器。我当前程序的问题是,它为每个顶点指定一个值,并一次生成一个三角形。在做了一些研究之后,我决定使用计算着色器(一个用于使用单纯形噪波为每个顶点指定值,另一个用于创建三角形网格)将显著提高性能。我有一个非常基本的想法,我希望着色器如何与我的程序交互,但我不知道如何制作它Opengl 如何从计算着色器获取输出,opengl,glsl,shader,compute-shader,Opengl,Glsl,Shader,Compute Shader,我正在使用marching cubes算法和simplex noise开发一个程序生成的地形模拟器。我当前程序的问题是,它为每个顶点指定一个值,并一次生成一个三角形。在做了一些研究之后,我决定使用计算着色器(一个用于使用单纯形噪波为每个顶点指定值,另一个用于创建三角形网格)将显著提高性能。我有一个非常基本的想法,我希望着色器如何与我的程序交互,但我不知道如何制作它 UseNoiseComputerShader()//获取ComputeShader的输出。 输出=噪声输出; UseMeshComp
UseNoiseComputerShader()//获取ComputeShader的输出。
输出=噪声输出;
UseMeshComputeShader(输出)//获取ComputeShader的输出。
float[]顶点=outputMesh;
//将顶点输出到VAO并绘制
我曾在网上看到一些人在类似的项目中使用计算着色器,但他们使用的是Unity和HLSL,所以我想知道是否可以使用OpenGL和GLSL。通常,计算着色器会写入or 图像可以通过图像读取和写入,并且:
layout(rgba32f,binding=1)只读统一图像2D img_输入;
布局(rgba32f,绑定=2)可写统一的图像2D img_输出;
void main()
{
ivec2坐标=ivec2(gl_globalinOccationId.xy);
vec4颜色=图像加载(img_输入,坐标);
图像存储(img_输出、坐标、颜色);
}
可以通过赋值或@Ethama将存储缓冲区对象写入着色器,在我的情况下,使用cs写入图像或SSBO会更好吗?@Ethama这取决于您的使用情况。但是我没有一个经验法则来决定何时使用其中一个。是否有某种方法可以将我的SSBO读入浮点数组?(编辑:我在LWJGL论坛上发现的这个问题与我的问题类似)作为一个非常通用的经验法则,如果您的数据是以规则的2D或3D网格组织的,并且可以用图像提供的数据格式表示(没有奇怪且昂贵的转换或编码技巧),并且您的访问模式也可以从二维或三维位置中获益(这在很大程度上取决于您如何将工作组织到工作组和调用中),您可以尝试使用图像。请注意,作为一个游戏引擎,OpenGL是由图形驱动程序提供的OpenGL API。在某些平台上,Unity可能会在后台使用OpenGL(ES)。