最近我通过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];”发生了段错误吗?
答案 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
存储