自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 收藏
  • 关注

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展8

具体为各种材质球,具体实现在个人博客一阐述,这里汇总main函数的实现。无贴图pbr材质球的实现。

2025-06-13 17:16:43 678

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展7

常规ImGui语句全部放在main函数中过于复杂,我们打算设计一个ImGui类来管理一些通用的UI绘制并整理一些ImGui语句,进一步去探索如何高效地连接openGL的绘制物体和ImGui部分。利用按钮更新物体材质选项,同时对面板的呈现内容进行更新操作。实现打开材质面板的信息显示的是物体材质的实时信息。然后利用Panel管理面板内容,根据传入参数不同做分化,以打开不同的面板。大部分的UI工作都是为了后续整合与调整做铺垫,做了很多实验性的工作。利用ImGui类,在原脚本中复杂的UI绘制语句就可以被大大缩减。

2025-06-13 17:16:34 346

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展6

S1、这个摄像机由于是附着于光源的,所以我们得把项目中的光源(目前只做方向光的阴影)结构更改一下,让其继承Object类,这样我们就能够利用Object的位置,方向等属性来获取光源也就是光源摄像机的位置与方向。S2、为了获得ShadowMap(光源摄像机看向场景获取的深度图),我们需要准备一台摄像机,准备一个Shader(摄像机渲染场景所需),这个摄像机渲染场景得到的信息我们会放到一个FBO上,利用该FBO的深度附件(本质上是一张纹理图)作为ShadowMap;

2025-06-12 15:10:01 151

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展5

在我们的框架中,加载模型默认使用Phong材质。截至5.23,我们实现了Assimp库导入.fbx格式模型的功能。

2025-06-11 19:51:03 148

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录8---------ShadowMap实现阴影

然后在观察摄像机中要绘制某一片元时,先把该片元与光源连线,这条线段会与光源摄像机的深度缓冲有一个交点,我们将该片元的深度值Depth(Real)(把该片元点转换到光源摄像机坐标系下同一坐标系)和该片元与光源摄像机深度缓冲的交点的深度值Depth(Light)进行比较,如果Depth(Real) > Depth(Light),说明光源与绘制片元之间有物体,该片元是阴影区域。在我们的main函数的渲染流程中,我们会把需要渲染的Object加入到sceneOff场景中先去渲染,得到的信息存储在一个fbo对象中。

2025-06-10 12:39:31 975

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录7---------伽马矫正

而我们使用的图片都是sRGB颜色空间存储的是经过1.0/2.2次幂运算过后的值,由屏幕输出时,屏幕自动为其又做了一遍2.2次幂Gamma运算,所以看起来结果是正常的。虽然看起来结果是正确的,但问题是,如果我们在计算光照时,是要在线性空间下进行计算的。在PS中,如果我们在线性空间下制作一张图片,其中的一个像素值为(0.5,0.5,0.5),那么输出为png格式后,需要进行Gamma编码,三个通道的值均变为。而我们的目标,就是在屏幕上的一个像素若要输出183像素值的亮度,实际输出的亮度是0.5的线性强度值。

2025-06-05 22:33:47 967

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录6---------立方体贴图天空盒

对于天空盒,他的纹理对象是GL_TEXTURE_CUBE_MAP,在opengl中要采样samplerCube,需要传入一个三维向量也就是摄像机看向立方体上该顶点的方向向量,我们直接在片元着色器中传入VBO的顶点坐标信息即可,因为此时摄像机的坐标就是天空盒立方体的模型空间的原点。这是因为立方体贴图是六张贴图,而在两张图片边缘处,如果过滤方式是线性插值,它无法获取到旁边图片的像素值,只能在自己的面中插值,从而导致明显的接缝。但是前面是负z轴GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,

2025-06-02 14:23:47 1119

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录5------使用Assimp库将模型导入项目

我是通过Learn OpenGL和学习和导入Assimp库的。

2025-05-23 16:48:50 899

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展4

在render()函数中正确地将灯光需要的属性传入片元shader之后,就可以使用这些属性进行计算了。spotLight.h(其属性决定了光照的光圈范围大小以及方向)directionLight.h(其属性决定光照方向)pointLight.h (其属性决定光照衰减范围)方向光: (无衰减)

