自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 在OpenGL顶点着色器中,w是什么,为什么除以w?(In OpenGL vertex shaders, what is w, and why do I divide by it?)

顶点数据经过mvp变换下一步先要divide by w用来标准化设备坐标:标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上。与通常的屏幕坐标不同,y轴正方向为向上,(0, 0)坐标是这个图像的中心,而不是左上角。最终你希望所有(变换过的)坐标都在这个坐标空间中,否则它们就不可见了。顶点着色器代码:void main(void){ vec4 clipCoord = glModelViewProjectionmat..

2020-08-10 12:48:59 15

原创 学习笔记(17):3D图形理论-固定渲染管线实现

课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。...

2020-08-10 12:01:13 36

转载 C++堆和栈区别

C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C

2020-06-01 20:51:40 47

原创 cocos2dx 自动裁剪

自动裁剪在draw函数内执行,由renderer->checkVisibility(transform, _contentSize)实现,判断该渲染指令是否被裁减掉,如果裁剪掉不显示,就不会把该渲染指令加入到渲染队列。void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags){#if CC_USE_CULLING // Don't do calculate the culling

2020-05-31 16:19:18 83

转载 1. 转换构造函数 2. explicit关键字 3. 类型转换函数

1. 转换构造函数类的构造函数可以定义不同类型的参数,当参数满足下列条件时,就可称其为转换构造函数。函数仅有一个参数 参数是基本类型或者其他类类型其中,有一种特殊情形,也可构成转换构造函数。函数有多个参数,但除了第一个参数外,其余都是默认参数 第一个参数是基本类型或者其他类类型 函数调用时只使用一个参数C++编译器在进行编译工作时,会尽力尝试让源码通过编译,因此如果碰到了这样的代码Test t = 100,编译器不会立即报错,而是进行以下尝试:查找类中是否有定义转换构造函数 如果

2020-05-30 23:58:43 55

原创 C++函数传值和传引用

如果参数类型是自定义类型推荐使用传引用而不是传值,因为传值的时候会调用构造和析构,还会拷贝一份实参的副本,造成一些开销。还有一个原因是传值在传派生类对象的时候,如果函数的参数是基类类型。会造成对象切割问题,对象切割不会触发多态。C++底层对引用的实现,实际是用指针实现出来的,对于C++内置类型,比如int、char这些,传值往往比传引用更高效一些。同样适用的还有stl的迭代器和函数对象,这些设计时候被设计为传值。c++对象切割的情况:1.当把一个派生类对象赋给一个基类对象时,会发生对...

2020-05-30 23:41:21 48

原创 学习笔记(15):OpenGL-压缩纹理

课程涵盖了OpenGL开发的方方面面,对开发中经常用到的开发知识点进行讲解,从实战的角度进行编码设计.第1章-环境建立第2章-基础图元第3章-三维世界第4章-纹理多彩世界第5章-显存的分配-优化第6章-场景控制第7章-光照-真实世界第8章-模型第9章-UI制作第10章-场景编辑器制作第11章-地形第12章-脚本引入-lua...

2020-05-30 22:31:42 49

原创 学习笔记(14):OpenGL-坐标系,观察矩阵,投影矩阵基本原理

课程涵盖了OpenGL开发的方方面面,对开发中经常用到的开发知识点进行讲解,从实战的角度进行编码设计.第1章-环境建立第2章-基础图元第3章-三维世界第4章-纹理多彩世界第5章-显存的分配-优化第6章-场景控制第7章-光照-真实世界第8章-模型第9章-UI制作第10章-场景编辑器制作第11章-地形第12章-脚本引入-lua...

2020-05-29 23:24:38 47

原创 学习笔记(13):OpenGL基础教程-视口矩阵的理解

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-28 23:30:20 49

原创 学习笔记(12):3D图形理论-投影和观察矩阵

课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。...

2020-05-28 22:57:27 58

原创 .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。

static的作用:对变量:1.局部变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。1)内存中的位置:静态存储区2)初始化:局部的静态变量只能被初始化一次,且C中不可以用变量对其初始化,而C++可以用变量对其初始化。(详见:http://www.cnblogs.com/novice-dxx/p/7094690.html)3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。注:当static用来修饰局...

2020-05-26 22:47:07 40

原创 C++ 四个智能指针shared_ptr, weak_ptr,  unique_ptr, auto_ptr

C++中的四个智能指针shared_ptr, weak_ptr, unique_ptr, auto_ptr 其中前面三个是C++11支持并且最后一个已经被C++11抛弃。智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄露。使用智能指针可以很大程度上的避免这个问题。因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间。不需要手动释放内存空间。1). auto_ptr.

2020-05-26 22:30:52 25

原创 学习笔记(11):OpenGL基础教程-重新实现常用的OpenGL函数

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-25 21:49:18 25

原创 cocos 中每个节点的visit与draw函数

