现代C++神器之variant

看过这两年的Cppcon都应该对variant印象深刻。这个东东不算新,2002年就有了boost::variant

说到variant就得提enumunionunion对非C系编程者可能有点陌生。按照当代角度,enum和union很大一部分作用在于缩减定义域。举例如下:

//choose one implementation below
enum OneTwoTree { ONE, TWO, TREE };
//
union OneTwoTree {
  int ONE;
  int TWO;
  int TREE;
};
//
void foo(OneTwoTree ott);

这里用OneTwoTree限制了相关领域的类型范围,比如说调用foo(4)时编译器就会报错。 Continue reading 现代C++神器之variant

现代C++神器之comma operator

comma operator也就是逗号。常见的用法不过是以下几种:

int a = 1, b = 2, c = 3;
foo(a, b);
tuple<int, float> t{1, 2.f};

这能有什么独特技巧?接着探索:

int a = 1;
int b = 2;
int c = a, d;
int e = (a, b);

第三行已经有点模糊,展开会比较清晰:

int c = a;
int d;

重点来了,第四行会发生什么? Continue reading 现代C++神器之comma operator

现代C++神器之literals

Modern C++有很多理念极具启发性。我个人很欣赏std::chrono::duration的设计,比如说它的构造方式:

milliseconds t1(15);
hours t2 = hours(2);
auto t3 = hours(10);
milliseconds t4(minutes(2));
milliseconds t5 = hours(1);

上面几种都是普通的初始化,后两个会转换不同格式的数据。但是呢:

minutes t6 = 14min;
hours t7 = 2h;

这又是什么?为什么编译通过?那两个后缀竟然合法?不仅如此:

auto t8 = 12s;
milliseconds t9 = 3min;

这两个也是合法的。 Continue reading 现代C++神器之literals

Vulkan大闷锅之Pipeline

吸取了前几代Api设计的教训,Vulkan采用了Monolith结构的PSO(Pipeline State Objects),是不是有当年Linux内核的既視感。这段时间疯狂发展的微服务,不知道在未来会不会也走回头路。

敢说Monolith,当然是包含的巨量的状态信息:

  • Dynamic State
  • Vertex Input State
  • Input Assembly State
  • Rasterization State
  • Color Blend State
  • Viewport State
  • Depth Stencil State
  • Multisample State

Continue reading Vulkan大闷锅之Pipeline

Vulkan大闷锅之着色器

着色器(Shader)这个概念应该很熟悉。Vulkan采用用一种低层的着色器语言——SPIRV。通常我们还是先写出GLSL,再编译成SPIRV,官方的源码包已经提供了多种编译工具。

编译出的字节码首先会传递给Shader Module。但在创建Shader Module之前,先演示一下如何编译。 Continue reading Vulkan大闷锅之着色器

Vulkan大闷锅之RenderPass

Render Pass(渲染通道?),提供渲染过程所需的信息。手动配置一堆静态数据(减少动态开销?)。Render Pass由一系列Subpass聚合而成,每个Subpass携带特定的Attachment——笼统地分为Color Attachment或Depth Attachment。这些信息将决定后续Buffer中的数据如何被对待。 Continue reading Vulkan大闷锅之RenderPass

Vulkan大闷锅之Descriptor

上一章,我们创建了Uniform Buffer,不过着色器并不能直接访问它。这时我们需要一个Descriptor,类似于不透明的句柄。试想,是否可以绑定多个Buffer给分别的Descriptor。Vulkan已经提供了相当的机制Descriptor Set。这里也可以创建多个Set为不同的用途,比如Uniform和Texture。

Continue reading Vulkan大闷锅之Descriptor

Vulkan大闷锅之Swapchain

简述

当前的图形渲染过程并不是画好每帧画面,就立即输出,而是一个Swapchain结构,其主要目的是解决画面撕裂。现在会有多张画面缓存在Swapchan,然后依次输出最上层的一张,每一次的输出操作被称为Present。每个Present动作会将当前帧输出到Surface(上一章已经创建好)。

游戏视效设置中的多重缓冲选项,本质就是在调整Swapchain队列尺寸。
Continue reading Vulkan大闷锅之Swapchain

Vulkan大闷锅之核心机制

到此,队列(Queue)的信息已经准备好,但这里仍需验证物理设备和GUI组建。

创建Surface

这里可选的组建非常多,以下只演示XCB的创建方式。你可能需要一个宏定义:

#define VK_USE_PLATFORM_XCB_KHR

以下是XCB Surface的信息结构:

typedef struct VkXcbSurfaceCreateInfoKHR {
    VkStructureType               sType;
    const void*                   pNext;
    VkXcbSurfaceCreateFlagsKHR    flags;
    xcb_connection_t*             connection;
    xcb_window_t                  window;
} VkXcbSurfaceCreateInfoKHR;

Continue reading Vulkan大闷锅之核心机制

Vulkan大闷锅之启程

事出有因

现在回想起来,那已经是几周前的事了。这是个干燥的上午,我正迷失在信息流中,角落的一行文字引起了注意,“OpenGL已经过时了”。过时了?不等我收拾心神,赶紧Google。霎时间,屏幕上迸出几个大字——V-u-l-k-a-n

Vulkan?干什么用的?能吃么?

就在那时,空气中弥漫着对无知的恐惧。吓得我赶紧学习了一下。

简述

Vulkan算是后继OpenGL的图形接口(不过Vulkan正式发布后,OpenGL居然还更新了…)。为保证准确性,本系列文不打算延伸,其核心的目标是,让程序跑起来。由于Vulkan诞生时间尚短,而且热度不高,仅凭网上几篇文档,让程序正常运行真的是有点难度。

本系列文是一个教程,而是一个参考。如果你和之前的我一样,花了大量时间,结果程序都跑不起来先。那么,欢迎阅读以下内容。 Continue reading Vulkan大闷锅之启程