读取时GLSL原子计数器segfault

GLSL Atomic Counters segfault when reading

本文关键字:计数器 segfault GLSL 读取      更新时间:2023-10-16

最近我通过glMapBuffer读取原子计数器时遇到了segfault。这是代码:

GLuint atomicCounter[2];
inline void getAtomicCounters()
{
    glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, ATOMIC_COUNTER_INDEX, acBuffer);
    CHECK_FOR_GL_ERRORS();
    static GLuint* data = (GLuint*)glMapBuffer(GL_ATOMIC_COUNTER_BUFFER, GL_READ_ONLY);
    CHECK_FOR_GL_ERRORS();
    atomicCounter[0] = data[0];
    atomicCounter[1] = data[1];
    glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
    CHECK_FOR_GL_ERRORS();
}

问题似乎是数据是一个静态指针。当我删除static关键字时,一切都很完美。我知道我不需要静态指针,这只是一个测试,我很惊讶它不能用静态指针工作。有人知道为什么在"atomicCounter[0]=data[0];"处出现segfault吗?

这一点都不奇怪。

您了解函数体中用static限定符声明的变量在C++中是如何工作的吗?函数(getAtomicCounters (...))第一次运行时,它将使用该值进行初始化,但每次后续执行都将跳过初始化:

 static GLuint* data =
   (GLuint*)glMapBuffer(GL_ATOMIC_COUNTER_BUFFER, GL_READ_ONLY);
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 //This is only evaluated the first time you call this function!

因此,每个后续调用都将使用您第一次初始化的data的值。房间里的大象是,当您进行以下调用时,data的值变得无效:glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);

您可以简单地通过在声明变量的行之外的另一行上为data分配glMapBuffer (...)的返回值来解决此问题。然后,当您调用此函数时,它将始终执行glMapBuffer (...)

但是,老实说,我看不出你为什么需要甚至想要static存储来存储data指针。