// ok lets draw something with State 1
glEnable( STATE1 );
glEnable( STATE2 );
glEnable( STATE3 );
glDraw();
//... lot of stuff potentially happens here
// ok lets draw something with State 2 which differs from State 1 in STATE3
glDisable( STATE3 );
// that is pretty brittle right; I can't be sure of anything that happed beforehand
// so I better just doublecheck everything:
assert( glIsEnabled(STATE1) );
assert( glIsEnabled(STATE2) );
assert( glIsDisabled(STATE4) );
//...
assert( glIsDisabled(STATE69) );
glDraw();
//... lot of stuff potentially happens here
// Ok now I want to draw things again with State 1 again:
glEnable( STATE3 );
// But I don't even remember what state any previous work did set,
// so I might as well try to set everything just to be safe:
glEnable( STATE1 );
glEnable( STATE2 );
glDisable( STATE4 );
//...
glDisable( STATE69 );
// But Extensions can always add new state, so I am pretty much screwed
// and guaranteed bugs sooner or later because someone set STATE420_EXT and didn't clear it
glDraw();
2条答案
按热度按时间yizd12fk1#
OpenGL上下文表示:
1.用于为特定硬件发出单个渲染命令序列的接口。
1.将用于硬件上任何呈现操作的当前状态集。
1.一组对象,可供呈现操作使用,并具有与它们交互的能力。其中一些对象可与其它上下文共享。
Vulkan没有一个单一的东西来代表所有这些。没有“Vulkan上下文”。事实上,Vulkan示例并不代表以上任何一个。
你看,虽然OpenGL上下文定义了一个特定硬件的接口,但它并没有定义如何“创建”该上下文。外部API是用来创建上下文的。这些外部API“完全”依赖于平台。
Vulkan希望定义硬件接口并提供一个创建硬件接口的框架,该框架在一定程度上依赖于平台,但“仅”依赖于绝对必要的程度。
具体而言,处理Vulkan时唯一依赖于平台的部分是与操作系统提供的显示系统交互(即:窗口)。其他一切都与平台无关。
Vulkan示例是与可用硬件交互的接口。您可以使用Vulkan接口询问有哪些支持Vulkan的硬件可用,它们的功能和限制是什么,以及如何从该硬件创建Vulkan设备(并可选择将其连接到操作系统提供的显示系统)。
您机器上的单个Vulkan实现会向Vulkan示例系统注册自己,这允许示例实现与它们对话并向它们询问这些问题。
Vulkan最接近OpenGL上下文的是Vulkan逻辑设备(
VkDevice
)。这些设备是由一个或多个“物理设备”(代表实际的GPU)构建的,它们提供了与渲染系统交互的接口。但即使这样,也不能真正完成大多数OpenGL上下文的工作。命令缓冲区表示渲染命令的当前状态以及渲染命令本身。但是您可以有许多单独的命令缓冲区,并且它们不会立即执行。
命令缓冲区的执行是通过队列完成的,队列来自设备。队列是命令缓冲区的一个单独的执行路径。
Vulkan与OpenGL完全不同。你不应该试图将Vulkan结构Map到OpenGL结构上(除非它们的名称完全相同,如“纹理”或“着色器”或其他)。Vulkan是什么,而不是它看起来像OpenGL。
kgsdhlau2#
不,Vulkan使用了更主流的范例:面向对象编程。
Vulkan示例是一个对象,它可以被创建、销毁、封装其数据,并且具有方法。
glEnable
函数是OpenGL中上下文含义的一个范例。一旦你设置了一个状态,它将永远从该点开始应用,除非它被更改为其他内容(即下面的函数调用在前面函数调用的“上下文”中操作)。这会导致无尽的挫折:在Vulkan中以现代的面向对象的方式管理这一点很简单:
注意,这是C语言,所以object是第一个参数,而不是像在基于
class
的C++中那样在一个点之前。