c++ - GLSL 错误 : Undefined layout buffer variable in compute shader, 虽然已定义

标签 c++ glsl glfw compute-shader

我正在尝试制作一个简单的计算着色器,使用着色器存储缓冲区 (SSBO) 将数据传递给着色器。我正在使用 GLFW3 和 GLEW 使用 C++ 进行编码。我将整数数组传递给 SSBO,将其绑定(bind)到索引 0,并期望从 layout buffer 变量中检索着色器中的数据(如各种网站上所述)。但是,尽管已明确声明,但我在有关此布局缓冲区变量的着色器编译中遇到意外的“ undefined variable ”错误。 这是计算着色器的 GLSL 代码(此脚本仅在开头):

#version 430

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout (std430, binding = 0) buffer params
{
    ivec3 dims;
};


int index(ivec3 coords){
    ivec3 dims = params.dims;
    return coords.x + dims.y * coords.y + dims.x * dims.y * coords.z;
}

void main() {
    ivec3 coords = ivec3(gl_GlobalInvocationID);

    int i = index(coords);
}

我收到错误:0(12):错误 C1503: undefined variable “params”

这是设置和运行计算着色器的 C++ 脚本:

int dimensions[] {width, height, depth};

GLuint paramSSBO;
glGenBuffers(1, &paramSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, paramSSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(dimensions), &dimensions, GL_STREAM_READ);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, paramSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

GLuint computeShaderID;
GLuint csProgramID;

char* computeSource;

loadShaderSource(computeSource, "compute.glsl");
computeShaderID = glCreateShader(GL_COMPUTE_SHADER);
compileShader(computeShaderID, computeSource);

delete[] computeSource;

csProgramID = glCreateProgram();
glAttachShader(csProgramID, computeShaderID);
glLinkProgram(csProgramID);
glDeleteShader(computeShaderID);

glUseProgram(csProgramID);
glDispatchCompute(width, height, depth);
glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
glUseProgram(0);

glDeleteBuffers(1, &paramSSBO);

widthheightdepth 是程序前面定义的int 变量。我将 dimensions 数组绑定(bind)到索引 0,我希望在着色器的 ivec3 params.dims 变量中检索它。然而,params 变量在 index() 函数中使用时被认为是未定义的。

这个脚本只是一个开始,我想添加第二个缓冲区,着色器将实际写入其结果,但我被困在这里。澄清一下:在完整的脚本中,我不希望在任何纹理中写入(如所有在线示例所示),而是将结果写入第二个缓冲区中,我将从中将数据返回到 C++ 数组中以供进一步使用。

最佳答案

params 不是变量。它也不是结构或类。这是 name of an interface block .接口(interface) block 的名称实际上并不是 GLSL 本身的一部分;它是 OpenGL 的一部分。它是 OpenGL API 用来表示该特定 block 的名称。

从不在着色器文本本身中使用接口(interface) block 的名称,而不是定义它。

除非你给你的接口(interface) block 一个实例名称,否则该 block 中所有变量的名称本质上都是全局命名空间的一部分。事实上,限定这些名称的范围是为 block 提供实例名称的全部要点。

因此访问接口(interface) block 中的 dims 字段的正确方法是“dims”。

关于c++ - GLSL 错误 : Undefined layout buffer variable in compute shader, 虽然已定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63221607/

相关文章:

c++ - 使用 glUniformMatrix4fv() 用新矩阵更新旧矩阵?

c++ - 在 Mac OS X 10.9 中使用 GLFW 创建 OpenGL 3.3 上下文

c++ - 生成缓冲区时出现 OpenGL 段错误

c++ - BOOST::thread 删除可连接线程有什么问题?

c++ - C++ 中的保存形式(对于普通人来说易于阅读和修改)

c++ - 程序跳过最后一个 if 循环 c++

c++ - 如何在 OpenGl 中计算三角形网格的顶点法线?

c++ - 错误 : ‘sc_unit’ was not declared in this scope (SystemC-2. 3.0)

c++ - opengl:基于着色器的渲染到帧缓冲区,然后是固定管道渲染

javascript - ? 1.0 : 0. 0 - 这是什么意思?