<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[j_oop的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/j_oop</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; j_oop]]></copyright><item><title><![CDATA[贝叶斯线性回归]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/119854849</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/119854849</guid><author>j_oop</author><pubDate>Sun, 22 Aug 2021 17:03:25 +0800</pubDate><description><![CDATA[贝叶斯线性回归
概述
​	不同于频率派的线性回归Y=ωTX+ω0Y=\omega^TX+\omega_0Y=ωTX+ω0​，贝叶斯学派认为ωT\omega^TωT不是一个值固定的常量，而是由输入数据集data决定的一个分布，因此贝叶斯线性回归的预测结果也不是一个固定值，而是一个分布
模型
​	输入数据集data={(x,y)∣x∈Rp,y∈R}data=\{(x,y)|x\in R^p,y\in R\}data={(x,y)∣x∈Rp,y∈R},定义X,YX,YX,Y之间的映射关系是：
{f(x)=ωTx+]]></description><category></category></item><item><title><![CDATA[最短路径算法]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/117636429</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/117636429</guid><author>j_oop</author><pubDate>Tue, 15 Jun 2021 09:16:15 +0800</pubDate><description><![CDATA[应用场景：

 狄克斯特拉用于解决单源最短路径问题，即从图中的某一节点出发到任一节点的最短路径。yue'shu




]]></description><category></category></item><item><title><![CDATA[2.窗体的创建及渲染循环]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/109719603</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/109719603</guid><author>j_oop</author><pubDate>Mon, 16 Nov 2020 14:04:28 +0800</pubDate><description><![CDATA[前面讲过了glfw封装了这一基础过程，因此本节只是API的基础使用方法，不做深入了解

1.窗体创建


GLFWwindow* Util::InitWindow()
{
    //初始化glfw，GLFW是一个专门针对OpenGL的C语言库，
	//它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文，定义窗口参数以及处理用户输入
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);	//OpenGL主版本号
	gl]]></description><category></category></item><item><title><![CDATA[1.环境搭建]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/109718685</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/109718685</guid><author>j_oop</author><pubDate>Mon, 16 Nov 2020 13:46:59 +0800</pubDate><description><![CDATA[1.什么是OpenGL

 OpenGL是一个由Khronos组织制定并维护的规范(Specification),规范严格规定了每个函数该如何执行，以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的，将由OpenGL库的开发者（也就是显卡厂商）自行决定。

2.GLFW

 GLFW是一个专门针对OpenGL的C语言库，它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文，定义窗口参数以及处理用户输入。GLFW专门为OpenGL的开发完成了一些基础工作。获取的..]]></description><category></category></item><item><title><![CDATA[shared_ptr的设计与实现]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/109624561</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/109624561</guid><author>j_oop</author><pubDate>Wed, 11 Nov 2020 16:52:59 +0800</pubDate><description><![CDATA[参考博客：http://blog.youkuaiyun.com/hackbuteer1/article/details/7561235，本文在上述博客基础上使用了模板类来实现shared_ptr并且改进了一个小bug

1.shared_ptr如何自动管理内存？

 我们知道栈上的对象能够在生命周期结束时自动释放，而堆上new出来的对象只能手动delete，shared_ptr即是将普通指针包装起来，只使用shared_ptr的栈对象（如何只允许使用对象的栈对象呢？重载new运算符即可，不是本文重点），而当栈对象生命.]]></description><category></category></item><item><title><![CDATA[6.纹理]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427956</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427956</guid><author>j_oop</author><pubDate>Mon, 07 Sep 2020 15:57:46 +0800</pubDate><description><![CDATA[1.纹理采样：根据纹理坐标获取像素值

2.纹理环绕：当纹理坐标超出默认范围时纹理的重复方式，OpenGL提供了以下几种方式



对纹理环绕方式进行设置：

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

float borderColor[] = { 1.0f, 1.]]></description><category></category></item><item><title><![CDATA[7.矩阵变换]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108428035</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108428035</guid><author>j_oop</author><pubDate>Mon, 07 Sep 2020 15:57:18 +0800</pubDate><description><![CDATA[1.使用OpenGL Mathematics，下载GLM后，将文件路径加入包含路径（不需要编译和链接）

2.平移、旋转、缩放矩阵


glm::vec4 vec(1.0f,0.0f,0.0f,1.0f);
//默认是一个单位矩阵（9.9版本之后的GLM应改为glm::mat4 trans(1.0f);）
glm::mat4 trans;
//缩放
trans = glm::scale(trans,glm::vec3(0.5,0.5,0.5));
//旋转
trans = glm::rotate(trans]]></description><category></category></item><item><title><![CDATA[算法学习之--最小生成树（Prim）]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108300676</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108300676</guid><author>j_oop</author><pubDate>Mon, 07 Sep 2020 15:54:58 +0800</pubDate><description><![CDATA[1.应用场景：

 上一篇博客学习了图论基础https://blog.youkuaiyun.com/j_oop/article/details/108018641介绍了无权图的算法实现以及路径计算获取，在实际生产场景中带权图往往更接近实际需求。最小生成树解决的是在n个顶点中找到n-1条边使得所有顶点全部连通并且n-1条边的权重之和最小（针对无向图）。

2.带权图的算法实现

 上一篇博客介绍了在稠密图中，我们使用一个n*n（n为顶点数）的邻接矩阵（二维bool数组)mp_graph存储顶点之间的连接关系，mp_g..]]></description><category></category></item><item><title><![CDATA[5.Shader]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427939</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427939</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:28:55 +0800</pubDate><description><![CDATA[1.使用in、out关键字声明shader中的输入和输出变量

  为输入变量传值有两种方式：

   （1）在着色器中声明变量时使用location = t关键字指定顶点属性位置（顶点着色器需要提供一个额外的layout标识），在程序中通过t进行赋值

   （2）在程序中使用glGetAttribLocation（变量名）获取变量的地址，然后再进行赋值

2.在顶点着色器和片元着色器之间传值：

  如果我们打算从一个着色器向另一个着色器发送数据，在发送方着色器声明一个输出变...]]></description><category></category></item><item><title><![CDATA[3.VAO,VBO,EBO]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427925</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427925</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:27:19 +0800</pubDate><description><![CDATA[1.缓冲区的使用：


       //创建顶点缓冲区
       GLuint VBO,VAO,EBO;
       glGenVertexArrays(1,&amp;VAO);
       glGenBuffers(1,&amp;VBO); //该函数用于生成缓冲区对象名称
       glGenBuffers(1,&amp;EBO);
       //绑定缓冲区
       glBindVertexArray(VAO);
       glBindBuffer(GL_ARRAY_BUFF]]></description><category></category></item><item><title><![CDATA[20.初始化着色器]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427890</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427890</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:23:08 +0800</pubDate><description><![CDATA[1.基本步骤：

  （1）创建着色器对象（gl.createShader()）

  （2）向着色器对象中填充着色器程序的源代码（gl.shaderSource()）

  （3）编译着色器（gl.compileShader()）

  （4）创建程序对象（gl.createProgram()）

  （5）为程序对象分配着色器（gl.attachShader()）

  （6）连接程序对象（gl.linkProgram()）

  （7）使用程序对象（gl.userProgr...]]></description><category></category></item><item><title><![CDATA[17.光照（点光源）]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427855</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427855</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:20:46 +0800</pubDate><description><![CDATA[1.点光源产生的漫反射光

 &lt;漫反射光颜色&gt;=&lt;入射光颜色&gt;x&lt;表面基底色&gt;x cosB

 &lt;漫反射光颜色&gt;=&lt;入射光颜色&gt;x&lt;表面基底色&gt;x(&lt;光线方向&gt;x&lt;法线方向&gt;)

  由于点光源产生的光线在物体表面任意一点的入射角度都不相同，需要先计算入射方向矢量（由点光源指向顶点），根据矢量做减法在几何中的意义：

   &lt;光线方向&gt;=&lt;光源位置矢量&gt;-&lt;...]]></description><category></category></item><item><title><![CDATA[16.光照（平行光）]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427820</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427820</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:17:55 +0800</pubDate><description><![CDATA[1.基本概念：

  着色：根据光照条件，重建“物体表面明暗不一效果”的过程

  光源类型：

   （1）平行光：没有衰减的平行的光线，类似于太阳光。用一个方向和一个颜色定义。

   （2）点光源：理想化为质点点光源，类似于人造灯泡，有光线衰减。用光源位置和颜色定义。

   （3）环境光：用于模拟真实世界中的非直射光（由光源发出经过墙壁或其他物体反射的光）。只需要指定颜色。

  反射光取决于以下两个因素：

   （1）入射光（入射光的方向和颜色...]]></description><category></category></item><item><title><![CDATA[15.通过索引访问顶点数据]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427804</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427804</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:13:43 +0800</pubDate><description><![CDATA[1.绘制立方体：

  使用gl.drawArrays方法以gl.TRIANGLES方式绘制需要定义36个顶点，以gl.TRIANGLE_FAN绘制需要24个顶点，但是需要调用6次drawArrays方法。WebGL提供了解决方案：gl.drawElements();

API：gl.drawElements（mode，count，type，offset），避免重复定义顶点，保持顶点数量最小

   mode：指定绘图方式

   count：绘制顶点个数（整型）

   ...]]></description><category></category></item><item><title><![CDATA[14.隐藏面消除]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427782</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427782</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:11:19 +0800</pubDate><description><![CDATA[1.隐藏面消除：虽然透视投影已经将场景的深度效果表现了出来，但是要想得到真实的立体效果还需要将物体的前后遮挡关系正确的显示出来。遗憾的是WebGL并没有那么智能

  WebGL在默认情况下会按照缓冲区中的顺序绘制图形，而且后绘制的图形覆盖先绘制的图形。但是WebGL提供了隐藏面消除功能：

  （1）开启隐藏面消除功能：


gl.enable(gl.DEPTH_TEST);


  （2）在绘制之前清除深度缓冲区


gl.clear(gl.DEPTH_BUFFER_BIT);


2.gl...]]></description><category></category></item><item><title><![CDATA[13.可视空间]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427746</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427746</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:08:15 +0800</pubDate><description><![CDATA[1.可视空间：实际观察得到的区域边界。可视空间由水平视角、垂直视角、可视深度（能看多远）定义。

2.分类：

  （1）四棱锥/金字塔可视空间，由透视投影产生。产生的三维场景看上去更有深度感（第一人称射击游戏）

 （2）长方体可视空间，也称盒状空间，由正射投影产生。物体的大小与其所在位置没有关系，用户可方便地比较场景中地物体（比如建筑平面图）。

3.盒状空间（长方体可视空间）

盒状空间由前后两个矩形表面确定，分别称为近裁剪面和远裁剪面，前者四个顶点坐标是（right,top,-near），...]]></description><category></category></item><item><title><![CDATA[12.三维场景绘制]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427731</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427731</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:03:57 +0800</pubDate><description><![CDATA[1.基本概念：

  （1）视点：观察者所处的三维空间中的位置称为视点，视点坐标用（eyeX,eyeY,eyeZ）表示

  （2）视线：从视点出发沿着观察方向的射线称作视线。

  （3）观察目标点：被观察目标所在的点，以此来确定视线。视线穿过观察目标并继续延伸。观察目标点坐标用(atX,atY,atZ)表示

  （4）上方向：最终绘制在屏幕上的影像中的向上的方向，用（upX,upY,upZ）表示。（因为仅确定了视点和观察点，观察者还是可能以视线为轴进行旋转）

  根据上述三个矢量...]]></description><category></category></item><item><title><![CDATA[11.GLSL ES]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108427643</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108427643</guid><author>j_oop</author><pubDate>Sun, 06 Sep 2020 09:00:46 +0800</pubDate><description><![CDATA[1.数据类型：GLSL ES支持两种数据值类型：数值类型（整型、浮点型）和布尔值类型。GLSL ES不支持字符串类型

2.矩阵和矢量：



GLSL ES中，矢量和矩阵的初始化方法遵从一般规律，特别的：初始化矢量时，只传入构造器一个参数，那么构造器会自动地将这个参数赋值给新建矢量的所有元素，如果传入不止一个参数且数量少于矢量元素个数，那么报错；初始化矩阵时，向构造器中传入一个参数，该矩阵代表对角线上元素全是该数值，其余元素全部为0的矩阵，如果传入参数数量大于1又没有达到矩阵要求的个数，那么报错。

3.]]></description><category></category></item><item><title><![CDATA[10.纹理]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108310391</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108310391</guid><author>j_oop</author><pubDate>Sun, 30 Aug 2020 20:24:57 +0800</pubDate><description><![CDATA[1.纹理坐标：st坐标系统，纹理左边的原点位于图像左下角，图像右上角的坐标始终是（1.0，1.0）

2.纹理坐标与WebGL坐标的映射：



3.纹理映射：根据纹理图像，为之前光栅化后的每个图元图上合适的颜色，组成纹理图像的元素称为纹素。

4.纹理映射的过程：

  （1）准备好映射到几何图形上的纹理图像

  （2）为几何图像配置纹理映射方式（几何图形的某个片元的颜色取决于纹理图像中哪个像素）

  （3）加载纹理图像，对其进行一些配置，以在WebGL中使用

  （4）在片元着色器...]]></description><category></category></item><item><title><![CDATA[9.着色器原理详解]]></title><link>https://blog.youkuaiyun.com/j_oop/article/details/108310353</link><guid>https://blog.youkuaiyun.com/j_oop/article/details/108310353</guid><author>j_oop</author><pubDate>Sun, 30 Aug 2020 20:16:53 +0800</pubDate><description><![CDATA[1.几何图形装配（图元装配）：将孤立的顶点坐标装配成几何图形。几何图形的类别由gl.drawArrays()函数的第一个参数决定，装配出来的基本图形（点、线、面）被称为图元

2.光栅化：将装配好的几何图形转化为片元。

3.几何图形装配和光栅化过程：光栅化完成后程序逐片调用片元着色器



  例如下面程序中着色器的执行过程是：

   （1）顶点着色器执行三次，获得三角形的顶点坐标并存放在图形的装配区（有多少顶点就执行多少次）

   （2）开始装配图形，使用传入gl_Posit...]]></description><category></category></item></channel></rss>