0%

OpenGL 4.0和DirectX 11提供了原子操作(atomic operation),为GPU上并行创建链表数据结构提供了便利。基于此算法的per-pixel link lists可以应用到order independent transparency,实现像素的程序化混合,实现顺序无关的半透明效果,避免了程序员在api层面对于略显无力的排序的折磨。

Per-Pixel Link List

PPLL的实现需要三个数据结构:头结点指针Buffer、链表Node Buffer、结点计数器。 - 头结点指针Buffer:每个像素位置又一个链表,所以叫per-pixel link lists,头指针Buffer的大小是framebuffer的大小,存储的是头结点在Node Buffer中的位置,初始化为一个空符号,比如-1; - 链表Node Buffer:存储所有结点数据,可以是任意数据,next字段是必需的,指向链表下一个结点;不需要初始化,只需要分配足够大小。 - 结点计数器:用于分配下一个Node Buffer位置来存储数据,使用原子操作累加。初始化为0。

阅读全文 »

设置生成目标的输出目录

1
2
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<CONFIG>)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<CONFIG>)

Note $<CONFIG>应该在VS下才起作用

阅读全文 »

背景

DirectX SDK自从Windows 8 SDK开始,是随着Windows SDK附带的,包含了各个历史版本的头文件、动态库和工具集,但是这些历史版本SDK的sample和辅助库D3DX9、D3DX10、D3DX11等就被丢弃了。

偶尔会遇到一些D3D的旧版本上古demo,可能就使用了一些旧版本的辅助函数,比如在看SSS效果的时候使用iryoku大佬的separable-sss,仅仅依赖Windows SDK附带的DX依赖是没法正确跑起来。

阅读全文 »

Quad with Bufferless rendering

如果没记错的话,最初应该是在OpenGL SuperBibile里面看到的无Buffer的渲染方式,把三角形顶点数据写在vertex shader代码里,在shader里通过index取相应的数据,当时感觉平平无奇。后来在SaschaWillems的Vulkan example里看到更精简的写法,当时表示惊呆了,使用gl_VertexIndex来构造顶点数据,画一个覆盖屏幕的quad。下面就是Vulkan example的实现。其中vkCmdDrawIndexed对应gl_VertexIndex, vkCmdDraw对应gl_VertexID;我是在GL环境下,则是glDrawElements对应gl_VertexIndex, glDrawArrays对应gl_VertexID

1
2
3
4
5
6
7
8
9
#version 450

layout (location = 0) out vec2 outUV;

void main()
{
outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f);
}
阅读全文 »

Vulkan枚举值的字符串化

Vulkan中的枚举值做了很好的枚举类型管理,尽管还是是C类型的枚举,具有全局符号可见行;再尽管不似C++ enum class有严格的命名空间访问机制,但是仍然具备相应的枚举类型作为命名空间管理和访问。这为Vulkan枚举值的字符串转换提供了方便,可能这也是为何VulkanSDK给出了官方实现vk_enum_string_helper.h的原因。

VkImageType为例,

阅读全文 »

MeshLab调试时加载的dll版本不对

MeshLab 2023.12下载安装的2023.12版本,我在本地clone了一份源码编译,发现在C:\Users\Administrator\AppData\Roaming\VCG\MeshLab_64bit_fp\MeshLabExtraPlugins\2023.12位置存放了一套插件的dll文件,也就是这一套dll文件影响了源码的调试,也即调试时加载的这个目录下的dll文件,不是生成路径下的dll文件。

根据调用栈加载dll的路径就是这个路径:

阅读全文 »
×