visit函数内会先调用自己的draw函数,然后变量所有子节点递归调用字节的visit:cocos渲染流程是从Director类的主循环mainLoop中开始:1.调用drawScene()://精简后的代码,方便理解void Director::drawScene(){ /*此处省略一些代码 ..... */ _renderer->clear(); pushMatrix(MATRIX_STACK_TYPE::MATRIX_ST..

2020-05-24 22:15:00 87

原创 C# 中 String 跟 string 的区别

C# 中 String 跟 string 的区别string 是 C# 中的类,String 是 .net Framework 的类(在 C# IDE 中不会显示蓝色) C# string 映射为 .net Framework 的String 如果用 string, 编译器会把它编译成 String,所以如果直接用 String 就可以让编译器少做一点点工作。如果使用 C#,建议使用 st...

2020-05-22 17:45:50 36

原创 那些函数不能定义为虚函数

经检验下面的几个函数都不能定义为虚函数:1)友元函数,它不是类的成员函数2)全局函数3)静态成员函数,它没有this指针4)构造函数,拷贝构造函数,赋值运算符重载可以(但是一般不建议作为虚函数)...

2020-05-20 14:02:09 61

转载 C++ 之 多态

静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,函数重载就是一个简单的静态多态动态多态:它是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。即: 在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法。动态多态的条件:●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。●通过基类对象的指针或者引用调用虚函数。重写:(a)基类中将被重写的函数必...

2020-05-20 13:01:30 39

原创 向量、坐标和坐标系之间的关系:

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-03 21:03:03 186

原创 学习笔记(09):OpenGL基础教程-动画的实现原理

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-03 20:13:33 156

原创 cocos中的JNI调用

1.C++层调用Java:使用jni文件夹下面JniHelper类的getStaticMethodInfo、getMethodInfo获取java层的函数。(具体实现函数实现可知)2.java层调用C++层:java层声明native函数,这个函数由Jni(C++)层实现,java层是如何通过native函数找到C++层的函数的?需要把C++这些函数要注册到jni中,jni方法注册...

2020-05-03 17:28:59 74

原创 cocos游戏客户端优化方案

1.纹理碎图资源进行图集合并,尽量少空白,图集大小尽可能限制在1024*1024以下,同一个逻辑界面使用一张图,减少同一时间无用纹理的加载。2.指定合理的资源释放策略,保证纹理能够在不频繁重复加载的情况下,及时释放纹理资源。比如每隔2分钟释放掉所有没被引用的资源缓存、内存达到一定峰值也释放一次。3.图片纹理资源尽量采用RGBA_4444、RGB565等占用内存较小的纹理格式,还可以对...

2020-05-03 01:03:01 102

转载 python字符串拼接的7种方式

1、来自C语言的%方式 1 2 print('%s %s' % ('Hello', 'world')) >>> Hello world %号格式化字符串的方式继承自古老的C语言,这在很多编程语言都有类似的实现。上例的%s是一个占位符,它仅代表一段字符串,并不是拼接的实际内容。实际的拼接内容在一个单独的%号后面,放在一个元...

2020-05-02 22:43:15 144

原创 学习笔记(07):OpenGL基础教程-纹理

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-05-01 23:14:55 89

原创 Lua函数的尾调用

所谓尾调用,就是一个函数返回另一个函数的返回值:function f()…return g()end因为调用g()后,f()中不再执行任何代码,所以不需要保留f()的调用桟信息;Lua做了这样的优化,称为"尾调用消除",g()返回后,控制点直接返回到调用f()的地方。这种优化对尾递归非常有益,通常递归意味着调用桟的不断增长,甚至可能造成堆栈溢出;而尾递归提供了优化条件,编译器可...

2020-04-27 18:22:59 72

原创 cocos合批绘制

Cocos中,对于使用相同贴图且没有自定义uniform变量且采用默认绘制指令TrianglesCommand或QuaCommand的节点可以进行自动合批绘制合批绘制的本质是将两个模型动态合并为一个模型,并使用相同的材质在一个DrawCall中进行绘制,以减少DrawCall数量,提高运行效率。Cocos判断两个uniform是否能够合批,靠的是通过GLProgram、TextureID和...

2020-04-27 14:04:00 241

转载 GPU: 渲染管线流程简化版

GPU:渲染管线(道)流程:顶点着色器 - 光栅化 - 片段着色器 - alpha测试 - 模板测试 - 深度测试 - blend - Gbuffer - frontBufffer - frame Brffer - 显示器流程步骤详细分析:顶点着色器:1. 计算顶点的颜色。2. 将物体坐标系 转换到 相机坐标系。光栅化:将顶点 转换成 像素。比如由4个顶...

2020-04-27 11:51:47 55

原创 Cocos2d-x 渲染器Renderer

