OpenGL计算着色器无法更新共享缓冲区粒子顶点数据问题求助
问题根源
你的代码存在两个核心错误导致计算着色器未正常执行:
- 计算着色器未被附着到着色器程序:Shader类的构造逻辑中,仅完成了计算着色器的编译,没有调用
glAttachShader将其附着到最终的着色器程序上,链接阶段完全没有包含计算着色器逻辑,自然不会执行粒子更新。 - OpenGL上下文版本过低:GLFW初始化时指定的OpenGL 3.3版本不支持计算着色器,计算着色器是OpenGL 4.3才加入的核心特性。
修复步骤
- 修正Shader类的计算着色器附着逻辑,在编译完成后将其附着到程序:
// 原Shader构造函数内的计算着色器处理逻辑 if(computePath != ""){ std::string computeCode = loadSourceCode(computePath); compute = compileShaderCode("COMPUTE", computeCode); glAttachShader(ID, compute); // 新增这行代码 }
注意:这行代码必须放在glLinkProgram(ID)调用之前
- 修改GLFW初始化的OpenGL版本配置,改为4.3:
// 替换原来的3.3版本配置 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
可选优化
你当前的粒子位置每帧累加0.01,很快会超出OpenGL裁剪空间的[-1,1]范围导致粒子消失,可在计算着色器中添加边界回绕逻辑:
// 计算着色器main函数内修改 particles[i].pos += vec2(0.01, 0.0); if(particles[i].pos.x > 1.0) particles[i].pos.x = -1.0;
内容的提问来源于stack exchange,提问作者Frank Weslien
相关产品推荐
相关产品推荐

