- 博客(43)
- 收藏
- 关注
原创 OpenGL入门第九步:多光源
当场景中使用多个光源时,通常使用以下方法:我们需要有一个单独的颜色向量代表片段的输出颜色。对于每一个光源,它对片段的贡献颜色将会加到片段的输出颜色向量上。所以场景中的每个光源都会计算它们各自对片段的影响,并结合为一个最终的输出颜色。创建一个包含六个光源的完全照明场景,我们将模拟一个类似太阳的定向光(Directional Light)光源,四个分散在场景中的点光源(Point Light),以及一个手电筒(Flashlight)。
2024-07-26 14:18:04 356
原创 OpenGL入门第八步:投光物
将光(Cast)到物体的光源叫做投光物(Light Caster)。讨论定向光(Directional Light)、点光源(Point Light)、聚光(Spotlight)。
2024-07-26 13:42:19 1341
原创 OpenGL入门第七步:光照贴图
很像在之前的纹理。我们仅仅是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。在光照场景中,它通常叫做一个漫反射贴图(Diffuse Map)(在PBR之前3D艺术家通常都这么叫它),它是一个表现了物体所有的漫反射颜色的纹理图像。在着色器中使用漫反射贴图的方法和纹理教程中是完全一样的。但这次我们会将纹理储存为Material结构体中的一个sampler2D。我们将之前定义的vec3漫反射颜色向量替换为漫反射贴图。注意sampler2D。
2024-07-25 17:27:55 560
原创 OpenGL入门第六步:材质
当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,我们就能够对表面的颜色输出有细粒度的控制了。现在,我们再添加一个反光度(Shininess)分量,结合上述的三个颜色,我们就有了全部所需的材质属性了。为风氏光照模型的每个分量都定义一个颜色向量。
2024-07-25 15:39:51 925
原创 OpenGL入门第五步:基础光照
我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色。例如,太阳光能被看见的白光其实是由许多不同的颜色组合而成的(如下图所示)。如果我们将白光照在一个蓝色的玩具上,这个蓝色的玩具会吸收白光中除了蓝色以外的所有子颜色,不被吸收的蓝色光被反射到我们的眼中,让这个玩具看起来是蓝色的。下图显示的是一个珊瑚红的玩具,它以不同强度反射了多个颜色。所有光照的本质就是。
2024-07-24 18:12:39 429
原创 CMakeList学习笔记
注意如果你电脑中安装了ROS并配置好之后,你在终端执行echo $CMAKE_PREFIX_PATH会发现ROS会将CMAKE_PREFIX_PATH这个变量设置为ROS中的库的路径/opt/ros/noetic,意思是会首先查找ROS安装的库,如果恰好你在ROS中安装了OpenCV库,就会发现首先找到的是ROS中的OpenCV,而不是你自己安装到系统中的OpenCV。# 这个路径的查找规则为:遍历PATH环境变量中的各路径,如果该路径如果以bin或sbin结尾,则自动回退到上一级目录得到根目录。
2024-07-24 10:37:07 779
原创 OpenGL入门第四步:摄像机视角变换与交互
相机视角变换需要与鼠标键盘进行交互,需要重写鼠标和键盘响应函数。初始化:设置移动速度和对应按键移动方向,以及摄像机的摆放位置glm::LookAt函数需要一个位置、目标和上向量。知道相机上方向和前方向,可以通过矩阵叉乘得到右方向,从而建立相机坐标系(右手坐标系)。位置是相机坐标系在整个世界坐标系下的位置。鼠标只要经过窗口就会被置于中心,不隐藏指针就是下面的效果。:实现缩放效果。当视野变小时,场景投影出来的空间就会减小,产生放大了的感觉。:键盘响应。
2024-05-11 11:07:57 498
原创 OpenGL入门第三步:矩阵变换、坐标系统
这里矩阵变换,使用4*4的矩阵,既可以表示位移,也可以表示缩放。添加4维矩阵变量:在着色器里面添加变换矩阵,改变坐标位置设计一个随时间变换 ,所有重写TimerEvent调用update触发。
2024-05-10 18:31:16 289
原创 OpenGL入门第二步:颜色、纹理设置(解析)
0是由顶点着色器规定,即取得是位置值;GL_FLOAT表示是浮点型数据;0表示从数据第0位开始取;:1是由顶点着色器规定,即取得是纹理值;3表示从第3个数据开始取;里写颜色随时间的变化,然后调用update刷新,会触发paintGL。这里顶点数据发生了改变,除了顶点位置还包括了纹理坐标位置。变量,如果需要颜色随时间变化,那就再添加一个定时器。这时候要注意创建对象时,对着色器的取值设置。中给片段着色器赋值,让重新设置颜色。可以设置多个纹理,纹理可以叠加。设置纹理数据来源以及数据处理。
2024-05-09 18:06:18 609
原创 OpenGL入门第一步:创建窗口、重写虚函数
设置OpenGL资源和状态。在第一次调用resizeGL()或paintGL()之前被调用一次。resizeGL窗口尺寸变化时调用。窗口更新时调用,渲染 OpenGL 场景。绑定当前OpenGL上下文。释放当前OpenGL上下文。如果要重绘场景 应该调用update而不是resizeGL所有跟 OpenGL 相关的操作都应该发生在三个函数内 或者在 调用之后。
2024-05-09 15:34:47 1119
原创 Qt:实现git中diff的功能
最后找到一个c++可用的代码如下,在Myers函数中传入两个需要比较的文档内容。,用于获取位于两个不同 commit 中的两个相同文件的差异。在 Git 中,有四种 diff 算法,即。
2024-05-09 14:36:49 307 1
原创 Qt+Ubuntu20.04:打包qt
如果还有上述报错,就继续重复上面的操作(这里就不用再进入/etc/ld.so.conf修改了)直至没有类似报错。先将你的程序在release下编译通过,保证下面打包的程序是你最新的。在第三步的文件下,新建文件pack.sh,内容如下。在bin/release下找到与你程序同名的。然后进入/etc/ld.so.conf修改如下。然后再运行./SeerScriptHttp。将这个文件复制到你新建的文件夹里。在你的新建文件夹目录下执行。在第二步的文件终端里运行。运行的时候遇到这样的错误。
2024-04-30 18:16:56 1745 1
原创 Qt:打包为独立exe
2、.新建一个文件夹A,将Release编译生成的exe文件复制到新建文件夹中。4、把原来的Release文件复制粘贴到现在生成的新文件里(跳过重复的文件)3、打开Qt 5.11.1 64-bit for Desktop(1、用Release编译。
2024-03-18 16:44:05 290
原创 QT:多线程
然后把要实现的函数写在这个类里,在run函数中调用。在需要开辟线程的地方,new一个线程类出来,通过线程的start函数运行线程,回自动执行run函数。例如:线程类调用线程。
2024-01-19 17:47:02 399
原创 QtCreator 运行项目,在debug下正常运行.在release下运行崩溃
在Release下面让Debug可以断点调试,这个方法只能是手动打断点,但是如果崩溃了是不会跳到具体崩溃的地方的。但是我怎么也找不到到底什么问题导致崩溃,指针都没有空,函数return感觉也不是问题。最后,通过一步步调,我发现,我的代码在release下崩溃的原因是因为析构顺序的错误。例如说,我生成A,由A生成B,B在生成C。A是一个弹框,B是一个弹框,C是B的内容。当B被关闭的时候给A一个关闭信号,让A删除B,然后B析构的时候删除C。正确的析构逻辑应是B被关闭后,先析构C,再让A析构B。
2023-12-01 16:53:50 1802
原创 程序媛常用软件推荐
代码显示的软件,可以在语言栏里设置代码的显示格式!截图软件,设置截图快捷键就可以直接截图了。可以在桌面上显示日历,双击可以添加事项。可以录制动态视频的软件,类似表情包那种!
2023-12-01 11:31:24 74
原创 Qt:关于引用、指针的一些tip
但是在实际操作的时候,遇到了一些问题,最后发现,是我对一些函数的结果是引用还是指针,不太熟悉。1、for循环中 `var` 必须是一个引用类型才能修改原列表中的元素,否则 `var` 将是列表元素的一个副本,这样对 `var` 的修改不会影响原始列表中的元素。这两点是我根本没有注意的,平时for循环我都会加&,但是我一直认为的原因是让程序减少一次拷贝,没有想到副本。2、`toMap()`函数返回的通常是一个值副本,而非引用,所以,尝试在这个副本上调用 `insert()` 并不会改变原始元素的map。
2023-11-27 15:24:03 186
原创 QGraphicsView
父不可见则子不可见,所以如果想让子的子可用,要先让父可见,然后才可以对子的子做操作。要想让线不显示,在分别在2和3里让各自的子(1、4)不可见,再让自身2、3不可见。隐藏3的时候线不见,显示3的时候线可见。线显示的判断是两端都可见的时候,线可见。1是2的子,2是3的子,4是3的子。1和4之间有一连线。如果先让1、4可见,再让2、3可见,线是不会显示的。想让线显示,就必须先让2、3可见,再让1、4可见。,获取1、4是否可见的时候,仍是。因为线在做显示判断的时候,
2023-10-16 11:45:45 125
原创 QT:常用快捷键
Alt+左右 ——切换最近文件(UI下Alt+←可以直接到代码)ctrl+/ ——注释行,取消注释行。在.h里按 Alt+Enter ——再按回车键将在cpp中添加对应的方法实体。ctrl+shift +上下方向键 ——快速调整目前代码进行上下行互换。
2023-07-11 15:31:19 671
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人