渲染队列RenderQueueRenderQueue遍历场景时会生成渲染命令,生成的渲染命令存储在渲染队列中。渲染队列RenderQueue会将命令分层5类存储,分别是:class RenderQueue {public: /** RenderCommand will be divided into Queue Groups. 渲染队列RenderQueue把渲染命令...

2020-04-26 23:36:14 82

原创 学习笔记(06):OpenGL基础教程-光照的调试技巧

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-03-28 18:04:33 28

原创 图片Alpha预乘的作用

为什么要有预乘透明度呢因为Alpha-Blending,所谓Alpha-Blending,其实就是按照“Alpha”混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。混合公式:最终图像 = 第一张图的RGB*第一张图的的alpha通道+第二张图的RGB*(1-第一张图的的alpha通道)透明度叠加原理(先不管是哪种叠加方式 或者alpha叠加 或者加减色叠加)是需要将alph...

2020-03-25 17:35:31 145

原创 学习笔记(05):OpenGL基础教程-VBO和显示列表绘制图形

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-03-22 21:42:00 75

原创 学习笔记(03):OpenGL基础教程-OpenGl环境的搭建

市面上的OpenGL教程不够系统,知识比较零碎,有的太难,有的又太简单,本课程从一线编程实践经验出发,0基础学习OpenGL底层知识, 讲解重要常用的知识点和整个框架体系,便于学员掌握,并且提供了大量的实际代码案例,便于学习。...

2020-03-15 18:50:37 37

原创 OpenGL API 之glGen*形式、glBind*形式、和glBufferData()的理解

先举例来说:void glGenVertexArrays(GLsizei n,GLuint *arrays);返回n个未使用的对象名到数组arrays中,用作顶点数组对象。返回的名字可以用来分配更多缓存对象,并且它们已经使用未初始化的 顶点数组集合的默认状态 进行了数值初始化。很多OpenGL命令都是glGen*的形式,它们负责分配不同类型的OpenGL对象的名称。这里的名称类似C语言中的一个...

2019-10-22 12:23:22 152

原创 OpenGL中的4x4矩阵的意义2

opengl中的4x4方阵是列优先排序:第4列表示坐标系原点变换后的x、y和z值。这16个值表示了空间中的一个特定位置,以及相对于视觉坐标系(固定不变的绝对坐标系)的3个轴的方向。这个16个值也可以表示为相对于视觉坐标系的一个局部坐标系,最后一列表示该坐标系位移后的坐标,也就是相对于视觉坐标系的位置和方向这4列每一列是一个4个元素的向量。前三列的三个向量只是方向向量,他们表示空...

2019-10-14 21:30:28 280

原创 openGL中的4x4矩阵的意义

2019-10-14 20:48:44 550

原创 C#语法学习-const与readonly区别

1.静态常量(编译时常量)const在编译时就确定了值,必须在声明时就进行初始化且之后不能进行更改,可在类和方法中定义。定义方法如下:const double a=3.14;// 正确声明常量的方法const int b; // 错误,没有初始化2.动态常量(运行时常量)readonly在运行时确定值,只能在声明时或构造函数中初始化,只能在类中定义。定义方法如下...

2019-10-14 10:32:56 43

原创 C#语法-变量

不同类型变量进行运算的问题:double a = 42.29;int b = 4229;int c = a + b;Console.WriteLine("c = {0}",c);Console.ReadKey();上面这种编程方法是错误的,会出现错误提示:"无法将类型'double'隐式转换为'int'。"举例说明,当一个精度高的数据类型与一个精度低的数据类型进行运算时...

2019-10-12 15:47:20 44

原创 C# Convert.ToInt32() 与 int.Parse() 的区别、Convert.ToDouble 与 Double.Parse 的区别

(1) 这两个方法的最大不同是它们对 null 值的处理方法:Convert.ToInt32(null)会返回 0 而不会产生任何异常,但int.Parse(null)则会产生异常。(2) 对数据进行四舍五入时候的区别a.Convert.ToInt32(double value) 如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5 转换为 4,4.5 转换为...

2019-10-12 15:20:42 114

转载 C#语法学习-托管代码和非托管代码的理解

c#的托管代码和非托管代码的理解理解托管和非托管代码的前提之下,要先了解CLR(公共语言运行库).Net Framework 是由彼此独立又相关的两部分组成:CLR 和 类库, CLR是它为我们提供的服务,类库是它实现的功能..NET的大部分特性----垃圾收集,版本控制,线程管理等,都使用了CLR提供的服务当你为.NET Framework编译源代码的时候,得到的目标代码不是CPU能识别...

2019-10-11 15:08:43 29

原创 C#语法学习-托管类型、非托管类型

在介绍 C# 的托管类型和非托管类型之前,我们先来说说 C# 的类型体系以及各种类型在内存(虚拟内存)中的存储方式。C# 类型体系C# 的类型包含以下三大类:值类型 枚举 结构 数值类型(numeric) 整型 浮点型 decimal 布尔类型(bool) 用户定义的结构(structure) 值类型的变量直接包含其数据。...

2019-10-11 14:35:08 690

原创 C#语法学习-object和int之间关系

obj 和int之间关系using System;namespace RectangleApplication{ class ExecuteRectangle { static void Main(string[] args) { int a=9; object obj; ...

2019-10-11 11:05:01 164

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