2025-04-27 15:54:18 160

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展3

在main函数中,先声明渲染器对象,要渲染的面片数组,相机对象,在prepare()函数中将要用到的对象一一定义,然后在main函数中调用renderer()函数并把需要的对象传入即可。

2025-04-25 15:41:25 429

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展2

【代码】山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展2。

2025-04-23 09:30:55 188

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》项目进展1

通过GLFW库来创建窗口,并将创建窗口以及用户与窗口的交互这些功能封装;(与Application用户交互联动实现相机移动)封装使用VAO,VBO来生成正方体,球体;shader功能的封装;texture类的封装。

2025-04-21 21:19:35 283

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录4——IMGUI开源库的学习使用,父子关系,Scene

我通过这篇博客学习和使用imgui。app->getWindow()是获取当前的窗口。但是只有初始化,窗口中也不会显示imgui组件,我们必须每一帧去绘制它才能显示。因此我们需要一个renderIMGUI()函数来渲染UI层。这三行代码是,作用是为这一帧的 UI 更新做好准备。ImGui 是“即时模式 GUI”,意味着它每帧都会重新绘制所有 UI 元素。为了正确响应鼠标/键盘输入、窗口大小变化、渲染状态等,必须先从平台和渲染器获取这些数据,然后才能开始绘制。");打开一个窗口,窗口标题是。

2025-04-21 20:28:58 840

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录3——框架搭建思路——渲染器Renderer

首先,我们要定义一个渲染列表,里面存放着我们需要在这一帧内要渲染的所有Mesh,然后对于每一个Mesh,我们需要它所在的世界坐标,由Mesh继承的Object提供的模型矩阵而获取;Material决定它如何被渲染出来(像木头,还是钢铁,还是玻璃),可以用Material派生出很多不同类型的Material,比如写实的Material或是卡通的Material,选择不同的Material就可以决定该Mesh的渲染风格。我们知道,Phong模型需要光照,场景中也得有光源,不然到处都是黑漆漆的一片。

2025-03-22 22:19:07 929

原创 MVP矩阵之V矩阵详解

M矩阵是将模型由模型坐标(也就是以物体自己为原点的坐标系,比如创建一个球体,该球体圆心就是它自己模型坐标系的原点)转换到世界坐标系的矩阵,V矩阵是将模型由世界坐标系转换到摄像机坐标系下的矩阵,P矩阵是透视投影矩阵,分为两种,正交矩阵和透视矩阵。而恰好,Pc就是子空间中的一个点,所以上面的表达式就是Mc->p!我们有一种思路,那就是既然已经知道父坐标空间下的子坐标空间的原点坐标和子坐标空间的三个单位轴,而子坐标空间下的点坐标假设为Pc(a,b,c),那么这个点在父空间坐标系下其实可以表示为从Oc出发,沿。

2025-03-19 21:17:26 444

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录2——框架搭建思路

这使其具有很强的灵活性的同时,它还的确意味着我们必须手动指定输入数据的哪一个部分对应顶点着色器的哪一个顶点属性。VBO,VAO马上会说是什么东西)插入不同的卡片(1号VBO里存放着一个三角形的顶点数据,2号VBO里存着另一个三角形的顶点数据),OpenGL就会根据当前身上的卡片(缓冲)状况(上下文)而执行不同的渲染指令。(很好理解,第一行的三个数是第一个顶点的坐标,相当于在你电脑屏幕以左下角为原点,向左移动整个屏幕长度的1/4,再向上移动整个屏幕高度的1/4,这便是第一个顶点所在的位置。

2025-03-15 13:00:49 1066

原创 山东大学22届项目实训《基于OpenGL的三维模型渲染引擎》学习记录1——框架搭建思路

由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。第一个参数是响应的(要设置回调的)窗口,第二个参数是用户按下或释放键盘按键时要调用的函数,这个函数的类型是GLFWkeyfun ,表示键盘回调函数的指针。故现在又转到mKeyBoardCallback函数上,并且此时该函数的参数里保存着你当时交互的信息(比如你按下的W键) ,会调用mKeyBoardCallback函数。故此时回调会调用OnKey函数,并且用户的交互信息会传入我们在main函数中写的Onkey函数。

2025-03-13 17:24:31 427

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除