gpt4 book ai didi

c++ - 只有第一个计算着色器数组元素出现更新

转载 作者:行者123 更新时间:2023-11-30 05:33:53 25 4
gpt4 key购买 nike

尝试将一个整数数组发送到计算着色器,为每个整数设置一个任意值,然后在 CPU/主机上读回。问题是只有数组的第一个元素得到更新。我的数组在 CPU 中用所有元素 = 5 初始化,然后我尝试在计算着色器中将所有值设置为 2:

C++代码:

   this->numOfElements = std::vector<int> numOfElements; //num of elements for each voxel

//Set the reset grid program as current program
glUseProgram(this->resetGridProgHandle);

//Binds and fill the buffer
glBindBuffer(GL_SHADER_STORAGE_BUFFER, this->counterBufferHandle);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(int) * numOfVoxels, this->numOfElements.data(), GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, this->counterBufferHandle);

//Flag used in the buffer map function
GLint bufMask = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT;

//calc maximum size for workgroups
//glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_SIZE, &result);

//Executes the compute shader
glDispatchCompute(32, 1, 1); //
glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT);

//Gets a pointer to the returned data
int* returnArray = (int *)glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_WRITE);

//Free the buffer mapping
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

着色器:

#version 430
layout (local_size_x = 32) in;
layout(binding = 0) buffer SSBO{
int counter[];
};

void main(){
counter[gl_WorkGroupID.x * gl_WorkGroupSize.x + gl_LocalInvocationID.x] = 2;
}

如果我打印 returnArray[0],它是 2(正确),但是任何大于 0 的索引都会给我 5,这是在主机中初始化的初始值。

最佳答案

glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT);

//Gets a pointer to the returned data
int* returnArray = (int *)glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_WRITE);

您用于 glMemoryBarrier 的位表示您希望读取着色器写入的数据的方式。 GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 表示“我将通过使用顶点属性数组的缓冲区来读取这些写入的数据”。实际上,您将通过映射来读取缓冲区。

所以你应该使用正确的屏障位:

glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);

关于c++ - 只有第一个计算着色器数组元素出现更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34538281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com