
图形API与实时渲染实践
文章平均质量分 87
学习DX,OpenGL,Vulkan等图形API
YakSue
这个作者很懒,什么都没留下…
展开
-
图形API学习工程(30):尝试使用panorama来代替Cubemap作为全景图
学习 CubeMap 和 panorama 这两种全景图格式。在工程中实现 panorama 的采样来代替CubeMap。原创 2022-12-12 18:06:23 · 3037 阅读 · 2 评论 -
图形API学习工程(29):解决在shader文件中使用include的问题
由于我以后可能需要定义些通用的shader函数,自然想要将他们放入单独的shader文件并由其他shader文件include它们。这在hlsl中会很容易,但是glsl默认状态下并不支持。本篇目标是学习如何解决这个问题,最终让工程里D3D11、D3D12、OpenGL、Vulkan都可以在shader中使用 include。原创 2022-12-07 23:12:06 · 2686 阅读 · 0 评论 -
图形API学习工程(28):实现基于Cook-Torrance与GGX的PBR渲染
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标本篇基本上是对《【翻译】Coding Labs :: Physically Based Rendering - Cook-Torrance》中内容的总结与实践。我将实验 Cook-Torrance 的 BRDF 公式中各个组成部分的效果。最后将在自己的工程中实现完整的渲染效果。Cook-TorranceDFG重要性采样完整效果...原创 2021-10-06 21:44:09 · 2347 阅读 · 4 评论 -
实验通过使命召唤所使用的 Interleaved Gradient Noise 在Shader中生成随机噪声
需求我有个需求是在Shader代码中得到随机的噪声值。虽然采样贴图可以得到任何可控的噪声形状,但是当前我的需求只是得到完全随机的值,我想是否能通过代码得到。方法我在这一篇知乎看到了一种方法,是使用 Advances in Real-Time Rendering in 3D Graphics and Games - SIGGRAPH 2014 中的 Next Generation Post Processing in Call of Duty: Advanced Warfare 提到的,在使命召唤的后处原创 2021-10-05 22:37:41 · 1184 阅读 · 1 评论 -
图形API学习工程(27):修正CubeMap采样方向需要重排轴向的问题
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics问题在《图形API学习工程(21):使用CubeMap纹理》中我实现了CubeMap,然而有个问题:每次采样CubeMap的时候,都需要对采样方向的轴向进行重排://采样的方向,这里做一个小调整vec3 SampleDir = vec3(LightDir.x,-LightDir.z,LightDir.y);//采样立方体贴图获得颜色fColor = texture(ourCubeMap, Sampl原创 2021-10-05 12:45:48 · 418 阅读 · 0 评论 -
图形API学习工程(26):实验从环境CubeMap生成Lambert环境辐射率图的效果
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标在《【翻译】Coding Labs :: Physically Based Rendering》中,我学习到了PBR的基本概念。其中作者介绍了BRDF的概念,以及Lambert的BRDF。在Lambert中,一个方向上反射的光和反射的方向无关,只和入射光有关,因此可以对所有入射光求积分,将结果基于表面法线的方向存到一张CubeMap中,而这一步我也在《从CubeMap生成Lambert下的环境辐射率图》原创 2021-10-02 22:45:40 · 297 阅读 · 0 评论 -
从CubeMap生成Lambert下的环境辐射率图
前言本篇主要是对《Coding Labs :: Physically Based Rendering》中内容的实践。本篇也将对一些原理进行概况,但可能理解并不准确。最后,将实践原文中的代码并观察效果。渲染方程概括上讲,渲染方程所描述的是:在知道一位置的所有入射光的情况下,这个位置某一方向的出射光是什么?Lo(p,ωo)=∫Ωfr(p,ωi,ωo)Li(p,ωi)(n⋅ωi)dωiL_o(p,\omega_o) = \int_\Omega f_r(p,\omega_i,\omega_o)L_i(原创 2021-10-02 13:53:44 · 310 阅读 · 0 评论 -
将OpenGL渲染的结果保存为图片
概述获取OpenGL当前渲染的结果是使用了glReadPixels函数,主要参考了 opengl 保存渲染好的图像_szfhy的博客-CSDN博客_opengl保存图像。保存BMP图片在之前的博客中的第一部分有记录,代码非常简单,也不需要额外的库。而OpenGL的最基础环境搭建在之前的文章《创建一个最小的OpenGL实例》中有说明,本篇的代码也将以此为起点。步骤首先,依照《创建一个最小的OpenGL实例》搭建OpenGL环境,或者直接从GIT上拉下工程的代码。然后,将之前的博客中的第一部分的代码原创 2021-09-30 19:22:46 · 9222 阅读 · 4 评论 -
图形API学习工程(25):实现法线贴图
本篇将概括法线贴图应用于当前工程的要点,并观察最后的效果。原创 2021-04-04 19:45:07 · 523 阅读 · 0 评论 -
图形API学习工程(24):D3D11读取非DDS格式的CubeMap
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标在《图形API学习工程(21):使用CubeMap纹理》中,由于DirectX读取CubeMap的教程范例都是DDS格式的纹理,因此我也首先实现了DDS的版本,期望之后做处理。上一篇使D3D12可以用非DDS格式的CubeMap了,本篇目标将是D3D11。分析当前的流程当前使用DDS格式纹理创建CubeMap的代码如下,其中核心是CreateDDSTextureFromFile函数。这个函数:原创 2021-03-29 19:21:28 · 359 阅读 · 0 评论 -
图形API学习工程(23):D3D12读取非DDS格式的CubeMap
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标在《图形API学习工程(21):使用CubeMap纹理》中,由于DirectX读取CubeMap的教程范例都是DDS格式的纹理,因此我也首先实现了DDS的版本,期望之后做处理。而在当时所参考的代码,与之前自己创建普通2D纹理的版本区别很大。最大的区别是使用了Placed resources。于是我在上一篇博客《图形API学习工程(22):D3D12的“Committed Resources”和“Plac原创 2021-02-28 13:29:19 · 530 阅读 · 0 评论 -
学习纹理格式(DXGI_FORMAT 和 VkFormat)
目标在《图形API学习工程(11):使用纹理》中:目标是:讨论为何要指定纹理格式导致格式不同的原因不同格式对应的位数常见关键字有些是公用的,有些仅在DXGI_FORMAT或VkFormat里出现。只列举最常见的那些,详细可看官方文档。RGBAFLOATSINTSNORMSRGBTYPELESSUINTUNORMSHAREDEXPBCTexture Block Compression in Direct3D 11 - Win32 apps | Microsoft Docs原创 2021-02-09 19:15:59 · 2860 阅读 · 2 评论 -
图形API学习工程(setup):梳理环境配置步骤
由于我需要使用一个新机器一段时间,不得不在新机器上配置一下这个工程的环境。所以顺便将配置的步骤记录下来,以备之后遇到类似的需求。步骤0:从GIT上得到工程源码工程GIT地址:https://gitee.com/yaksue/yaksue-graphics虽然可以选择直接下载源码,但还是建议使用GIT:GIT:https://git-scm.com/TortoiseGit:https://tortoisegit.org/步骤1:安装VS2019从微软VisulStudio官网上下载VS2019并原创 2021-02-06 17:14:53 · 1038 阅读 · 1 评论 -
图形API学习工程(22):D3D12的“Committed Resources”和“Placed resources”
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics疑问在之前的博客《图形API学习工程(21):使用CubeMap纹理》中,D3D12的版本我主要参考了《DirectX12(D3D12)基础教程(五)——理解和使用捆绑包,加载并使用DDS Cube Map_Gamebaby Rock Sun的博客-CSDN博客》的代码,而他使用了CreateHeap和CreatePlacedResource这两个我之前没使用过的函数:他用这种方法创建出了一个 中间资源(原创 2021-01-29 20:00:40 · 2093 阅读 · 0 评论 -
图形API学习工程(21):使用CubeMap纹理
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标参考了 Vulkan Adventures: Cube map tutorial! – satellitnorden原创 2021-01-25 23:55:48 · 1082 阅读 · 0 评论 -
图形API学习工程(20):实现简单的菲涅尔效果
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标菲涅尔效应本身是一个光学现象,在PBR中也有重要的作用(见 PBR理论 - LearnOpenGL CN )暂且不提其物理学上的原理,仅从表现效果上来看,它可以计算出:在一个视线下物体 边缘 的部分,例如观察一个球:(越白表示菲涅尔效果越强)(图片来源: PBR理论 - LearnOpenGL CN )虽然这一现象在本质上或许较为复杂。但是从效果角度来说,可以简单地用视线方向与物体表面法线做点乘来原创 2021-01-23 15:04:40 · 921 阅读 · 0 评论 -
尝试解析DDS格式纹理文件的基本信息(不包括图像数据)
目标DDS(DirectDraw Surface)是微软为DirectX准备的一种纹理格式。我注意到可以在VisualStudio中预览:我当前关注于这种纹理格式,是因为:不管是D3D11的官方范例(在Microsoft DirectX SDK (June 2010)中),还是D3D12的官方范例(microsoft/DirectX-Graphics-Samples),其中的纹理资源都是DDS格式(DX12龙书中的范例也用DDS)。范例代码直接使用了DDS专用的接口将数据读入并转换为DX资源,这个原创 2021-01-17 17:07:46 · 4504 阅读 · 0 评论 -
图形API学习工程(19):读取obj格式模型
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标在本篇之前,顶点数据由程序内的C++代码所硬编码,用这种方法来产生复杂的几何体并不容易。因此,我觉得是时候建立机制让程序可以读取外部的模型文件了。模型的格式我选择 “.obj”1 ,因为它是通用的模型格式,且其内容是肉眼可读的ASCII编码。不过我并不打算自己写obj格式的解析逻辑,而是选择使用tinyobjloader这个库。因此,本篇的目标是:在工程里使用tinyobjloader库实现对o原创 2021-01-01 13:24:13 · 1406 阅读 · 0 评论 -
图形API学习工程(18):渲染管线相关代码重构,实现绑定多个资源以及DrawCall间切换资源
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标问题资源和Descriptor之间还未分开,随后有多用途时如RT,再抽象Vulkan的和D3D12的Descriptor不太一样Vulkan是DescriptorSet原创 2020-12-27 10:53:52 · 476 阅读 · 0 评论 -
图形API学习工程(17):着色器中的资源绑定(Resource binding in Shader)
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标一个简单的问题是:当shader中有同种类的多个资源时,要如何分辨他们呢?这里就需要将每个资源和一个“序号”对应起来了。对于HLSL类似于:cbuffer ConstantBuffer : register( b7 )对于GLSL类似于:layout(binding = 7) uniform UniformBufferObject本篇的目标是实践验证如何在图形API中指定资源在shader原创 2020-12-15 22:13:06 · 783 阅读 · 0 评论 -
图形API学习工程(16):修复工程里Vulkan渲染画面翻转问题
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics问题此问题最初出现于《图形API学习工程(5):图形管线&顶点缓冲》,当时渲染三角形时已经和其他三者不一样。而这一问题直到上一篇博客《图形API学习工程(15):重构顶点数据相关代码,实现渲染多个mesh》还是存在:这期间一直没有修正。因为开始我觉得可能是个大问题需要时间,又担心当图形比较简单时不好观察来确定是否真正修好。所以直到上一篇之后才觉得是时候解决了。幸运的是我发现这一问题实际已经在Vu原创 2020-12-13 23:07:52 · 666 阅读 · 0 评论 -
图形API学习工程(15):重构顶点数据相关代码,实现渲染多个mesh
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标HLSL Semantics原创 2020-12-13 22:29:08 · 389 阅读 · 0 评论 -
尝试给RenderDoc写扩展插件(Extensions)
目标正如上一篇博客《学习使用 RenderDoc 的 Python API》所说,RenderDoc有一套PythonAPI。而这套API可以为RenderDoc写扩展插件。本篇的目标是:尝试写一个可以创建出一个界面的测试插件。0. 创建一个扩展插件的流程这里主要参考了官方文档中的《How do I write a python extension?》Extensions are simply python modules located in the user RenderDoc co原创 2020-12-07 23:25:03 · 2004 阅读 · 1 评论 -
图形API学习工程(14):资源和描述符(Descriptors),资源如何绑定到管线上
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标总而言之,是间接的。为什么资源需要描述符?dx书D3D12,Vulkan中的资源和描述符管线如何指定自己的布局如何将实际资源联系到一起1.资源和描述符书中概念D3D12的描述符堆(DescriptorHeap)\Samples\Desktop\D3D12Fullscreen\src\D3D12Fullscreen.cpp搜m_cbvSrvDescriptorSize2. D3D12,原创 2020-12-05 22:02:13 · 1611 阅读 · 0 评论 -
学习使用 RenderDoc 的 Python API
目标RenderDoc有一套PythonAPI。不过正如官方文档所说:This API is not necessary to use RenderDoc by default, but if you would like more control or custom triggering of captures this API can provide the mechanism to do so.默认情况下,使用RenderDoc不需要此API,但如果你想对captures进行更多的控制,或者原创 2020-11-30 23:55:51 · 4354 阅读 · 0 评论 -
图形API学习工程(13):资源转换屏障(transition resource barriers)
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标我注意到:D3D12和Vulkan,相比于D3D11和OpenGL,多了“资源转换屏障”这种操作。我想弄明白:“资源转换屏障”的意义是什么?D3D12和Vulkan用什么样的API来实现?创建纹理贴图时用了这种操作,细节是怎样的?当前工程里其他哪些地方也用到了?资源转换(Resource Transitions)《D3D12龙书》【4.2.3 Resource Transitions】:原创 2020-11-28 19:13:00 · 2684 阅读 · 2 评论 -
学习使用RenderDoc查看着色器代码
0. 准备首先,我想要一个相对简单的程序来学习。因此,我选择了 DX11官方范例(包含在DirectX11官方SDK中)里的【Tutorial 07: Texture Mapping and Constant 】需要安装工程,编译出exe,然后将着色器文件(Tutorial07.fx)和贴图文件(seafloor.dds)放到exe的同级目录。随后应该可以打开exe:1. 截一帧设置exe的路径:然后运行。按F12截下一帧2. 查看着色器代码首先,选择到想要观察的那一次DrawCal原创 2020-11-25 22:42:04 · 5516 阅读 · 1 评论 -
图形API学习工程(12):讨论当前工程里同步CPU与GPU的方式
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics简单讨论CPU和GPU间的交互《DX12龙书》在【4.2 CPU与GPU间的交互】章节中讨论了这个问题,简单来说:为了最佳性能,CPU和GPU这两种处理器应该尽量同时工作,少“同步”。因为“同步”意味着一种处理器以空闲状态等待另一种处理器,即它破坏了“并行”。但有时,又不得不进行二者的同步,见《DX12龙书》的【4.2.2 CPU与GPU间的同步】所讨论的问题。当前工程,就在D3D12和Vulkan的版原创 2020-11-14 23:25:49 · 1159 阅读 · 1 评论 -
图形API学习工程(11):使用纹理
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标贴图《纹理 - LearnOpenGL CN》和《Images - Vulkan Tutorial》都推荐使用stb。资源:https://www.textures.com/download/pbr0071/133106分析当前的问题原创 2020-11-08 11:41:46 · 657 阅读 · 0 评论 -
尝试进入Vulkan的ValidationLayer中的代码调用栈
问题当前,我遇到了一个Vulkan中的错误断点:(可以看到最后的位置是“VkLayer_khronos_validation.dll”,即Validation Layer)这个中断可以在工程YaksueGraphics的这个提交中复现:当我双击最后的栈时,提示没有cpp文件可供查看这个core_validation.cpp是Validation Layer中的代码,而对于Validation Layer,我是直接使用编译好的lib文件,并没有机会接触到cpp文件。所以我找不到cpp。方法原创 2020-11-07 13:42:55 · 933 阅读 · 0 评论 -
图形API学习工程(10):基础光照
目标在《图形API学习工程(6):创建并使用UniformBuffer》中,UniformBuffer的机制已经配置好,这其实可以让一大批功能得以实现。《图形API学习工程(7):进入3D空间》是其一,其中配置了相机矩阵和投影矩阵,使得能以一个虚拟的“相机”来观察3D世界。本篇的“光照”同样如此,它建立在UniformBuffer的功能上。本篇的目标是创建一个有一定体积的“立方体”,并让它看起来“受到光照”。(图形API方面实际没有新的东西触及,只是着色器代码和UniformBuffer数据的操作)原创 2020-11-05 23:48:59 · 341 阅读 · 0 评论 -
图形API学习工程(9):深度缓冲(Depth Buffering)
目标如果不设置“深度缓冲”,场景中的图形将不能以正确的遮挡关系渲染。(见本篇的【无深度缓冲的情况】)本篇目标是配置好工程中各个图形API的深度缓冲。无深度缓冲的情况现在将顶点数据变成一个立方体,并为每一个面都设置不同的颜色://作为测试的顶点缓冲数据:std::vector<RawVertexData> vertices = { //六个面,颜色各不同 { {-1.0f, 1.0f, -1.0f}, {1.0f, 0.0f, 0.0f, 1.0f} }, { {1.0f原创 2020-11-05 00:05:29 · 607 阅读 · 1 评论 -
图形API学习工程(8):使用顶点索引缓冲
目标在《图形API学习工程(5):图形管线&顶点缓冲》中,实现了渲染出一个三角形。他有三个顶点。但是考虑图形变得复杂些的情况,就假如是一个四边形吧,那就需要分解为两个三角形来渲染了,而每个三角形需要三个顶点,也就是说,共需要6个顶点数据。...原创 2020-11-01 23:08:21 · 437 阅读 · 0 评论 -
图形API学习工程(7):进入3D空间
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标在先前的程序中,虽然已经有一个三角形渲染在屏幕上,但它在屏幕中的位置是直接写在了顶点缓冲中了,因此它不像是在一个空间中的图形。要真的“进入3D空间”:首先,需要图形的顶点是代表一个3D世界中的位置,而不是屏幕中的位置。其次,需要在3D空间中有一个“虚拟”的相机,代表从哪个角度来观察3D场景。最后,由于图形毕竟还是要显示在屏幕上,所以最终所有的顶点还是要变换到屏幕空间中的。也就是说,一个模型顶原创 2020-10-31 11:42:30 · 293 阅读 · 0 评论 -
图形API学习工程(6):创建并使用UniformBuffer
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标所谓的 “UniformBuffer” (在DirectX中被称为 “ConstantBuffer” )是指一块能在shader中访问的数据,其值可以在CPU中每帧更新。这个名字原创 2020-10-18 20:33:31 · 983 阅读 · 0 评论 -
图形API学习工程(5):图形管线&顶点缓冲
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标渲染一个三角形。为此:图形管线顶点缓冲图形管线struct D3D12_GRAPHICS_PIPELINE_STATE_DESC{ ID3D12RootSignature *pRootSignature; D3D12_SHADER_BYTECODE VS; D3D12_SHADER_BYTECODE PS; D3D12_SHADER_BYTECODE DS; D3D12_SHADE原创 2020-10-08 11:38:25 · 470 阅读 · 0 评论 -
创建一个最小的OpenGL实例
目标创建一个最小的OpenGL实例,效果和《创建一个最小的D3D11实例》一样,都是渲染一个三角形。为此,所作的操作基本可以概括为:初始化顶点缓冲编译shader其中“初始化”步骤是使用GLFW和GLAD,在之前的博客中有介绍,但在这里会简单地再梳理一遍。而“顶点缓冲”和“编译shader”的内容来源于《OpenGL红书》的【triangles范例】,不过代码部分有略微改动,主要是一些简化和注释。步骤1. 使用GLFW创建窗口详细讨论见《试用GLFW并创建OpenGL和DX的环境》。概原创 2020-10-06 13:38:14 · 595 阅读 · 0 评论 -
图形API学习工程(4):梳理:以Vulkan为中心梳理当前初始化阶段的代码
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标目前工程所能达成的效果是:以一固定色填充窗口(clear命令)。为此,所需要的操作大致有:创建Device等“只需要在开始创建一次”的对象。创建交换链以及相关对象。使用交换链创建RenderTarget创建命令队列相关的对象(仅D3D12,Vulkan这种先进图形API)为了“同步”而创建的对象(仅D3D12,Vulkan这种先进图形API)在当前工程里,各种图形API做这些事情所花费的代原创 2020-10-04 22:44:20 · 1368 阅读 · 0 评论 -
图形API学习工程(3):建立更方便调试的机制
工程GIT地址:https://gitee.com/yaksue/yaksue-graphics目标当工程变大时,好的调试机制可以更快解决问题。目前工程中没有这方面的机制,所以我决定优先建立起来,具体包括:C++的异常处理(throw)。调用图形API时如果返回了错误,我需要将其“抛出”、图形API自带的debug机制。例如Vulkan的validation layers;D3D12也有ID3D12Debug::EnableDebugLayer提供类似的机制。异常处理关于异常处理,我用得很少原创 2020-10-01 09:07:29 · 1145 阅读 · 0 评论 -
图形API学习工程(2):插曲:配置文件&FPS统计器
目标我决定在工程中加一些“小功能”以方便进行后续的学习工作。不过就“小功能”本身而言,和图形API并没有直接关系。小功能如下:配置文件之前选择哪个图形API是硬编码在C++代码中的,切换会导致重新编译,不太方便。因此我决定将其写在配置文件中,程序运行时动态读取配置。(不过此部分的实现上不好的地方是,用到了很多硬编码的字符串,他们之间的不同步会导致问题,正在思考如何解决)xml格式配置文件的格式我选择xml。对于在C++中读取xml格式的算法,我选择第三方库tinyxml2配置文件的窗口界面原创 2020-09-27 21:39:00 · 250 阅读 · 0 评论