GLSL原子计数器在阅读时会出现段错误

时间:2013-11-28 15:56:07

标签: c++ glsl

最近我通过glMapBuffer读取原子计数器时出现了段错误。这是代码:

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];”发生了段错误吗?

1 个答案:

答案 0 :(得分:1)

这并不奇怪。

您是否理解在函数体中使用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的{​​{1}}返回值分配给声明变量的行的单独行来解决此问题。然后,当您调用此函数时,它将始终执行glMapBuffer (...)

但是,说实话,我认为你的glMapBuffer (...)指针没有理由需要甚至 想要 static存储