游戏引擎编程
文章平均质量分 90
GamebabyRockSun_QQ
曾经拥有的,不要忘记,
已经得到的,更要珍惜,
属于自己的,不要放弃,
已经失去的,留着回忆,
想要得到的,必须努力,
但最重要的,是好好爱惜自己!
展开
-
DirectX12(D3D12)基础教程(二十三) ——DirectShaderCompiler 头文件接口 ID3DInclude 的应用
本章教程较短小,但内容十分重要,是后续更灵活使用 Shader 编程的重要基础之一。也就是对 Shader 代码进行头文件分离复用设计进行全面支持。或者直白的说,本章内容重点就是让各位掌握以编程的方式在代码中支持 Shader 头文件的方法,方便在设计 Shader 编辑器之类工具时,可以让所有的 Shader 组织的更有层次。本章实例代码依然基于示例是从Direct3D 10及更高版本中引入的回调接口,它用于处理着色器编译过程中的文件包含操作,即 “#include” 宏命令。原创 2024-04-24 09:37:14 · 1751 阅读 · 14 评论 -
DirectX12(D3D12)基础教程(二十二) ——HDR IBL 等距柱面环境光源加载和解算及 GS 一次性渲染到 CubeMap
在上一讲DirectX12(D3D12)基础教程(二十一)—— PBR:IBL 的数学原理中,着重介绍了整个基于 IBL 光源的 PBR 渲染过程中的数学原理,核心还是围绕反射方程(渲染方程)的简化高效计算过程展开的。当然其中数学过程稍微有些复杂。这一讲主要介绍 IBL 中等距柱面贴图解算的全过程。原创 2023-07-19 18:59:43 · 2853 阅读 · 9 评论 -
与伊人相约元宇宙——一次长谈为她讲清楚什么是元宇宙
声明:本文目的仅用以故事方式叙述本人对元宇宙的观点与看法,其中全部故事纯属虚构,如有雷同纯属巧合。图片来自于网络,侵删! 那年,好友阿强盛情邀请我去参加他们公司的年会。阿强是他们公司的CTO,公司主要做娱乐类软件产品研发和销售,生意还算不错,也做到了几百人的规模,在圈内也小有名气。因为我经常给阿强提供一些技术参考的意见,算是个顾问吧,所以阿强为了感谢我,就干脆邀请我去参加他们公司的年会。参加年会的人很多,他们公司的主要负责人以及一些友人也都悉数被邀请参加。 不知是阿强有意还是无意,他将我与他们公司原创 2022-11-14 00:48:06 · 4863 阅读 · 1 评论 -
DirectX12(D3D12)基础教程(十九)—— 多实例渲染
多实例渲染,本质上就是说将同一份模型(Mesh),按不同参数渲染成多份,每一份被称作一个实例,并且大多数情况下要求每个实例都要有差异。在游戏中常见这类使用场景,例如在即时战略游戏中,同一种飞机可能需要渲染几百个,它们在外观上几乎没什么差异,或者差异很少,主要是位置不同,运动状态不同,颜色不同等;在休闲游戏中,这可能是一组相同的方块,差异可能只是位置和颜色不同,或者是纹理不同等;原创 2022-10-09 22:52:50 · 3072 阅读 · 8 评论 -
DirectX12(D3D12)基础教程(十八)—— PBR基础从物理到艺术(下)
基于D3D12的PBR渲染基础教程第三部分原创 2022-05-27 10:39:45 · 2521 阅读 · 12 评论 -
DirectX12(D3D12)基础教程(十八)—— PBR基础从物理到艺术(中)
基于D3D12的PBR基础教程原创 2022-05-27 10:09:33 · 1902 阅读 · 3 评论 -
DirectX12(D3D12)基础教程(十八)—— PBR基础从物理到艺术(上)
基于D3D12的PBR基础教程第一部分原创 2022-05-27 09:35:42 · 1728 阅读 · 0 评论 -
2021-09-16 D3D12中各种边界对齐常量定义
#define D3D12_STANDARD_MAXIMUM_ELEMENT_ALIGNMENT_BYTE_MULTIPLE ( 4 )#define D3D12_TEXTURE_DATA_PITCH_ALIGNMENT ( 256 )#define D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT ( 512 )#define D3D12_UAV_COUNTER_PLACEMENT_ALIGNMENT ( 4096 )#define D3D12_VIDEO_DE原创 2021-09-16 17:24:40 · 490 阅读 · 3 评论 -
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【6】)
目录12、多Slot上传顶点数据12.1、多Slot上传数据基本原理12.2、Assimp中间数据的简单转换12.2、Layout的定义12.3、缓冲区准备12.4、多Slot渲染13、动画动作状态机14、后记12、多Slot上传顶点数据 在网格数据加载及上传至GPU上,本章示例应用到了一个重要的D3D12技巧——多Slot(通道)上传(加载)数据(该技巧在OpenGL中同样重要)。12.1、多Slot上传数据基本原理 首先,多Slot上传数据,是基于一些基础条件的: 1、原始网格数据是按照原创 2021-07-18 12:33:50 · 2063 阅读 · 65 评论 -
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【5】)
目录10、动画关键帧解算10.1、时间轴10.2、遍历动作CalcAnimation10.2、递归遍历骨骼树ReadNodeHeirarchy10.3、关键帧数据解算和插值10.4、生成关键帧骨骼变换矩阵10.5、关于性能的一些考虑11、骨骼调色板10、动画关键帧解算 在本章示例中,对导入后的模型动画数据,主要通过两个函数:CalcAnimation和递归函数ReadNodeHeirarchy,以及其它辅助工具函数来完成。10.1、时间轴 对于动画、音乐、视频等,甚至游戏引擎来说,正确的时间轴是原创 2021-07-18 12:27:52 · 1251 阅读 · 11 评论 -
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【4】)
目录8、动画基本原理9、四元数和SQT组合变换9.1、四元数9.2、SQT变换综合9.3、存储方面的考虑8、动画基本原理 对于一般的2D动画,甚至视频来说,相信各位已经很了解其原理了,无非就是在1秒钟之内能够连续播放不少于24帧的连续画面,也被称之为帧速率(FPS),就可以在人类脑海中经过不经意的“脑补”而形成连续的动态影像。当然这只是普通的2D动画的基本原理,这里有个隐含的前提,就是你至少要在每一秒钟有近乎连续的24张图像,对于一般的摄像机拍摄视频来说,这不是问题,只是摄影师考虑拍摄角度,场景,构图原创 2021-07-18 12:20:01 · 1351 阅读 · 7 评论 -
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【3】)
目录6、骨骼绑定6.1、Shader中的骨骼绑定6.2、aiMesh中的骨骼绑定信息6.3、骨骼绑定信息的解算7、骨骼树(骨架)6、骨骼绑定 搞清楚了基本的骨骼动画的基本原理,那么就直接来进入“骨骼绑定”的编程学习,至于过于复杂的理论,就不多介绍了,我觉得直接上源码可能更容易让大家快速掌握骨骼动画,过多的理论反而让大家会觉得无从下手。6.1、Shader中的骨骼绑定 首先从数据的角度讲,骨骼绑定在Shader中就是指在顶点的数据结构中扩展属性,用以指明顶点受其影响的骨骼的索引号,以及受影响的权重原创 2021-07-18 12:04:50 · 1656 阅读 · 4 评论 -
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
目录3、Assimp的导入标志4、网格(Mesh)5、骨骼动画基础3、Assimp的导入标志 一般的模型文件中,大多数情况下在建模时默认都保存成了OpenGL的右手坐标系,即z轴坐标垂直屏幕向外。而在D3D中习惯是左手坐标系,即z轴垂直屏幕向里。左右手坐标系区别如下图所示: 其实这种差别,对于现代的可编程的渲染管线来说,无论是OpenGL还是D3D都是可以随意使用左右手坐标系的,无非就是使用列矩阵左乘向量还是用行矩阵右乘向量的差别。这最终就变成了开发人员的事情,即你是习惯左手还是右手? 在原创 2021-07-18 11:58:51 · 2607 阅读 · 5 评论 -
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【1】)
1、前言 经过了一系列比较枯燥的命令行式的“外篇”系列教程后,这一篇起回归主干,继续我们的D3D12之旅,本章就利用已经学习的assimp库导入3D模型及动画,并且实现3D骨骼动画渲染。需要注意的是本章重点在骨骼动画的加载解算以及相应基本Shader的编写上,并没有加入光照、材质等功能,这样也符合本系列教程一贯的宗旨,即尽力使每个例子都简单,主题集中,防止大家分散精力。并且本章主题“3D骨骼动画”本身就稍微有些难度,所以更需要大家集中精力搞懂骨骼动画的基本原理,这也是3D动画最核心的基础之一。当然也只有原创 2021-07-18 11:43:12 · 2126 阅读 · 6 评论 -
3D数学系列之——从“蒙的挺准”到“蒙的真准”解密蒙特卡洛积分!
目录1、前言2、积分概念简单回顾3、积分在程序计算上的困难4、蒙特卡洛积分5、一些扩展应用1、前言 在学习3D数学的过程中,或者说在学习游戏开发、引擎开发、渲染器开发、Shader开发的过程中,对大家来说,当然也包括我,数学是一道必须要迈过的坎,而无论你有多么头疼。 目前市面上所见3D数学类的书籍,其内容还是主要集中在3D的线性代数部分,即向量和矩阵的理论及运用上,这部分内容其实如果有初高中的牢固的数学的基础的话,理解和掌握是不难的。但是在真正的渲染编程的过程中,仅仅有线性代数的知识是远远不够的,原创 2021-06-21 18:30:56 · 2075 阅读 · 55 评论 -
DirectX12(D3D12)基础教程(外篇四)——用Assimp载入模型基础操作(无渲染纯命令行版)
目录1、前言2、Assimp使用简介3、Assimp头文件和库文件引入4、Import模型文件5、aiScene基本数据结构及遍历5.1、Assimp类图及关系5.2、aiScene遍历5.3、网格数据(aiMesh)5.4、材质数据(aiMaterial)5.5、骨骼结构(aiNode)5.6、动画数据(aiAnimation)5.7、assimp中骨骼动画数据的总结5.8、assimp中的纹理6、命令行操作方法说明7、关于引用ATL的说明1、前言 在《外篇一》教程中,已经交代了为什么使用Assim原创 2021-06-17 19:37:04 · 3637 阅读 · 39 评论 -
DirectX12(D3D12)基础教程(外篇三)——CreateGraphicsPipelineState 错误 #682的修复,深刻理解POSITION和SV_POSITION
目录一、问题二、解决三、简析一、问题 当继续编写D3D12后续教程示例的过程中,在调用ID3D12Device::CreateGraphicsPipelineState时遇到如下的错误,调用失败,无法创建管线状态对象:D3D12 ERROR: ID3D12Device::CreateGraphicsPipelineState: Rasterization Unit is enabled (PixelShader is not NULL or Depth/Stencil test is enabled原创 2021-05-08 21:22:02 · 2348 阅读 · 20 评论 -
DirectX12(D3D12)基础教程(外篇二)——编译DirectXShaderCompiler库
目录1、前言2、准备工作3、下载DirectXShaderCompiler源码4、编译DirectXShaderCompiler1、前言 功夫不负有心人,终于DirectXShaderCompiler库,也就是HLSL的编译器开源项目源码也被我编译通过了,这是个不小的成功!于是我就乘热打铁,把整个编译的过程记录下来,并完整的分享给大家。目前HLSL Shader 已经发展到最新的V6.6版本了,按微软的叫法就是sm6.6,又增加了很多新的光追Shader特性,所以有喜欢研究编译器以及Shader编译原原创 2021-04-22 02:41:26 · 3341 阅读 · 15 评论 -
DirectX12(D3D12)基础教程(外篇一)——编译Assimp
DirectX12(D3D12)基础教程(外篇一)——编译Assimp1、前言2、Assimp库简介3、编译Assimp库的准备工作4、下载Assimp源码并编译1、前言 D3D12系列教程因为我转移精力学习Nodejs、VueJs等技能,暂时中断了一段时间,着实感觉有点对不起大家,这期间也有很多网友都在询问RTX系列教程还出不出,在这里一并向大家回复,这个系列将一直不间断,但不定期的更新下去,哪怕MS出到D3D13、D3D14…,只是时间问题请大家能够理解并谅解,毕竟人的精力是有限的,正如金大侠所言原创 2021-04-19 00:25:46 · 2179 阅读 · 8 评论 -
DirectX12(D3D12)基础教程(十六)——实现渲染线程池:3个内核同步对象实现渲染线程池/大规模线程池
使用1个信标量对象 + 1个CPU屏障 + 1个事件对象共3个内核同步对象实现渲染线程池/大规模线程池管理。原创 2020-11-07 20:24:29 · 2203 阅读 · 3 评论 -
DirectX12(D3D12)基础教程(十三)——D2D、DWrite On D3D12与文字输出
1、 前言 在经过了前面一系列章节的“狂轰滥炸”式的学习之后,如果你现在跟进到了这里,那么请为自己点个赞先! 从本章开始,教程内容都会开始使用Markdown方式进行发布。一方面主要是为了练习Markdown编辑器的使用;另一方面Markdown目前已经成为比较流程的程序文档的编辑方式,我也来跟跟潮流,也是让大家习惯Markdown。还有就是Markdown的公式编辑比较简洁,后续的文章中...原创 2020-03-12 01:37:43 · 6278 阅读 · 20 评论 -
DirectX12(D3D12)基础教程(十二)——多线程+多显卡渲染及水彩画效果和标准简化版高斯模糊
1、前言上一章中最后一个水彩画效果是有问题的,这一讲我们特意修正这个错误。其实错误主要是因为真正的水彩画效果还需要一个后处理——高斯模糊。这一章主要的任务就是修正这个错误。同时这一章中将结合使用酷炫的多线程+多显卡渲染框架。为了能更好的理解本章教程示例,请各位最好已经仔细阅读了之前关于多线程渲染、多显卡渲染,以及Shader原始特效的章节文章及示例代码。在本章中,多线程渲染依旧是用来录...原创 2020-03-08 15:50:17 · 3878 阅读 · 5 评论 -
DirectX12(D3D12)基础教程(五)——理解和使用捆绑包,加载并使用DDS Cube Map
目录 1、前言2、加载DDS3、捆绑包(Bundles)4、完整代码1、前言这一次距上一篇教程又隔了有一段时间了,如果你看了之前的教程的话,马上就会想到悲催的我是不是又遇到了什么麻烦?应该说你能这样想那么恭喜你,你猜对了,这次搞得我人仰马翻的是DDS纹理。其实在我之前的教程中乐观的估计了WIC库,其实这个库根本就不能用来加载DDS型的纹理。当然教程到这里,我已经被纹理问...原创 2018-11-19 22:48:44 · 9299 阅读 · 7 评论 -
DirectX12(D3D12)基础教程(六)——多线程渲染
目录 1、前言2、为什么要多线程渲染3、多线程3.1、什么是线程3.2、进程的主线程3.3、线程的入口函数3.4、创建线程3.5、CreateThread示例3.6、C/C++创建线程函数(VC版)3.7、_beginthreadex示例3.8、线程退出3.9、线程的暂停(挂起)和恢复3.10、线程的暂停式创建3.11、线程栈3...原创 2019-01-14 21:39:37 · 13117 阅读 · 31 评论 -
DirectX12(D3D12)基础教程(七)——渲染到纹理、正交投影、UI渲染基础
目录 1、前言2、渲染到纹理3、调试支持4、正交投影5、UI渲染基础6、本章完整代码链接1、前言记得那是在差不多10多年前,我在工作中认识了一位好兄弟小杨。那时他刚毕业,跟我是同一所大学,算我的校友。彼时,我已工作快10年了,在当时那家不大的软件公司管VC++研发部。小杨加入了我的团队。他长了个圆脸,跟我一样戴副眼镜,话语不多,而且眼睛中并没有闪烁着我希望看到的...原创 2019-01-26 14:05:00 · 5719 阅读 · 22 评论 -
DirectX12(D3D12)基础教程(八)——多显卡渲染基础、共享纹理、多GPU同步
目录1、前言2、为什么要多显卡渲染3、多显卡渲染核心原理3.1、多GPU拓扑模型及工作方式3.1.1、隐式多显卡系统3.1.2、显式多显卡系统3.1.3、链接的多显卡系统3.1.4、无链接的多显卡系统3.2、无链接显式多显卡系统的核心关键点——共享资源4、异构多显卡渲染框架示例——核显+独显方式4.1、创建多个设备对象4.2、创建交换链及渲染目标...原创 2019-02-01 20:39:50 · 11044 阅读 · 7 评论 -
DirectX12(D3D12)基础教程(九)——多线程渲染BUG修正及MsgWaitForMultipleObjects函数详解
1、前言距离该系列文章上一篇文章已经有近半年多时间了,大家一定很好奇,为什么不继续下去了呢?说好的光追渲染去哪了呢?OK,请大家稍安勿躁,首先,光追渲染的示例正在紧张的编写当中,教程也在有条不紊的准备中,只是因为光追渲染目前在我的电脑上只能以Fallback形式运行,而征服Fallback库有点麻烦,需要些时间;其次,在这近半年多的时间里,除了忙于工作,我主要是在按计划学习Docker、G...原创 2019-09-11 23:35:23 · 1518 阅读 · 8 评论 -
DirectX12(D3D12)基础教程(十)——DXR(DirectX Raytracing)基础教程(上)
目录1、前言2、准备工作3、Raytracing Shader3.1、Raytracing Shader整体框架介绍3.2、全局变量3.2.1、渲染目标Unordered Access 2D纹理变量3.2.2、三角形网格变量3.2.3、常量缓冲3.2.4、加速结构体变量3.3、基本光线追踪渲染过程框架3.4、光线发射函数(Ray Generatio...原创 2019-09-30 11:49:12 · 11422 阅读 · 24 评论 -
Generating Complex Procedural Terrains Using GPU
前言:感慨于居然不用tesselation也可以产生这么复杂的地形,当然致命的那个关于不能有洞的缺陷还是没有办法,但是这个赶脚生成的已经足够好了,再加上其它模型估计效果还是比较震撼的。总之好文共分享吧。Ryan GeissNVIDIA Corporation 1.1 IntroductionProcedural terrains have traditionally been limited原创 2017-10-10 14:22:17 · 1269 阅读 · 0 评论 -
DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
目录 1、前言及本章内容提要2、初识DirectXMath库3、使用独立堆创建常量缓冲4、理解管线状态对象5、理解围栏同步6、完整代码1、前言及本章内容提要经过了之前3篇教程的跨度有点大的学习,我想大家现在应该对D3D12编程有了初步掌握。本篇教程算一个小小的过渡:一是巩固一下之前所学的知识;二是将还剩下的两个知识点讲解清楚;从而为后面进一步学习相对高(fu)级...原创 2018-11-04 14:49:34 · 7972 阅读 · 20 评论 -
【原创】点点鼠标在Unity3D中实现准电影级镜头感渲染效果
学习和使用Unity3D也有个把月的时间了,得益于十多年来对3D图形算法及游戏编程的不懈努力学习,上手Unity3D我居然只用了1晚的时间,这不是夸张的说法。我只能用一句话来形容我当时的感觉:众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。如果你问我最好的3D游戏引擎是什么,我不一定能给你满意的回答,这就像你问我世界上谁最美?什么编程语言最好一样,我基本没法给你答案,但是如果你问我上手最...原创 2017-10-10 14:23:33 · 3662 阅读 · 2 评论 -
为何D3D11的几个矩阵需要转置?
在学习D3D11的时候遇到一个问题,事情是这样的:D3D11引入了常量缓存(const buffer)用来实现数据的高速传输,这块儿buffer是CPU Only Write,GPU Only Read这样的特点,其他还是D3D9的惯例。在我调用完g_pD3DImmediateContext->Map的时候,出现了没有任何图像的问题,后经过改造后,显示终于正常了,先上代码: // ...原创 2017-10-10 14:21:59 · 1150 阅读 · 0 评论 -
Win10环境下,拦截WM_NCCREATE消息时的一个诡异BUG
Win10环境下,拦截WM_NCCREATE消息时的一个 诡异BUG这几天在编写一个测试渲染管线的程序时,我直接使用了一段大约在10年前封装的一段窗口代码:LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {//窗口过程; LRESULT lRet = 0;原创 2017-11-09 20:56:52 · 780 阅读 · 0 评论 -
DirectX12(D3D12)基础教程(三)——使用独立堆以“定位方式”创建资源、创建动态采样器、初步理解采取器类型
目录 1、前言2、显卡架构和存储管理3、创建默认堆并在其上以“定位方式”创建2D纹理4、动态采样器5、完整代码1、前言经过了第二部分教程的“折腾”之后,后面的教程我觉得应该顺畅多了。至少我现在可以一天时间就把教程示例代码调通,并且可以按照自己的想法自由的去发挥了。我很喜欢这种感觉,就像在打游戏中虐那些无脑的机器AI角色一样。经过前面两章的学习,我相信大家对D3D...原创 2018-10-27 17:21:15 · 8992 阅读 · 23 评论 -
DirectX12(D3D12)基础教程(二)——理解根签名、初识显存管理和加载纹理、理解资源屏障
目录 1、前言及本章内容提要2、初步理解和使用根签名3、使用WIC库加载图片4、D3D12内存管理导论——上传堆和默认堆4.1、D3D12中创建资源的三种方式4.1.1、提交方式(CreateCommittedResource)4.1.2、定位方式(CreatePlacedResource)4.1.3、保留方式(CreateReservedResource)...原创 2018-10-16 01:10:25 · 23514 阅读 · 66 评论 -
D3D11设备接口的动态创建方法
在微软的例子中,提供了一种动态创建ID3D11Device接口指针的方法,发在这里,供大家参考.该方法的优势就是可以方便的判定系统中是否支持D3D11,并且针对可能的情况,通过MessageBox的方法,给出了可能的解决方案:HRESULT WINAPI Dynamic_D3D11CreateDevice( IDXGIAdapter* pAdapter, ...原创 2017-10-10 14:21:03 · 2042 阅读 · 0 评论 -
DirectX12(D3D12)基础教程(一)——基础教程
目录1、前言2、调用D3D12的基本步骤和准备工作3、包含头文件和引用库文件4、定义待渲染3D数据结构5、定义变量6、创建窗口7、创建DXGI8、创建D3D2设备对象接口9、创建D3D2命令队列接口10、创建交换链11、创建RTV描述符堆和RTV描述符12、创建根签名对象接口13、编译Shader及创建渲染管线状态对象接口14、加载待渲...原创 2018-09-16 23:31:16 · 97966 阅读 · 190 评论 -
关于下载、编译及运行DirectX Raytracing Sample Code (DXR)若干小问题及解决方法
伴随Nvidia公司全新一代RTX20XX系显卡的发布,微软公司也及时的更新了配套的DXR演示代码。下载地址:https://github.com/Microsoft/DirectX-Graphics-Samples/releases在下载页面中主要要下载如图红色箭头所指的几个包: 下载过程中因为Github链接加密的问题,普通的下载工具下载速度慢并且会中断,因此建议使用Githu...原创 2018-09-05 11:36:20 · 3389 阅读 · 7 评论 -
光线追踪渲染(RayTracing Render)核心原理详解
...原创 2018-05-21 22:49:35 · 19505 阅读 · 18 评论 -
D3D11和D3D12多线程渲染框架的比较(五)
1. 多趟渲染与多线程渲染接下来让我们更进一步,再来设想一个更复杂的场景,还是之前那个一个线程(CPU线程)+命令列表(GPU线程)渲染一个正方体,另一个线程+命令列表渲染一个球体的例子,当然我们还要加入一个线程+命令队列渲染一个平面,而球体和正方体都放在这个平面上(看起来有点像素描,原谅我很懒没有配任何图像),只不过在这里我们加入了阴影效果(求此时你看懂这个问题时的原创 2017-12-17 21:51:23 · 3019 阅读 · 8 评论