读取时GLSL原子计数器segfault
GLSL Atomic Counters segfault when reading
最近我通过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
指针。
相关文章:
- C++中带有List类的迭代器Segfault
- 循环在计数器中不起作用
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- python集合的C++等价物是什么.计数器
- Python 集合.计数器,如何避免重复查找
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- std::partition segfault issue
- OpenSSL: EC_POINT_set_compressed_coordinates_GFp segfault
- std::shared_ptr 自定义参考计数器
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 不正确的比较和交换计数器输出用于快速排序功能
- OpenSSL API,使用GCM(伽罗瓦计数器模式)进行AES加密
- C++ 在循环中添加计数器变量并再次初始化其值
- 检查nullptr是否100%保护内存布局不受segfault影响
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- 需要帮助才能在C++中创建类计数器
- 漂亮的计数器习语的错误或格式错误的静态订单惨败?
- 几乎总是自动和带计数器的循环
- 读取时GLSL原子计数器segfault