
基础
DBBH
成都有合适webgl/webgpu岗位的请私信我
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
BVH树simple
BVH对比OCTree这个结构和八叉树比 我感觉就是层次更明显 物体就被一个节点包围,而八叉树那个硬核划分空间,会有一个物体被多个空间块共有的问题。如何构造感觉这一种方案可以的,按质心然后XYZ轴都划分一次,然后对结果进行评估,看看哪个最合适,评估按是不是分成相等两份来决定,划分一次后刷新当前包围盒,最后是到包围盒中只剩一个对象才停止。示意有三个物体 A B C,总体包围盒B0,然后划拉一刀,分下来,AB一起 C单独一个,C就到底了,AB就要重新计算一个包围盒B1,然后再把B1划拉一刀,分成A ,原创 2021-12-05 20:03:55 · 609 阅读 · 0 评论 -
学习体素化的一点思考
学习体素化的一点思考体素化思考一下static objdynamic obj关于体素化之后的纹理大小2D3D思考取舍方案舍去细节保留细节体素化思考一下要做的事情就是把场景给体素化了 引发了我的一点思考场景内物体分不动的,动的static obj对于不动的来说,初始化的时候体素化了 可实施dynamic obj你动的要体素化要balabala搞很大动静的,感觉顶不住的 暂不考虑他先 或者尝试用ssr啥的关于体素化之后的纹理大小2D如果是32位 51251232/8/1024/1024 =原创 2021-08-07 22:13:24 · 189 阅读 · 0 评论 -
texelFetch的踩坑
emmmm这个接口,我是在webgl2里头使用,平日用他没觉得哪里不对劲。今天借鉴three.js中的unrealBloom实现的时候,发现降采样后的图片放大有明显的像素格子感觉,而three中并无此现象,想来这来自高贵的unreal的算法不可能有这问题。研究了好半天,发现区别就是我用了texelFetch来采样,于是我改成texture,就正常了。这个接口,我明明纹理是linear的,使用texture(map,uv)就好了,我估摸着不支持插值,那么这说明性能好一点。总结如下不需要插值原创 2021-05-17 20:30:07 · 3173 阅读 · 0 评论 -
纹理Texture 纠正理解
之前一直理解的是一个program有自己的slot但是实际不是这样的,slot是全局的,且有max 暂时考虑max=16意味着同时active最多16个图于是用法应该是这样的,初始化的时候gl.useProgram(program);gl.activeTexture(gl.TEXTURE0 + textureID);gl.bindTexture(gl.TEXTURE_2D, data);const addr = gl.getUniformLocation(program, key);原创 2021-05-08 11:28:40 · 249 阅读 · 0 评论 -
如何将空间两个点的父子坐标系对换
A在B的坐标系下,B在世界坐标系下,这种前提下MA=MB*A。得到MA MB是两者的世界矩阵。然后得到INV_MA,B的世界矩阵MB2变为INV_MA*MB就将B转到A的坐标系下了,OVER。如果你想在这个坐标系下旋转,就构建一个RotationMatrix,RotationMatrix*MB2,平移也差不多。回到世界坐标系就乘父节点MA,MA*RotationMatrix*MB2。大概就是这样了。这里是稍微记录一下,担心遗忘,但是应该不会遗忘。...原创 2021-01-20 19:48:54 · 325 阅读 · 0 评论 -
基础知识八叉树射线检测
构建之后,ray会检测子树,击中,则检测是否有物件,如果有物件,就先相交测试。击中或者没击中都继续进去当前子树存在的子树。这样就把击中的所有物件收集起来,按距离排序。这样检测就比遍历所有物体快了很多很多。...原创 2020-08-18 10:18:40 · 588 阅读 · 0 评论 -
基础知识八叉树构建
都是伪代码哈tree{ boundingbox leftfowardup//children1 ...7 chilren maxDeep}一个深度限制,一个包围盒,8个孩子那么需要构建,那就插入物体 物体包围盒是boxnode_level_0检查,是否包围盒大于box,0层级特殊处理,0的包围盒小于box就直接加入0级,return了。继续正常情况,物体包围盒小于0级包围盒。那么就Try一下八个子树,那么分情况。1 如果子树包围盒小于原创 2020-08-17 17:31:14 · 1269 阅读 · 0 评论 -
OpenGL三点求圆心
这是大佬的出处https://blog.youkuaiyun.com/yanmy2012/article/details/8111600思路先手一个平面方程三个点到圆心距离相等 三个方程3-1 2-1联立构造构成这样的矩阵 D移到右边xyz就变为半径就...原创 2020-01-17 09:09:53 · 316 阅读 · 0 评论 -
int 8 16 32 64这些是啥
原文https://www.cnblogs.com/daguonice/archive/2019/07/16/11193884.html Int8, 等于Byte, 占1个字节. Int16, 等于short, 占2个字节. -32768 32767 Int32, 等于int, 占4个字节. -2147483648 2147483647 Int64, ...转载 2019-12-30 10:44:27 · 735 阅读 · 0 评论 -
内存对齐
三条:1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最...转载 2019-12-30 10:24:27 · 120 阅读 · 0 评论 -
图形学数据结构 half-edge
这个东西,看了之后 只有一个感觉WC你看了之后,很可能会感觉俺也一样这是https://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml介绍是用来精细化网格和简化网格用得上的不同的拓扑形状你还要考虑一下是否好使看看人家的点 装的是起点是vert的边和起点xyz人家的边 装的是终点vert然后边...原创 2019-12-16 17:03:30 · 597 阅读 · 1 评论 -
OpenGL 视锥体求法
看了这个https://blog.youkuaiyun.com/qq_31709249/article/details/80175119是高手讲的是假设P是空间的一点(x,y,z)写成vec4(x,y,z,1) 最终[-1,1]的时候P2(x1/w1,y1/w1,z1/w1,1)然后proj*viewModelMatrix之后 第一行是abcd 第四行是efgh 那么a*x+b*y+c*z+d=x1 ...原创 2019-11-26 09:31:00 · 936 阅读 · 0 评论 -
函数指针调用类的成员函数
class A{public:void func(){printf("ff\n");};typedef void(A::*B)();//这个函数指针在类里面和外面都要这样map mp;void g(){mp["11"] = &A::func;}void call(){(this->*mp["11"])();}};typedef原创 2017-09-16 10:04:55 · 612 阅读 · 0 评论 -
辨别相加溢出
读深入理解计算机系统GET的技能。补码加法溢出当x>0 且y>0 时,x+y0负溢出 可以写判断函数int add( int x, int y)//1代表不溢出 比-2^(w-1)小了就+2^w比2^(w-1)大了就要减去2^w{int sum=x+y;int neg_over =x0;int pos_over =x>0&&y>0&&sumreturn !neg原创 2017-09-23 20:36:11 · 514 阅读 · 0 评论 -
C++建立查找删除节点二叉排序树
简历方法。二叉树简历。只是小的在根的左边 大的在右边。。删除 是只写了左右子树都不为空的删除 删掉当前节点。用一个数据来填补空缺。代码里面看H#ifndef H_H#define H_H#include struct Node{ int num; Node*lNext; Node*rNext;};class BinaryTree{public: B原创 2017-01-30 23:01:32 · 363 阅读 · 0 评论 -
std::bind
源码template bind(F&& f , Args&&...args);例子void func(int a,int b){std::cout}struct Foo{void p(int a,int b){cout}}auto f=std::bind(func,_1,_2);f(1,3)=4//auto f=std::bind(fun原创 2017-01-11 17:14:14 · 277 阅读 · 0 评论 -
lua实现快速排序
a={77,5,332,1,3}local low,hight,i,jfunction q(low,hight) local key=a[low] i=low j=hight if(i>=j)then return end while(i<j)do while(ikey)do j=j-1; end if原创 2017-02-03 22:39:03 · 883 阅读 · 0 评论 -
归并排序
先一直拆分。拆成很小的段 再拼回来 拼的时候顺便把序排了#include using namespace std;int a[5] = { 25, 2, 33343, 5, 1 };void merge(int *a, int first, int mid, int last){ int *b = new int[last - first+1]; int k = 0; int a原创 2017-02-03 22:11:43 · 227 阅读 · 0 评论 -
图 简单c++邻接矩阵 无向图
邻接矩阵。就是一个矩阵。存储着各个顶点之间的关系 栗子 权值==0 无关联 >0.就有联系而且 因为无向嘛。。是沿着对角线对称的。 这个适合用于稠密图。不然浪费空间了。struct Graph{ char v[555];//顶点 int edge[555][555];//边与边之间的权值 int n, e;//点 边的数量 };class A{public: e原创 2017-02-15 23:38:51 · 1056 阅读 · 0 评论 -
图 简单滴C++邻接表 无向图
这个邻接表。。就是一个结构体数组。存放着 顶点信息和下一个点的信息。下一个点存着下一个点的信息。有点像简单的哈希表那样子struct PHead head[i] {char VInfo 这个是每个节点的信息 栗子:A B C三个节点 VInfo 分别是A B C 就存储了头结点信息。我是char的嘛。。node 这个就是每个数组保存的链表的第一个节点}struct Nod原创 2017-02-15 23:09:59 · 736 阅读 · 0 评论 -
快速排序
。把整体分块。排序。void Quick(int*a,int l,int r){int key=a[l];int i=l;int j=r; if(i>=j)return;while(i<j) { while(ikey) j--; if(i<j) a[i++]=a[j]; while(i<j&&a[i]<k原创 2017-02-03 20:03:36 · 229 阅读 · 0 评论 -
蒙特卡洛投点求近似PI
PI =3.141592653589793238462643383279502.....怎么做的呢 是在单位圆里面操作的 S=2PI r^2 然后r=1 面积就是PI 外接正方形面积为4 那么很多点 掉在圆里面的概率就是PI/4这个概率P就相当于你在正方形范围内投很多点 在圆里面的点占所有点的比例 P=Num/AllNum 然后PI=P*4这里可以只计算右上角的四分之一圆 概率也是一样...原创 2018-12-08 09:49:48 · 437 阅读 · 0 评论 -
BFS输出路径
BFS就像水那个意思 被挡住的就从边上过去。从0 0 到 3 3 他会扩散过去 这个地图。是随便写的。来看完整马H#ifndef H_H#define H_H#include #include #include #include struct Node{ int x; int y; int feet;};class MAZE{public:原创 2017-02-01 13:20:49 · 738 阅读 · 0 评论 -
学习windows内核一
操作系统通过驱动对象来分发命令。主函数需要驱动对象和注册表路径主函数需要注册一个类似C++析构函数的东西。还是自己实现,删除设备对象和符号链接还有一些自己创建的东西。通过设备对象才能通信,所以需要创建一个设备对象。如果创建成功了就能在驱动对象中拿到他了。然后需要先判断是否创建成功。失败了就返回状态。返回值可以用一个NTSTATUS的变量存放。若成功了,就可以创建符号链接重点:实原创 2017-09-09 23:18:08 · 2880 阅读 · 0 评论 -
通过字符串实例化对象
听说是入门级别的反射。因为一开始不知道要创建哪个类的对象,直到确定名字才创建,所以我到处找资料看,GET的新技能加入一个类,把他注册进去。呃 别人这么讲的,感觉就是字符串和类一一对应起来。由map来存储一个函数,这个函数创建对象。typedef void* (*VOIDFUNC)();Factory类 管理mapRegclass类 只有一个构造函数,负责注册类T*的函数 返回n原创 2017-09-19 11:58:29 · 1308 阅读 · 0 评论 -
std::function
源码templateclass function;例子void func(int a){std::cout};std::functionf=func;//函数类型 参数类型f(10);std::functionf=std::bind( func,_1 );//std::functionf=std::bind( func, 10 );f(10)原创 2017-01-11 21:16:17 · 275 阅读 · 0 评论 -
C++类型转换访问私有变量
#include<iostream>using namespace std;class A{public: A(int a1, int a2);private: int a; int b;};A::A(int a1, int a2) :a(a1), b(a2){}class B{public: int a = 1; int b = 3;};in...原创 2019-09-17 15:44:22 · 159 阅读 · 0 评论 -
C# 学习使用IntPtr
IntPtr _ptr = Marshal.AllocHGlobal(xxxx);申请空间 Marshal.Copy(Data, Offset, _ptr, xxxx);data的offset开始取xxxx长度给_ptr Marshal.FreeHGlobal(_ptr);释放使用泛型方便数据转换copy之后配合(Type)Marshal....原创 2019-09-06 08:57:57 · 1651 阅读 · 0 评论 -
js es6 继承 简单记一下
class A{ constructor(a) { this.a=a; } log() { this.a=0; }}class B extends A{ constructor(a) { super(a); this.a=a; } blog()...原创 2019-05-06 10:08:19 · 401 阅读 · 0 评论 -
PBR 环境光的diffuse部分学习
看的是learnopengl的教程这一部分,讲的就是步骤1 把一张hdr读进去 然后拆给cubeMap1 步骤2 把cubeMap1卷积了 弄出一张irradianceMap步骤3 ambient部分就可以用反射光线采样irradianceMap这样就有了diffuse部分了直接光部分还是之前教程中的样子unsigned int captureFBO; uns...原创 2019-02-22 09:30:03 · 851 阅读 · 0 评论 -
OpenGL 鼠标位置转换世界坐标系 射线实现方法
[-1 -- 1]mousex [1 -- -1]mousey裁剪坐标系全是 1 -1 直接就z=1 x=2*mousex/winWidth-1; y=1-2*mousey/winHeightvec4 posNDS(x,y,z,1.0) 然后本身是MVP得到的pro的逆矩阵*posNDS一下得到视觉坐标系 再view的逆矩阵*一下 得到世界坐标系然后全部/W 这里W是1 相机位置搭配这...原创 2018-05-30 18:22:07 · 1402 阅读 · 0 评论 -
QT OpenGL 天空盒
正常加载shader program 就是图片不一样了 立方体贴图 可以看看learnopenglQT里面封装了QOpenGLTexture这个类设置target就可以加载立方体贴图initTextures(){ const QImage posx = QImage(":/left.jpg").mirrored().convertToFormat(QImage::Format_RGB...原创 2018-05-27 15:37:39 · 951 阅读 · 2 评论 -
C++11学习生产者消费者
就是有一个东西 有人生产有人用#include<iostream>#include<thread>#include<mutex>#include<condition_variable>#include<list>#include<memory>using namespace std;#define MaxSize 5std...原创 2018-02-24 16:17:05 · 375 阅读 · 0 评论 -
C++读文件夹下面的文件名字
参考各个司机的博客写的。#include #include #include #ifdef linux#include #include #endif#ifdef WIN32#include#include #include #endifvector getFiles(string mulu){ vector files;原创 2018-01-10 15:16:16 · 265 阅读 · 0 评论 -
辨别大小端
看了深入理解计算机系统 GET的技能int x=0x12345678;unsigned char*p =(unsignded char*)&x;printf("%x",*p);如果是78就是小端了。书上说支持intel的大多数是小端。原创 2017-09-20 14:52:20 · 215 阅读 · 0 评论 -
class new delete的一点理解
今天写代码。发现前面new了一个pHead后面在另一个函数里。void A::FIND(){Node*p=pHead;//do something delete p;} 没有报错不是很明白为什么不是按道理。new才会使用delete配对吗?这里没有出现new怎么使用delete成功了啊后面问大大 说原创 2017-01-30 20:20:44 · 585 阅读 · 0 评论 -
二叉树简历 先序遍历
线序遍历 根左右 中序遍历 左跟右 后序遍历 左右根建立二叉树一个结构体 含有数据 左子树 右子树struct Node{char c;Node*lNext;Node*rNext;}只有线序遍历。但是都差不多的。。完整马 。开始注释#include using namespace std;int num = 0;struct Node{ cha原创 2017-01-29 10:20:24 · 350 阅读 · 0 评论 -
学习C++哈弗曼树
每次找出最小的俩顶点 构建一棵小树 再跟原来的树拼起来。就成了新的树。。直到只剩1个顶点 构建成功#ifndef H_HPP#define H_HPP#include // 栗子 1 2 4 6 每两个顶点 都把权值相加合成一个新顶点 直到剩下一个点 就构建完成这个哈夫曼树了。 // // 13// 6 7//原创 2017-02-17 23:49:55 · 338 阅读 · 0 评论 -
KMP字符串匹配。。学习。
呃 感觉多亏看了一个歪果仁的视频 10多分钟。。不认识是谁 -v-这个算法时间复杂度O(m+n) 不回溯例如 a c b c a c b -1 0 0 1 0 1 2 这个是Next数组 当你每次匹配失败时候。。这个匹配串的作用 例如 当时是下标是j,匹配失败了, 就要回到Next[j-1]+1 。。你失败那个位置之前一步肯定没失败吧 不然就不匹配到这了,原创 2017-02-09 16:57:04 · 240 阅读 · 0 评论 -
C++文件读写
想了想。。计算机里面的文件。。再怎么变也还是机器码。。0101嘛。。二进制读写文件。。稳试了试。。png mp4格式都可以。void playPNG(){ ifstream in("1.png", ios_base::binary | ios_base::in); if (in.is_open()) { in.seekg(0, ios::end); int pSize = i原创 2017-01-18 21:49:29 · 226 阅读 · 0 评论