- 博客(67)
- 资源 (9)
- 收藏
- 关注
原创 渲染管线——透视投影变换
综述透视投影变换是渲染管线几何阶段最难理解的地方,实际上,透视投影变换这个过程是要分解成好几个子过程的,它的目的是把物体的三维视图坐标变换为可以在屏幕上描绘出来的二维屏幕坐标。 现在理清一下渲染管线几何阶段的过程:可以看出,透视投影变换被分解为了三个子过程 1.齐次裁剪变换 : 在该过程中主要是通过Camrea、远近平面、宽高比、视角等信息求出投影变换矩阵,并对结点进行变换,变换后结点在齐次裁剪
2020-08-15 15:30:21
2874
原创 [Redis] Windows10搭建Redis集群
准备(1) 安装RedisWindwos环境下使用Redis最方便的方法是直接下载微软出的3.2.1的Release版本https://github.com/microsoftarchive/redis/releases(2) 安装Ruby运行环境Redis集群的控制脚本是使用Ruby编写的,所以我们需要安装Ruby的运行环境,建议从这里下载http://dl.bintray.com/...
2020-04-07 16:21:18
742
原创 两种常用的并发模型:CSP和Actor
概述现如今的机器大都是多核的CPU架构,为了充分利用计算机的资源,我们要了解一些并发编程的思想。大家应该都了解传统的并发编程模式,多线程编程。传统的多线程编程实际上是使用的ShreadMemory的方式来推动程序的前进。为什么说new一个thread的方式是共享内存呢?有并发的地方就有竞争,传统多线程的并发模式使用locks(锁),condition variable(条件变量)等同步原...
2020-03-30 17:44:26
7117
1
原创 VSCode:Remote-SSH配置实录
为什么要使用VSCode:Remote-SSH服务器很多时候都是部署在Linux远程机器上的,我们通常是SSH连过去然后用vim或者emacs去修改源文件。这种方式对我来说很麻烦,因为我已经习惯了全宇宙最好用的C++IDE Visual Studio,离开IDE写代码实在太痛苦了。所以我只能借助samba+sourceinsight的组合来勉强度日。这个组合其实是比较好的,只不过配置特别麻烦...
2019-05-08 11:20:40
166887
25
原创 [SSH]客户端和服务器配置实录
客户端配置安装SSH生成SSH秘钥对 :ssh-keygen -t rsa -b 4096 (-b 4096表示生成的rsa秘钥对的长度是4096个bit) 在输入该指令后,会让我们指定秘钥文件的生成目录:此时输入你想放入的目录和名字,最后会得到两个文件,以上图为例,会在c:\user\administrator\.ssh这个目录下生成:id-rsa和id-rsa.pub两个文件, 第一...
2019-05-05 17:05:55
15646
2
原创 Centos7 安装LLVM+Clang实录
LLVM目录及源码下载mkdir -p ~/llvmcd ~/llvm//llvm源码wget http://llvm.org/releases/3.5.0/llvm-3.5.0.src.tar.xztar xf llvm-3.5.0.src.tar.xzrm llvm-3.5.0.src.tar.xz//clangwget http://llvm.org/releases/3....
2018-11-29 14:39:22
10327
2
原创 Centos7 工作环境配置
常用组件yum -y install wgetyum -y install gcc gcc-c++ make automakeyum -y install treeyum -y install gitCMake安装获取CMake源码 wget https://cmake.org/files/v3.12/cmake-3.12.4.tar.gz解压 tar -zxvf cmake...
2018-11-08 15:29:56
714
原创 [C++]记在Linux下使用std::thread的错误
描述VS2017 使用Visual Studio For Linux远程连接到T家的云服务器上进行开发。 在某个地方用到了C++11标准之后的std::thread. 编译正常,在运行时遇到了错误:│terminate called after throwing an instance of 'std::system_error'│what(): Enable multithr...
2018-08-21 17:01:56
5726
原创 [C++]顺序容器和关联容器的删除
概述一个合格的容器(Container)必须支持增删改查,C++的顺序容器和关联容器也不例外。 不同于insert和search,erase操作涉及到多种情况,尤其是和迭代器相结合的时候。 本文总结常用C++常用容器的erase的正确做法。顺序容器:vector,dequeue,list,string关联容器:set,map,unordered_set, unordered_map...
2018-08-08 17:46:33
1446
1
原创 [C++]mkgmtime的思考和实现
概述时间信息struct tm 和时间戳time_t之间的转换是十分常见的,如要搞清楚他们之间的变换规则,还是应该首先明白他们具体代表的含义。time_t 时间戳的类型,实际上是一个int64_t的类型,它记录了从1970年01月01日00时00分00秒到现在所经过的秒数在C语言中我们一般使用time接口来获得。#include <ctime>time_t...
2018-08-03 19:11:06
3754
1
原创 [C++]固定大小线程池
线程池模型线程池是并发编程中常用的模型。 线程是一种非常宝贵的资源,创建、销毁线程都是非常消耗时间的操作,所以我们的一个思路是在程序start up的时候,创建一个保存有多个线程的缓存,这样程序运行时就不会频繁的发生创建和销毁线程的操作,从而提高了并发的效率。 保存有多个线程的这个缓存,我们一般称其为线程池(ThreadPool)。如果线程池的中线程的数量可以动态变化,我们称其为动态大小的...
2018-07-24 14:53:18
680
原创 [C++]C++同步
互斥锁互斥是为了防止多线程同时访问共享资源而产生的数据竞争,并提供多线程的同步支持。 我们举一个简单的例子:static int gInt = 1;int main(){ std::thread dec( []() { for (int i = 0; i < 1000000; ++i) gInt--; } ); std::thread inc( []() {...
2018-07-11 17:17:00
1990
原创 [Go]Golang引入Protobuffer
准备在Golang中使用Protobuffer非常简单。1.安装protobuffer的环境你可以选择直接github上下载proto源码然后自行编译,这部分教程一大把不再赘述。 为了省心(偷懒),我打包了一份protobuffer2.6版本的release版,还包括给C#和Go使用的可执行程序。 连接在:protobuffer2.6下载 解压之后你会看到如下文件结构: ...
2018-06-01 11:15:55
1930
原创 [Go]Go的数组和切片
数组如果你之前比较熟悉C和C++,那么请忘掉C和C++的关于数组的定义,在Go里边发生了比较大的变化。首先,我们看一下Go如何声明一个数组 var array1 [10]int //1.常规的数组声明方法,它的类型是[10]int,数组长度被认为是数组类型的一部分 var array2 = [10]int{1, 2, 3} //2.常用用法,...
2018-05-22 15:49:01
618
1
原创 [趣味算法]如何判断一个点是在三角形的内部还是外部?
问题描述问题描述:判断二维平面上一个点P是在三角形ABC的内部还是外部。前辈们给我们总结了许多办法,这里我给出一个比较直观也比较简单的办法。 在讲这个办法之前,我们先看另一个问题。如果给定一条线段AB和点C,能否判断出来C和AB的位置关系呢? 这里的位置关系是指C是在线段AB上,还是在AB的左边,又或者是在AB的右边呢? 也许我们对左边还是右边的定义不明确,给一个图体会一下:...
2018-04-02 17:16:55
12997
8
原创 [Unity]场景基础
1.在仅初始化一次的场景配置全局数据游戏必定会存在场景转换的需求,但是有些数据我们是不想在每次加载新场景都实例化它的。 比如玩家的数据,网络管理器,声音管理器,全局管理器等等。 在Unity中有个接口,可以帮助我们实现这样的要求:using System.Collections;using System.Collections.Generic;using UnityEngine...
2018-03-27 17:01:44
3332
原创 硬链接和软连接
硬链接和软连接Linux和Windows的文件系统的设计几乎是完全不同,但是为了更好的组织文件,方便文件的查询,都有硬链接和软连接(符号链接)的概念。这两个概念一直不太清楚,这里整理一下。文件数据分为两块: (1)文件持有的数据:文件存储的数据 (2)文件的元数据:文件的属性数据,例如文件的名字,路径,操作权限…..在文件的元数据中有一个非常重要的属性,在Linux系统中称为i...
2018-02-22 19:27:29
855
原创 使用Visual Studio一劳永逸式配置OpenGL开发环境(GLFW3+GLAD)
引子OpenGL版本众多,需要引入额外的第三方库才能很好的满足我们平时渲染的需求,对于刚开始学习的同学们比较麻烦。 我也多次遇到很多落后的配置教程,浪费了时间不说,也会自己技术和现代OpenGL的技术脱节。 在当前的时间点(2018年),学习OpenGL如果还从glBegin()和glEnd()那一套就太落伍了,这个教程是为了示范如何配置OpenGL3.3以上的环境。 另外推荐学习Ope
2018-01-15 19:42:33
9669
1
原创 法线贴图和切线空间
Normal Maping法线贴图是一种特殊的texture,法线贴图中每个像素存储的不是rgb颜色值,而是该片元的法向量。 法向量可以决定物体表面的凹凸情况,使用法线贴图可以在几乎不增加性能消耗的情况下,使得渲染出来的物体更有凹凸感,看起来更为真实。图1: 法线贴图的使用非常方便,只需要当做平常的texture一样对它进行采样,采样的值作为normal而非rgb。 下面是一个简
2018-01-10 11:58:39
9422
1
原创 [Modern OpenGL]谈谈VAO、VBO、IBO
OpenGL中的VAO、VBO、IBO刚开始学习OpenGL的时候可能会对VAO、VBO、IBO的概念有些模糊,只是记得这些术语和API。 理清概念才能更好的使用这些API,下面我们花20分钟的时间谈谈这些术语。VBO : Vertex Buffer Object,顶点缓冲对象。这里的Object和面向对象编程没有太大关系,他俩之间最沾边的就是合理的使用了抽象这一概念。 我们都知道所有的顶点
2018-01-02 15:11:17
3774
1
翻译 [译]齐次坐标系
原文地址问题:两条平行直线可以相交在欧氏几何中,同一平面的两条直线是不可能相交的,这是大家都熟悉的常识。但是,在一个透视空间中,这是不正确的。 上图的铁路随着距离我们的视线越来越远,它们变得越狭长。最终,视线中的两条平行线在无限远处的一点相交了。欧式几何非常适合描述我们的2D/3D几何空间,但是不足以来描述透视空间了。(实际上,欧式几何是透视几何的子集)。在笛卡尔坐标系中,一个二维坐标可以用(x,
2017-09-29 18:25:07
933
原创 [C++]浅谈C++中的const
从基本用法说起1. 修饰变量const是constant的一个表示,字面上来看,以const修饰的是一个常量。实际上,这是一个误解,或者说是历史遗留的问题,用readonly来表示const更为妥当。最简单的例子,我们都会使用:const int x = 5;x = 10;//error下面我们看一个例子,可能和你印象中的const就不一样了~int main(int argc, char* a
2017-09-27 11:45:14
433
原创 透明物体的渲染
概述一般来说,我们使用Alpha Test(透明度测试)或者Alpha Blend(透明度混合)来实现透明效果,其中Alpha Blend(之后简称)Blend可以实现真正的半透明效果。无论哪种实现方式,我们都需要关闭透明物体的深度写入(禁止ZWrite)。为什么要关闭透明物体的深度写入?设想一种情况,假设半透明物体A在不透明物体B的前面。如果开启了深度写入,那么由于A在B的前面,ZBuffer中存
2017-09-26 11:35:01
3083
1
原创 基本光照
Phong光照模型现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的,所以我们使用数学和物理工具来简化和描述现实世界的光照,使得最终呈现的效果尽可能的接近现实。其中,我们最常用的一种称为Phong(冯氏)光照模型。Phong光照模型使用环境光(ambient),漫反射光(diffuse),高光反射(specular)三个分量来描述一个被光照射的物体的光照颜色。
2017-09-11 16:22:17
550
原创 固定管道软件渲染器
缘起童年时候“丰富”的玩游戏的经验让我顺便对计算机产生了浓厚的兴趣。 不像贴吧十几岁就开始写引擎的大神们,我对游戏开发是一窍不通的。 而我巧不巧的又是一个偏执的人,总认为所谓的“内功不深厚”是做不好一件事情。游戏开发的内功大概有很多,可是我想计算机图形学作为游戏开发的内功应该不会有人介意吧? 本科期间,并没有任何课程是和计算机图形学的,网上的课程大都是用OpenGL或者DirectX来讲解,原
2017-09-05 16:34:28
501
原创 [Unity5.X]AssetBundle总结
AssetBundle简介当我们提到AssetBundle时,实际上有两层含义。AssetBundle打包的资源,存在于我们的硬盘上或者远端的服务器上。此时,可以认为AssetBundle特指被压缩过的文件,包含Model、Texture等。在运行时,我们可以动态的加载这些对象到我们的场景当中。AssetBundle对象。这是对AssetBundle打包的资源的抽象,作为游戏访问资源的接口。实际
2017-07-28 15:44:47
1376
原创 [Unity]构造函数与单例模式
从BUG说起在实现一个小功能时,遇到了一个bug,代码如下:public class EnemySpawner : MonoBehaviour { #region singleton private EnemySpawner() {} private static EnemySpawner _instance = null; public static EnemySp
2017-07-26 17:59:15
2931
原创 [C/C++] LIB和DLL的区别与联系
在讲解.h .lib .dll的关系时,回顾一下C/C++从源文件到.exe的过程: 上图可以帮助我们理解C/C++的构建过程,当你有了一些开发经验之后,你会遇到.lib .dll两种文件,很容易把人绕晕,结合上图,总结一下为什么要使用.lib和.dll,以及他们的区别.实际上,假如我们引用了在其他文件实现的函数,那么在我们执行链接之前,函数的入口地址我们是不知道的,C/C++的编译器给我们留了很
2017-07-20 17:13:21
2874
原创 [C#]扩展方法
C#的扩展方法可以实现对已有的类添加方法的同时,无需创建新的派生类或者修改原来的类。 我们直接看一个例子:namespace CSharp { public static class StringExtensions { public static int WordCount(this string str) { return str.Split(
2017-07-20 15:15:02
407
原创 [C#]Where关键词的用法
where(泛型类型约束)where关键词一个最重要的用法就是在泛型的声明、定义中做出约束。 约束又分为接口约束、基类约束、构造函数约束、函数方法的约束,我们慢慢介绍。接口约束顾名思义,泛型参数必须实现相应的接口才可以,看一个例子:public interface IAccount { string Name { get; } d
2017-07-19 15:43:46
15881
2
转载 C# 中的委托和事件
原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx引子委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(
2017-07-12 16:30:23
334
原创 Lua面向对象编程
概述Lua中的table本身就是一种对象table和对象一样可以拥有状态、属性,以及对这些状态和属性的操作table和对象一样拥有独立其值的标志(self)table和对象一样具有独立于创建者的生命周期,换句话说,就是自己掌握自己的生命周期但是,和C++、Java语言不一样,它并不存在显示的关键词(例如,Class)来描述一个类,所以我们只能利用table和元表机制来模拟类Lua的面向对象是
2017-07-11 17:32:18
471
原创 [坑]Unity5.X—— AssetBundle
首先,应当给资源设置AssetBundleName 这里设置的是shape/cube,注意只能小写,可以利用/进行分层设定完毕后,创建一个Editor文件夹并创建脚本BuildAssetBundle,扩展编辑器,代码如下using System.Collections;using System.Collections.Generic;using UnityEditor;using Uni
2017-07-04 17:19:20
964
原创 渲染管线——光栅化之Bresenham绘线算法
在完成了渲染管线的几何阶段之后,我们得到了三维物体在屏幕上的二维坐标,接下来,我们将进行光栅化操作。光栅化计算机屏幕是由点阵构成的,这些点阵称为像素。显然,这些像素是离散的,我们是不可能精确的绘制出绝对意义平滑的直线。所谓的光栅化,就是将图形填充到像素格上。 这里又分为线框模式的填充和实心填充。 所谓线框模式的填充,就是只描绘出三维物体的外边框。 实心的填充,即根据结点的各种几何信息,填充在像
2017-05-25 14:43:55
2373
原创 渲染管线——背面消隐
什么是背面消隐我们使用三角网格描述物体,在物体被转换到视空间之后,下一步就将被转换到屏幕坐标。 背面消隐指的是删除背向视点(相机的观察点)的多边形。算法原理基本的背面消隐算法数学原理很简单: (1)要求所有的三角形按照统一的方式(顺时针或者逆时针)排列顶点,这很重要,因为关系到平面法向量的计算。 (2)根据三角形的顶点信息计算该三角形的外法向量。 (3)使用观察向量(观察向量是指相机点到三角
2017-05-23 10:42:28
4101
原创 渲染管线——视图坐标与相机模型
3D游戏中的所有物体都是围绕着3D相机渲染的,这表明我们仅仅把物体转换到世界坐标系是不够的,还需要设定一个抽象的相机,来观察我们整个3D世界。UVN相机模型相机很像是模拟人的眼睛:其中视平面就是类似人的视网膜,我们在现实生活中看到的物体最终会被我们的大脑“渲染”到我们的视网膜上面。 所有位于近裁剪面和远裁剪面这个椎体(称为视椎体,视椎体描述了视空间)内的物体可以被我们观察到,且距离我们越远看到的物
2017-05-22 16:39:50
3009
原创 渲染管线—局部坐标到世界坐标的转换
局部坐标和世界坐标世界坐标是指3D空间的坐标系统,当我们制作模型时,并不清楚模型所在的世界的坐标系统是如何规定的,都是使用局部坐标系来建立模型。这样模型制作人员只需要负责好建立自己的模型即可。转换原理我们假设使用Model类来抽象一个物体class Model{ Vector3D Position;//物体的在局部坐标系的位置 Vector3D WordPosition;//物体在世
2017-05-22 14:45:31
3738
2
原创 OpenGL + VS2015 + Win10 64位开发环境配置
引子OpenGL的GLUT库已经不再支持64位系统,但现今大多数新的的PC都是Win10 64位,而且网上配置教程太老了,这就使得配置开发环境颇费时间。在此记录下配置过程来供大家参考。0.准备工作1.Visual Studio 2015:建议选用Community版本2.FreeGLUT源代码:很遗憾,没有提供给我们已经编译好的版本,所以我们需要用自己编译源码。现在比较稳定的是FreeGLUT3.0
2017-03-27 19:49:28
14428
16
转载 [转]透视矩阵
原文地址透视矩阵详解1.概述投影变换完成的是如何将三维模型显示到二维视口上,这是一个三维到二维的过程。你可以将投影变换看作是调整照相机的焦距,它模拟了为照相机选择镜头的过程。投影变换是所有变换中最复杂的一个。2.视锥体(View Frustum)视锥体是一个三维体,他的位置和摄像机相关,视锥体的形状决定了模型如何从camera space投影到屏幕上。最常见的投影类型-透视投影,使得离摄像机近的物体
2017-01-24 16:04:08
1796
原创 [计算机网络学习笔记]:协议概述
引言我们每天使用的互联网是如何构造出来的呢?全世界几十亿台设备是如何做到“互连”的? 计算机网络是计算机专业必不可少的子学科,了解这些貌似偏“硬”的知识好像对于我们写代码没有什么帮助,不过深入探索上述的两个问题对于理解整个网络体系有着很大的帮助。首先来讲举例子,解释一些名词。网络 :我刚开始有自己的计算机的时候,理解的网络就是上网,能打开“百度”。实际上,在计算机学科中,两台(或者以上的电脑)在
2016-04-09 17:22:29
4916
Visual Studio 搭建好的OpenGL环境(GLFW3+GLAD)
2018-01-15
编译好的assimp动态链接库[适用于win10]
2017-09-29
glad和stb_image静态库
2017-09-29
C# 软件渲染器
2017-09-05
FreeGLUT编译材料
2017-03-27
Foundations of Qt Development
2016-05-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人