自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 资源 (1)
  • 收藏
  • 关注

原创 OpenMesh设置模型颜色并输出obj+mtl OpenMesh set_color()

需要注意的是,函数默认只有两个参数,分别是mesh和路径,想要将颜色输出,需要添加Options。由于obj文件对应的材质文件是.mtl文件,所以这里需要手动把.mat的后缀改成.mtl,并在obj文件中也把mat改成mtl即可正常显示。因为我们一般read的obj模型是不带颜色空间的。本文主要讲的是如何在OpenMesh中对输出的模型进行着色,并输出obj+mtl文件。选择对应的参数即可,最后就可以生成一个.obj文件和一个.mat文件。等进行着色,步骤都大同小异,以下为面片着色为例。

2023-03-29 18:53:19 829

原创 Games101 Path Tracing

Path TracingPT主要是为了解决RT中无法处理漫反射的问题。下图分别为直接光照(无漫反射)和全局光照的结果区别。(color bleeding)solution 1 simple Monte Carlo使用Monte Carlo公式求解渲染方程,得到以下解决方案:随机地选择N条光线,向外射出,查看其是否可以打到光源上。solution 2 Global Illumination上述表达式有一个问题,当射出的光线没有打到光源,而是打到了另一个物体上时,应该怎么做?回答是使用递归,

2021-09-08 19:08:17 199

原创 Games101 Ray Tracing

Ray TracingThree ideas about light rays:光线沿直线传播光线相交时互不影响,不会存在碰撞光路可逆基于光路可逆的这个原则,我们在做ray tracing的时候实际上是从眼睛(摄像机)处发射一道光线,经过弹射后进入光源,完成一条光路,再通过shading模型计算当前的image plane上的着色。Whitted-Style Ray Tracing使用的是一个递归的方法,完成对场景中多次弹射的光线的追踪,当光线打到光滑物体表面时,进行反射和折

2021-09-08 19:07:20 199

原创 Games202第三讲笔记

第三讲笔记.mdShadow Mapping进行两趟操作:从光线出发,得到光线可以照射到的范围,得到SM可供之后使用从摄像机的角度出发,配合第一趟的SM可以得到当前的位置是否在阴影中shadow mapping得到的是硬阴影,但是现实生活中我们希望得到的是软阴影Percentage Closer Filtering(PCF)刚开始是用来抗锯齿的,后来发现也可以在软阴影中使用.注意:PCF不是在硬阴影生成之后在filter的第一遍的shadow map的生成并没有受

2021-09-06 20:17:23 180

原创 Games202第二讲笔记

第二讲笔记.md渲染管线流程OpenGL类比OpenGL的本质是在CPU上调度GPU的APIs使用VBO(Vertex buffer object)存储模型信息,类似.obj文件使用framebuffer当作“画架”,一个framebuffer上可以完成多个渲染结果(canvas)的输出如何将图像呈现在屏幕上,这就是vertex/fragment shaders完成的工作GLSL早期是在GPUs上使用汇编语言(assembly)完成shaders的编写,GPUs快是

2021-09-06 20:12:27 109

原创 c++纯虚函数和抽象基类

c++面向对象编程的思想之一是可以使用继承。继承中一个重要的思想是使用抽象基类(abstract base class,ABC)。假设我们开发一个程序,需要使用椭圆和圆两种图形。因为圆是椭圆的一种特殊情形,根据继承‘is-a’的思想,自然会想到先定义一个Eclipse类,再将Circle类继承自Eclipse类。但这样实现有不好的地方。椭圆中,需要表示长半轴和短半轴、angle(长轴和水平线的夹角),还可以有rotate方法将椭圆进行旋转,这些都是圆所不需要的,将圆继承自椭圆,是十分笨拙的。一种更好

2020-12-15 17:05:09 141

原创 c++重载运算符、友元函数

运算符的重载使得我们可以更加方便的使用常见的运算符进行操作。重载运算符的函数格式如下:operatorop(argement-list)接下来的例子中,我们将定义一个Time类,并通过重载运算符+和<<来实现时间的加法和输出显示,其中会使用友元函数(friend)time.h#ifndef TIME_H#define TIME_H#include <iostream>class Time{ private: int minute; int hour;

2020-12-12 12:11:17 371

原创 c++引用变量详解

创建引用变量引用变量,是已定义变量的别名。c++中使用&符号来创建引用变量。例如,将rodents定义为rats的别名,则可以使用以下代码:int rats;int & rodents=rats;此时,rodents和rats指向相同的值和地址。可以通过下面的代码来测试:int rats=101;int & rodents=rats;cout<<"rats="<<rats<<",rodents="<<rodents

2020-12-09 17:55:35 838

原创 c++将函数作为函数参数(函数指针)

如何获取函数的地址函数名本身就是函数的地址。假设有一个函数think(),则think就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。process(think); //传递的是函数地址process(think()); //传递的是函数的返回值声明函数指针在声明指向函数的指针时,要声明指针指向的函数的类型,即声明应指定函数的返回值类型和参数列表。假设有一函数,原型如下:double pam(int);则正确的指针声明如下:double (*pt)(int)其中,(*

2020-12-09 13:14:12 8767

原创 Eigen库 error: static_assert failed due to requirement

在使用Eigen库做矩阵变换的时候,有时候会发生错误,而且Eigen库坑爹的一点是他不会把错误在哪一行告诉你,而是只给出一个错误信息,这一点就很烦。笔者使用Eigen库的时候,就遇到了下面的报错error: static_assert failed due to requirement’(int(Eigen::internal::size_of_xpr_at_compile_time<Eigen::Matrix<float, 3, 3, 0, 3, 3>…当然,实际报错的内容比上面要长

2020-09-25 17:50:54 4879

原创 被3整除整数的文法表示——编译原理

能被3整除整数的文法表示此题为编译原理相关题目,考察文法表示相关内容。原文地址:被3整除整数的文法表示题目写出所有能被3整除的十进制整数的文法表示。(注:为方便表示,规定整数首位可以为0,即018此种表示是合法的,就是整数18。)分析由数学知识可以得到,如果整数的每个位上的数字相加之和可以被3整除,则此整数可以被3整除。因此,我们用是否可以被3整除为标准,将0-9这十个数字分成三组。0,3,6,9:可以被3整除1,4,7:被3整除余12,5,8:被3整除余2文法表达式为:G=(VN

2020-09-16 18:43:01 4103 2

原创 新手上路,C语言贪吃蛇,极简版

写在最前面,文中的代码是copy一个CSDN博客上的代码,侵权必删。 这是一个啥都不懂的freshman与贪吃蛇的故事,也只适合啥都不懂的小新人看。 我的思路很简单。在啥都不懂的情况下,我觉得靠自己一个字一个字的把贪吃蛇敲出来是有点不太现实,所以我直接在网上copy了一份代码(感谢CSDN的大神们给我提供了如此多优秀的代码),打算直接看懂之后自己再独立复制一个出来。所以下面写的东西...

2018-10-02 17:59:17 1121

附件4:程序开发说明文档模板.docx

测试驱动开发之程序开发说明文档模版,内含备注

2021-04-20

空空如也

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

TA关注的人

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