Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl glBindBuffer和直接状态访问?_Opengl_Opengl 4 - Fatal编程技术网

Opengl glBindBuffer和直接状态访问?

Opengl glBindBuffer和直接状态访问?,opengl,opengl-4,Opengl,Opengl 4,根据幻灯片23,以下情况属实: 非DSA:glGenBuffers+glBindBuffer DSA:glCreateBuffers 我试着写一个只有DSA的程序。使用gldrawArrayIndirect绘图时,我被迫使用glBindBuffer沿glCreateBuffers 下面是一段工作代码: glCreateBuffers(1, &bufObj); glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted cre

根据幻灯片23,以下情况属实:

非DSA:glGenBuffers+glBindBuffer

DSA:glCreateBuffers

我试着写一个只有DSA的程序。使用
gldrawArrayIndirect
绘图时,我被迫使用
glBindBuffer
沿
glCreateBuffers


下面是一段工作代码:

glCreateBuffers(1, &bufObj);

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted creates SEGFAULT crash

glNamedBufferData(bufObj, sizeof(mydrawcall), mydrawcall, GL_STATIC_DRAW);
...
glDrawArraysIndirect(GL_TRIANGLES, 0);

  • glBindBuffer
    是否为非DSA
  • 我是否缺少另一个较新的DSA功能,或者这是唯一的方法

直接状态访问的目的不是完全从应用程序中删除对象绑定(这将是各种“无绑定”扩展的目的)。直接状态访问的目的是允许您访问对象的状态,而无需绑定它(即:直接ly)

在DSA之前,您必须绑定缓冲区才能分配存储、上载数据等。使用DSA功能,您不必绑定缓冲区。将缓冲区直接传递给用于操纵其状态的函数

但要在渲染过程中实际使用缓冲区,您仍然必须将其绑定到上下文,或将其附加到某个自身将绑定到上下文的其他对象

要将缓冲区的存储用作,它必须绑定到具有
glBindBufferRange(GL\u UNIFORM\u buffer
(或等效调用)的上下文。若要使用缓冲区存储顶点数据,则必须将该VAO绑定到上下文。若要使用缓冲区,则必须使用
glBindBuffer
将缓冲区绑定到适当的位置,依此类推

使用缓冲区作为间接命令执行的源也是如此。这是一个渲染操作,因此在发出间接命令之前,缓冲区必须绑定到间接目标

但它只需要在您发出该命令时绑定。您不必在创建后立即绑定它。就在您实际调用
glDrawArraysIndirect

“If deleted creates SEGFAULT crash”之前,您从何处获得此崩溃?因为如果您在
glDrawArraysIndirect
中获得它,您就没事了。