- 博客(435)
- 资源 (22)
- 收藏
- 关注
原创 C++ 在项目中使用Linux命令
Linux 命令是由shell解析并转发给操作系统执行的,所有的shell都是从 Bourne shell(/bin/sh)派生的,Bourne shell是贝尔实验室为早期版本的Unix开发的标准shell。每个Unix系统都需要一个版本的Bourne shell才能正常工作。现在的Linux使用Bourne shell的增强版本,称为bash。bash shell是大多数Linux发行版上的默认shell。
2024-09-11 12:18:32 176
原创 C++ STL search 用法
给定序列A和B, 该算法用于在A中查找B第一次出现的位置,一般B为A的子序列,通常用于查找B在A中出现的位置。
2024-09-03 06:41:19 245
原创 CUDA编程08 - 并行编程思维
到目前为止,我们集中于学习并行编程的实用知识,包括CUDA编程接口特性、GPU架构、性能优化技术、并行模式和应用案例研究。在本章中,我们将讨论更为抽象的概念。我们将并行编程概括为一种思维过程,即设计或选择并行算法,并将一个实际问题分解基本的工作单元,这些工作单元可以由所选的算法高效地执行。具备强大思维技能的程序员不仅会分析问题,还会转变实际问题的结构:哪些部分本质上是串行的,哪些部分适合并行执行,以及将前者的部分转移到后者所涉及的一些权衡。
2024-09-02 23:14:47 1173
原创 驱动开发系列17 - PCI总线
PCI(外设计算机互连)或PCIe总线是现代计算机的主要组成部分,了解它的工作原理对于理解许多Linux设备驱动程序非常重要。关于PCI总线本身有很多好的信息(在维基百科和其他地方),而Linux内核中也有关于PCI处理子系统实际实现的文档。然而,这两种现有来源之间存在一个空白,本文希望填补这个空白。虽然我在这里的重点是理解x86环境下的PCI/PCIe,但这些内容对其他操作系统和非x86硬件也应该是相关的。因为这是对PCI的概述,而不是教科书,所以这里有许多简化和省略。
2024-09-01 20:22:47 428
原创 驱动开发系列16 - Linux Graphics DRM和KMS内核模块介绍
直接渲染管理器”(DRM)和“内核模式设置”(KMS)API 是 Linux 图形系统的重要组成部分。然而,关于它们具体是什么的文档非常难以找到——而谷歌搜索到的大部分内容都是完全过时的。看起来在这个领域工作的人们太忙了,无法进行文档编写。这篇文章提供了关于 DRM 内核模块内部实现细节的更详细信息。
2024-09-01 14:50:46 404
原创 渲染引擎实践 - UnrealEngine引擎中启用 Vulkan 和使用 Renderdoc 抓帧
1. 到 .\Engine\UE_5.2\Engine\Binaries\Win64 目录下(以Windows平台为例),找到UnrealEditor, 并创建桌面快捷方式。1. 先打开RenderDoc, 在RenderDoc中配置 Launch Application。2. 右键快捷方式,配置运行参数: -vulkan -AttachRenderDoc。
2024-08-30 06:53:39 224
原创 Vulkan进阶系列1 - Raytracing 光线查询
为了提高效率,光线追踪需要将几何体组织成加速结构(AS, 即Acceleration Structure),以减少渲染过程中光线与三角形的相交测试次数。这种层次结构通常在硬件中实现,但只有两个层级对用户可见:一个顶层加速结构(TLAS),它引用任意数量的底层加速结构(BLAS)。通常,BLAS对应于场景中的单个3D模型,而TLAS对应于整个场景。BLAS实际存储顶点数据。
2024-08-30 00:15:13 569
原创 驱动开发系列14 - Linux Graphics Wayland 详解
Wayland 是一种通信协议,规定了显示服务器与其客户端之间的通信,以及该协议的 C 语言库实现。使用 Wayland 协议的显示服务器称为 Wayland 合成器,因为它还执行合成窗口管理器的任务。Wayland 由一组志愿者开发,最初由 Kristian Høgsberg 领导,作为一个自由和开源的社区驱动项目,旨在用一个安全且更简单的窗口系统取代 X Window System,以适用于 Linux 和其他类 Unix 操作系统。
2024-08-29 19:05:07 574
原创 C++ STL adjacent_find 用法与实现
在一个容器中查找相邻元素对,比如查找出两个相等的相邻元素,或查找满足给定条件的两个相邻元素。
2024-08-28 07:35:36 185
原创 Vulkan入门系列18 - 计算着色器(Compute Shader)
在这一章节中,我们将探讨计算着色器。到目前为止,之前的所有章节都涉及了Vulkan管线的传统图形部分。但与OpenGL等传统API不同,Vulkan中中计算着色器的支持是强制性的。这意味着我们可以在每个可用的Vulkan实现上使用计算着色器,无论是高端桌面GPU还是低功耗嵌入式设备。这为图形处理单元(GPGPU)上的通用计算打开了新世界,无论您的应用程序运行在哪里。GPGPU意味着您可以在GPU上进行通用计算,这在传统上是CPU的领域。
2024-08-27 23:02:48 395
原创 Vulkan入门系列17 - 多重采样( Multisampling)
我们的程序现在可以加载多个级别的纹理,从而解决了在渲染远离观察者的物体时出现的伪影问题。现在图像变得平滑多了,但仔细观察,你会发现绘制的几何图形边缘呈现锯齿状。这在我们早期渲染一个四边形的程序中尤为明显:这种不希望有的效果被称为 “锯齿”,这是由于可用于渲染的像素数量有限造成的。由于没有无限分辨率的显示器,因此在某种程度上总是会出现这种现象。解决这一问题的方法有很多,本章我们将重点介绍其中一种比较常用的方法: 多采样抗锯齿 (MSAA)。
2024-08-26 00:14:00 372
原创 Vulkan入门系列16 - 生成多级纹理贴图( Mipmaps)
我们的程序现在可以加载和渲染 3D 模型了。在本章中,我们将再添加一项功能-- Mipmaps 生成。Mipmaps 广泛应用于游戏和渲染软件中,Vulkan 让我们可以完全控制 Mpmaps 的生成方式。Mipmaps 是预先计算的、缩放的图像。每个新图像的宽度和高度都是前一个图像的一半。Mipmaps 是一种细节层次(Level of Detail)或 LOD 的形式。距离摄像机较远的物体将从较小的 mip 图像中获取纹理样本。使用较小的图像可以提高渲染速度,避免出现摩尔纹等人工痕迹。
2024-08-25 22:58:57 196
原创 Vulkan入门系列15 - 加载模型
现在,我们的程序已经可以渲染带纹理的 3D 网格图形了,但我们前面文章中使用的几何图形还不是很有趣。在本章中,我们将扩展程序功能,从实际的3D模型文件中加载顶点和索引数据,让显卡做些实际有趣的工作。许多图像API教程都像本章这样,让读者编写自己的 OBJ 加载器。这样做的问题是,任何稍微有趣的3D应用需要一些该(OBJ)文件格式不支持的功能,比如骨骼动画。在本章中,我们将从 OBJ 模型中加载网格数据,但我们将更多地关注网格数据和程序本身,而不是从文件中加载网格数据的细节。
2024-08-25 14:34:27 145
原创 Vulkan入门系列14 - 深度缓冲区
到目前为止,我们已经将几何体投影到 3D 中,但它仍然是完全平面的。在本章中,我们将为位置添加一个 Z 坐标,为 3D 网格做好准备。我们将使用第三个坐标将一个正方形放置在另一个正方形上面,以了解几何体未按深度排序时出现的问题。二:3D几何......接下来,更新顶点着色器,以接受并转换三维坐标作为输入。之后不要忘记重新编译!...最后,更新顶点数组以包含 Z 坐标:如果现在运行您的应用程序,您应该会看到与之前完全相同的结果。
2024-08-24 21:33:22 188
原创 Vulkan入门系列13 - Texture Mapping 图像采样器描述符
在之前的一致(uniform)缓冲区文章中,我们首次学习了描述符。在本章中,我们将学习一种新型描述符:图像采样器描述符。通过这种描述符,着色器可以通过采样器对象访问图像资源,就像我们在上一章中创建的采样器对象一样。我们将首先修改描述符布局、描述符池和描述符集,以包含这样一个图像采样器描述符。之后,我们将在顶点中添加纹理坐标,并修改片段着色器,以便从纹理中读取颜色,而不仅仅是对顶点颜色进行插值。
2024-08-24 11:45:23 72
原创 驱动开发系列11 - Linux Graphics 图形栈概述(二)
1. 1993 年:外设组件互连(PCI), 32 位和 33.33 MHz ,最大传输速率 133 MB/s。2. 1996 年:加速图形端口(AGP),32 位和 66.66 MHz,最大传输速率:266 至 2133 MB/秒(1x 至 8x)。3. 2004 年:PCI Express(PCIe),1 条通道 0.25 - > 2 GB/秒(PCIe v1.x - > 4.0),高达 32 个通道(高达 64 GB/s),改善设备间通信(无仲裁)。
2024-08-23 01:40:56 315
原创 驱动开发系列13 - Linux Graphics 图形驱动概述(二)
多年来,Linux图形堆栈经历了无数次演变。本节将详细介绍这段历史,并给出更改背后的理由。
2024-08-23 00:04:19 270
原创 驱动开发系列12 - Linux Graphics 图形驱动概述(一)
图形加速是一门复杂的艺术,常常受到不公正的“巫术”声誉的困扰。本书旨在介绍Linux下图形驱动程序的内部工作原理和开发。整本书都需要具备C语言编程知识,并对图形处理器有一定的了解。尽管其主要读者是图形驱动开发者,但本文详细介绍了完整的Linux图形栈的内部结构,因此对希望增强对Linux图形世界理解的应用程序开发者也很有帮助:人们可以通过更好地理解Linux图形栈来提高应用程序的性能。在当今这个3D图形和GPU计算普及的时代,深入理解图形是必不可少的。本文以相关硬件概念的介绍开始(第2节)。
2024-08-22 23:25:32 398
原创 Vulkan入门系列12 - Texture Mapping 图像视图和纹理采样
本章我们将创建两个资源,它们用于图形流水线从图像中采样。第一个资源是我们在处理交换链图像时已经见过的,但第二个资源是新的——它与着色器如何从图像中读取像素有关。
2024-08-21 20:14:11 93
原创 Vulkan入门系列11 - Texture Mapping 图像
到目前为止,在我们介绍的例子中,几何体已经使用每个顶点的颜色进行了着色,这是一种相当有限的方法。在本教程的这一部分,我们将实现纹理映射,使几何体看起来更加有趣。这也将使我们能够在未来的章节中加载和绘制基本的3D模型。将一个纹理添加到我们的应用程序将需要以下几步:1. 创建一个图像对象,并存到设备内存中。2. 从图像文件中读取像素,并填充到图像对象中。3. 创建一个图像采样器。4. 添加一个图像采样器描述符以从纹理中采样颜色。
2024-08-20 09:57:17 205
原创 Vulkan入门系列10 - Uniform Buffer 资源描述符集
上一篇文章介绍了资源描述符布局(descriptor layout)。在本篇文章中,我们将为每个 VkBuffer 资源创建一个描述符集(descriptor set),介绍资源描述符集的使用。描述符布局(descriptor layout) 与 描述符集(descriptor set)的通俗解释:1. 描述符布局是用来描述资源的存储格式,数据类型,大小等信息,有了这些信息,着色器其才能访问,要不然资源就是一堆二进制数据,着色器是不知道它表示的是啥内容的。
2024-08-19 14:22:48 290
原创 CUDA编程07 - 卷积的优化
在接下来的几篇文章中,我们将讨论一组重要的并行计算模式。这些模式是许多并行算法的基础,这些算法出现在许多并行应用中。我们将从卷积开始,卷积是一种流行的数组操作,广泛应用于信号处理、数字录音、图像处理、视频处理和计算机视觉等领域。在这些应用领域中,卷积通常作为一种滤波器,转化信号和像素为更理想的值。我们的图像模糊核就是这样一种滤波器,它平滑信号值,以便人们能够看到整体趋势。另一个例子是高斯滤波器,这是一种卷积滤波器,可以用来锐化图像中物体的边界和边缘。卷积通常执行大量的算术运算,以生成每个输出元素。
2024-08-19 00:27:37 708
原创 LLVM - 编译器后端-指令选择
任何后端的核心都是指令选择。LLVM 实现了几种方法;在本篇文章中,我们将通过选择有向无环图(DAG)和全局指令选择来实现指令选择。在本篇文章中,我们将学习以下主题:• 定义调用约定的规则:本节展示如何在目标描述中设置调用约定的规则。• 通过选择 DAG 进行指令选择:本节介绍如何使用图数据结构实现指令选择。• 添加寄存器和指令信息:本节解释如何访问目标描述中的信息,以及一些额外提供的信息。• 设置堆栈空间:本节介绍堆栈布局和函数调用栈。
2024-08-19 00:18:05 1036
原创 C++ 语言特性02 - 命名空间
现代C++中的命名空间是什么?C++中的命名空间允许用户在命名空间范围内对类、方法、变量和函数等实体进行分组,而不是在全局范围内使用。这可以防止大型项目中的类、方法、函数和变量之间发生命名冲突。命名空间将开发人员的元素组织到由命名引用的不同逻辑范围中。因此,不同的用户(或命名空间)可以在不同的运行进程中使用相同的方法名和变量。return 0;在现代C++中,命名空间是一种库或框架。
2024-08-16 07:17:31 193
原创 LLVM - 编译器后端-目标描述
LLVM具有非常灵活的架构。我们可以向其添加新的目标后端。后端的核心是目标描述。在本篇文章中,我们将学习如何在LLVM中添加一个CPU后端。在本章中,我们将涵盖以下内容:• 为新的后端搭建环境,学习M88k CPU架构,并介绍从哪里可以找到所需的信息。• 将新架构添加到Triple类中,学习如何让LLVM识别新的CPU架构。• 扩展LLVM中的ELF文件格式定义,向处理ELF目标文件的库和工具添加对M88k特有重定位的支持。
2024-08-16 00:21:05 1305
原创 Vulkan入门系列9 - Uniform Buffer 资源描述符布局
我们现在可以通过使用Vertex Buffer的形式,将顶点的任意属性传递到顶点着色器,但全局变量如何传递给着色器呢?从这一篇文章开始,我们将进入3D图形绘制阶段,这需要一个模型视图投影矩阵。我们可以将其作为顶点数据放到Vertex buffer中,但这会浪费内存,并且每当发生矩阵变换时,我们都需要更新顶点缓冲区。这些矩阵变换可能在每一帧中都会发生(如改变相机视角位置等)。在Vulkan中解决这个问题的正确方法是使用资源描述符。描述符是一种让着色器自由访问像缓冲区和图像等资源的方式。
2024-08-15 14:01:59 87
Learn LLVM 17 A beginners guide to learnin - Kai Nacke.pdf
2024-07-08
Power and Performance Software Analysis and Optimization pdf
2024-04-09
计算机图形学经典书籍资料-渲染部分
2014-11-06
计算机图形学经典书籍资料-建模部分
2014-11-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人