通用计算
float inputData[] = { 0,1,2,3,4,5,6 };
int numElements = sizeof(inputData) / sizeof(float);
std::cout << "numElements:" << numElements << std::endl;
GLuint inBuffer;
glGenBuffers(1, &inBuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, inBuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * numElements, inputData, GL_STATIC_DRAW);
GLuint outBuffer;
glGenBuffers(1, &outBuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, outBuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * numElements, NULL, GL_STATIC_DRAW);
Glb::ComputeShader* mComputeParticals = new Glb::ComputeShader("ComputeParticals");
std::vector<std::string> computeShaderpaths = {
std::string("testcomputeShader_01.comp"),
};
mComputeParticals->BuildFromFiles(computeShaderpaths);
mComputeParticals->Use();
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, inBuffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, outBuffer);
mComputeParticals->SetFloat("x", 10);
for (int i = 0; i <= 1; i++)
{
mComputeParticals->SetFloat("pass", i);
glDispatchCompute(numElements, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT | GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
}
float* outputData = new float[numElements];
glBindBuffer(GL_SHADER_STORAGE_BUFFER, outBuffer);
glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(float) * numElements, outputData);
下面是的着色器代码
#version 430 core
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout(std430, binding = 0) buffer InputBuffer {
float inData[];
};
layout(std430, binding = 1) buffer OutputBuffer {
float outData[];
};
float a = 1;
uniform float x;
uniform float pass;
void main() {
uint index = gl_GlobalInvocationID.x;
if(pass==0)
{
if (index < inData.length())
{
inData[index] = inData[index]*x;
}
}
if(pass==1)
{
if (index < inData.length())
{
outData[index] = inData[index] * x;
}
}
}