自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 问答 (1)
  • 收藏
  • 关注

原创 OpenGL学习笔记:Bloom 泛光

以下来自learnopengl.com网站的总结一 概念强光区域很难向观察着传达一种强光范围,显示器有限制。光照的模糊或者泛光效果,是一种通过后处理的效果。泛光是光源周围泛着的一篇区域。二 原理在OpenGL中,作者这样实现:让光源(立方体)拥有超过1的颜色值(HDR),将其渲染到颜色缓冲区。然后,以此颜色缓冲区作为纹理,取样时,设置一个阈值,超过阈值的部分,说明光照强度很大,就是需要泛光的部分。三 实现在教程中,作者用双颜色缓冲实现,即,设置多渲染对象。过程上就..

2021-12-27 10:36:55 788

原创 OpenGL Framebuffers Object:帧缓冲区对象详解

帧缓冲区对象 FrameBuffers Object(FBO)一 概念===============================================================迄今为止,我们使用了好几种屏幕缓冲区:颜色缓冲区,深度缓冲区,模板缓冲区。 这些缓冲区存储在GPU的内存中,称为帧缓冲区(framebuffer). OpenGL允许我们创建自己的帧缓冲区。以前的渲染是这样:在渲染缓冲区顶部有一个默认的帧缓冲区(default framebu...

2021-12-04 19:46:38 1279

原创 OpenGL MSAA:抗锯齿技术详解

抗锯齿 anti-aliasing一 概念有时候OpenGL渲染出来的物体,其边缘会出现锯齿,显得很不丝滑。说白了,使物体在渲染时保持边缘丝滑而不出现锯齿的技术,就叫做抗锯齿。常用的技术是SSAA和MSAA,MSAA是SSAA的演进技术,全称是多采样点抗锯齿 multisampler anti-aliasing,本文主要介绍MSAA.二 MSAA原理片段着色器携带顶点数据运行时,将数据插入到像素的中心,MSAA随后使用一个很大的的带有设置了子采样点的深度/模板缓冲去选择哪些子采样点被覆盖,然

2021-12-04 11:38:49 2255

原创 c++ 高并发服务器详解

本文列举两个c++并发服务器,并尝试分析其中语法,若有错误,还望指正。这里不讨论socket和c/s架构,只对服务器端做分析。服务器处理任务的大体流程是: 服务器启动线程,开始等待和接收任务,处理任务,退出线程。接收任务时,任务被添加在全局的一个队列,被所有线程共享,这时就考虑一个同步。如果任务队列为空或者太满,还需要考虑线程池的容量大小。这不禁让人想起了经典的生产者—消费着模式,生产者生产一个任务,消费者耗费一个任务,很类似,大概流程如下草图所示:这里用到了互斥量锁,条件变量,..

2021-11-09 10:27:02 3386

原创 JS:页内元素实现点击切换相关元素内容--不用vue一样可以实现active class

2021-06-02 16:58:00 736

原创 MYSQL死锁问题java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

数据库死锁分类MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般算法: 而产生死锁的原因/场景如下:原理:就像多线程死锁一样,比如线程ab都想写文件t,a操作完T后没有释放锁,b就没法读T了,而且a自己也没法继续

2021-05-25 09:22:45 584

原创 JS数组,JS对象,json数组,json对象,json字符串的区别和联系

1 关于数组和对象的概念1 数组在计算机中,基本上任何语言的数组存储方式(加基本是因为不是所有语言我都懂啊..),都是以类型相同的数据(或者叫元素)连续地存储在地址空间里,他们在形式上也很相似,所以也可如此形容,数组是一组连续的相同类型的集合,第一个元素在数组中的下标表示为0。比如js中的数组。在js中,可以这样初始化数组:var num = new Array();cars[0] = "one";cars[1] = "two";cars[2] = "three";也可这样

2021-05-23 08:36:01 317

原创 opengl:纹理单元 ( 详解 glUniform1i 和 glGetUniformLocation 的使用)

本文讨论纹理单元(texture unit)的使用,以及和着色器之间的关系。使用纹理的过程大概是这样的:1 从硬盘加载texture到内存,获取texture's ID// 1 创建纹理对象获取IDglGenTextures(1, &textureID);// 2 绑定纹理缓冲区设置属性glBindTexture(), glTexImage2D(), glGenerateMipMap() , glTexParameteri()等函数2 在内存中通过uniform varia

2021-03-08 01:53:54 6340

原创 openGL学习笔记:着色器的理解,以及geometry shader的用法

在跟着learnopengl的教程(https://learnopengl.com/Advanced-OpenGL/Geometry-Shader)学习几何着色器(geometry shader)的时候,遇到了一些理解问题,现在解决了,记录一下。当然中文我也不知道叫啥,但也差不多吧(希望不要差太多)。在我今天学到进度里,关于着色器的学习有三种,vertex shader, fragment shader, geometry shader,着色器的作用是write data to the GPU ca

2021-03-07 02:17:03 959

原创 GLSL:用transpose和inverse函数转换顶点着色器里的法线向量

#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aNormal;out vec3 FragPos;out vec3 Normal;uniform mat4 model;uniform mat4 view;uniform mat4 projection;void main(){ FragPos = vec3(model * vec4(aPos, 1.0)); .

2021-03-03 21:39:17 2819 2

原创 创建OpenGL的第一个窗口

#include <glad.h>#include <glfw3.h> #include <iostream>#define WS_WIDTH 800#define WS_HEIGHT 600void framebuffer_size_callback(GLFWwindow* window,int width,int height);void processInput(GLFWwindow *window);int main(){ glf.

2021-02-28 20:21:03 92

原创 openGL学习笔记:封装glut的一些函数

入了openGL的坑的同学们大家好...我今天学习了下纹理,用glGenTextures函数时无法返回有效的id,搞了白天总算明白,如果在glutInit之前调用gl系列的函数,是无效的,顺序一定要注意!openGL系列的函数我都给封起来了,这样方便自己学习和理解openGL系列的函数使用流程。COpenGLWindowCtrl类封装openGL系列的一些初始化函数CTextureCtrl类用来加载和调用纹理对象SetTexture全局函数用来设置加载哪个纹理(一定要在glInit之后调用,

2021-02-27 20:49:28 372

转载 openGL画图

https://www.cnblogs.com/csu-lmw/p/11759527.html

2021-02-22 16:46:51 248

原创 MFC:C/C++导入导出csv/excel文件

本来以为把MFC里CFileDialog类的文件类型选择变量szFileters加个 *.xlsx 这样的类型,就可以导入导出xlsx了,但是完全是想当然啊(没试过你永远不知道结果是否是预期的!)本文目的旨在用纯c/c++代码导入导出csv/excel等格式文件!话不多说,首先创建一个类似这样的窗口,在文件菜单设置子菜单 导入和导出这里需要知道csv和excel文件的区别:csv文件是以逗号分隔的纯文本文件,而excel文件带有格式,这就决定了我们需要用不同方法导入或者导出。所以在导入/

2021-02-22 03:42:00 5253 17

原创 使用MFC的CFileDialog类导入导出csv/excel文件

1 首先创建一个MFC应用,选择 单个文档,Mfc标准项目名为FileSaveOpen2 去掉无用的.h .cpp文件这一步要求精简窗口,方法很多,我的方法是把无关的view,doc,frame等文件全删除,只留下theApp所在的文件。然后在此基础上,编写自己的窗口类(用的是模态对话框+系统菜单的组合方式)1 首先, InitInstance()函数内:把p_mainFrame ShowWindow()之类的都删掉,这部分是框架换成下面的,为了清晰,我把系统自带的...

2021-02-20 21:43:34 1571

原创 .dll的制作和显示调用

虽然windows下的动态链接库有不止一种调用方式,但是既然叫做动态链接库,还是毕竟喜欢随用随调。dll的生成:1 VS下创建项目 Win32控制台应用程序2 添加对应的.h .cpp文件3 .cpp里包含头文件,.h文件里的函数声明前面加上 extern "C" __declspec(dllexport)extern "C" __declspec(dllexport) double Add(double a, double b);像写正常的c函数一样,区别就是这是生成.dll.

2021-02-19 22:18:08 188

原创 Test.java:3: 错误: 需要class, interface或enum

今天学package的时候,出现这个错误,C:\Users\123\Desktop\package\test>javac -d . TestInit.java Test.javaTestInit.java:2: 错误: 需要class, interface或enumpackage com.xiaolemei.test;^1 个错误先上代码//TestInit.javaimport com.xiaolemei.animals.*;package com.xiaolemei.t

2021-02-19 15:17:11 721

原创 C语言输入缓冲区实例详解:如何从键盘读取指定的字符串长度

昨天接触了一下用户登录,发现从键盘读取数据到缓冲区,再保存到程序变量这个过程,还是需要格外注意,因为一不小心,就容易读取错误。下面用getchar函数说明一下:getchar()函数函数原型:int getchar(void)函数功能:从标准输入 stdin 获取一个字符函数返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符使用场景: 用户登录时,输入用户名和密码,程序将数据保存到变量,用来进行显示,验证等其他操作下面是用户结构体://用户结构体,...

2021-02-08 16:15:01 1059

原创 C++2节:C++动态内存分配,引用,四种类型转换

C++对内存的控制和管理严格到令人发指的地步,所以关于动态内存,关于new/delete运算符,一定要十分熟悉!C++中的new/delete和C中malloc/free区别也要明白。C++的动态内存分配1 回顾C语言中动态内存分配1)分配:malloc()/calloc()/realloc()2)释放:free()3)错误处理:返回值2 C++使用new/delete运算符分配内存1)分配:new/new[]2)释放:delete/delete[]3)错误处理:异常(后面讲)

2021-02-04 17:22:43 215

原创 C++1节:C++的介绍,命名空间,类型,四种函数

练习: 1.从键盘得到日程信息并最终输出。 每个日程包含小时数(0--23)和内容两部分 不要求排序 2.对结果进行排序/* 结构体练习*/#include <stdio.h>#include <string.h>struct month { char name[10]; int days;};int main() { struct month months[12]; char *...

2021-02-02 10:45:20 400

原创 C12节:练习和作业

1 贪吃蛇练习/* 贪吃蛇练习*/#include <stdio.h>#include <stdlib.h>#include <time.h>#define SIZE 4enum {UP, DOWN, LEFT, RIGHT};typedef struct { int x; int y;} position;void show_snake(position *p_position, int s

2021-02-01 17:59:11 82 2

原创 C11节:动态分配内存,二级指针,sizeof

指针是用来存储地址数据的变量NULL表示空地址记录无效地址的指针变量叫做野指针指针可以参与如下数学计算指针 + 整数,指针 - 整数,指针 - 指针以上计算中所有整数都是有单位的,单位由指针的类型决定静态局部变量的地址可以作为函数的返回值来使用数组做函数形参时计算机内部使用指针替代它对数组使用sizeof关键字计算的结果是整个数组的大小对指针使用sizeof关键字计算的结果是指针变量本身的大小数组名称取地址后得到的结果地址不变,但是级别和二维数组名称一致指针变量本身的地址和它

2021-02-01 17:53:41 446

原创 C10节:预处理,宏定义,结构体,条件编译,联合与枚举

预处理指令是C语言支持的一种特殊的指令预处理指令都以#做开头,不以;做结尾预处理指令在编译的第一个阶段被处理预处理指令的作用是修改程序源代码gcc命令可以使用-E选项单独处理所有预处理指令#define是一个预处理指令这个预处理指令用于实现宏定义 宏定义可以给数字起个名字 定义宏的时候不要使用=(赋值操作符)宏名称中不应该有空格宏和变量完全不同/* 宏定义练习*/#include <stdio.h>#define PI ...

2021-02-01 17:40:49 234

原创 C9节:const关键字,字符串

指针变量可以用作循环变量处理数组中的每个普通变量const关键字可以用来声明变量const变量是不可以赋值的(仅对变量名有效)声明指针变量时也可以使用const关键字,const int *p_num;以上声明的指针不可以用来修改普通变量(包括指针中地址对应的普通变量和计算出的地址对应的普通变量)int * const p_num;以上声明的指针变量是不可以被赋值的const int * const p_num;以上声明的指针变量本身不可以被赋值,它对应的普通变量也不可以被赋值

2021-02-01 17:24:47 106

原创 C8节:作用域,生命周期,指针

变量的作用域是变量名可以被使用的所有代码范围全局变量的作用域是所有语句,它们被声明在所有函数外边没有初始化的全局变量自动被初始化成0局部变量的作用域是它所属的函数内部所有语句。块变量是声明在语句块中的变量,它们的作用域是语句块内的所有语句/* 作用域练习*/#include <stdio.h>int num; //全局变量void func() { int num1 = 0; //局部变量 printf("num1是%d\n",...

2021-02-01 17:16:12 333

原创 C7节:文件操作,递归与递推

文件操作相关库函数1.fopen函数用于打开文件2.fclose函数用于关闭文件3.fread/fwrite函数用于以二进制方式读写文件/* 文件操作练习*/#include <stdio.h>int main() { FILE *p_file = fopen("a.bin", "w"); if (p_file) { //.... fclose(p_file); p_file = NULL; }

2021-02-01 17:08:42 104

原创 C6节:函数

函数由一组语句构成。所有C语言程序都是由一个或者多个函数构成的每个C语言程序都必须有叫做main的主函数,程序从这个函数的第一条语句开始执行。两个函数交流过程中主动发起方叫做调用函数,另一方叫做被调用函数。返回值变量用来从被调用函数传递数据到调用函数返回值变量类型声明在函数名前面。如果没有返回值变量则类型声明成void.return关键字可以把一个数字赋值给返回值变量参数是一组特殊变量,用来从调用函数函数传递数据到被调用函数。参数的个数没有限制参数的传递效果类似于复印机,传递结束后会有两份

2021-02-01 17:00:03 133

原创 C5节:数组,随机数

数组可以使用多种方法进行初始化数组名称只能当数字使用,永远不能对数组名称赋值数组名称代表数组中第一个变量的地址数组名称加下标可以获得下标对应变量的地址如果有数组arr则*(arr + n)表示下标为n的变量对数组名称做sizeof计算可以得到整个数组的大小C99规范中支持变长数组变长数组不支持初始化语法/* 数组练习*/#include <stdio.h>int main() { int num[5], pos = 0; //数组声明语句

2021-02-01 16:50:28 129

原创 C4节:类型转换,分支、循环语句,缓冲区

隐式类型转换把一个表达式中的所有数据调整成同样的类型。把占地小的变量调整成占地大的变量int和float一起计算时int会被转换成float数有符号和无符号数据一起计算时把有符号数据转换成无符号数据强制类型转换可以把任何数据或变量当成某个类型来使用/* 类型转换练习*/#include <stdio.h>int main() { char ch = -10; printf("-10 + 3 > 0是%d\n", -10 + 3 > 0);

2021-02-01 16:38:11 128

原创 C3节:位操作符,逻辑操作符,三目运算符

负数二进制计算方法 整数二进制先做按位求反然后再加1.62 = 32 + 16 + 8 + 4 + 2 = 0011 1110-62 = 1100 0001 + 1 = 1100 0010已知某个二进制数字,也可以采用上述方法计算出相反数的二进制。某个数据类型中最小的负数的二进制形式是一个1右边全是0,例如char类型的最小负数二进制是1000 0000一个有符号类型变量中最左边的二进制位称为符号位,如果是负数则符号位一定是1.变量中首个二进制位为1不...

2021-02-01 16:28:16 242

原创 如何用Json::Value和Json::Reader分析Json格式的数据

Jsoncpp是一个用来处理 Json文本的开源C++库,最近需要分析服务器的Json格式数据,所以,学习了一下。下面就简单介绍使用Jsoncpp的Json::Reader和Json::Value来分析数据。Json::Value操作有点像数组,先回忆下C/C++里的数组。数组的定义是内存存储类型相同的连续的内存空间,其定义方式如下:数组类型名 数组名[元素个数];以上是一维数组,二维数组可看作是每个元素都是一个一维数组的一维数组,其定义如下:数组类型名 数组名[元素分组个数][每组..

2021-01-29 16:16:29 11205 1

原创 C2节:C语言变量,printf/scanf函数,数据类型

变量变量是唯一用来存储数据的工具不同的变量应该使用不同的名称命名一个变量只能用来存储某种特定类型的数据变量必须先声明然后再使用变量声明语句格式如下int num;其中num是变量名,int表示变量类型,整数类型赋值操作符(=)用于对变量进行赋值操作。要求左边是一个变量,右边是一个可以当成数字使用的内容。赋值语句中的数字如果和变量的类型不一致,则计算机会自动调整类型。在程序中变量可以当成数字使用变量名在程序中的作用由环境决定同类型的多个变量可以在一条变量声明语句中声明...

2021-01-26 18:19:21 368

原创 C1节:C语言简介及基础语法

简介编程语言从最高的打孔机器语言,到汇编语言,再到自然语言,经历了半个多世纪,而众多自然语言(也叫高级编程语言)中,唯独C语言能历经50年而经久不衰,笑看其他语言起起伏伏。这是为什么呢?下面我们从最基础的语法开始谈一谈C语言。以Linux环境为例。//hello.c#include <stdio.h>int main(){ printf("Hello world\n"); return 0;}任何语言,都需要翻译成计算机可以理解的机器语言,这个过程对于C语言叫

2021-01-25 18:54:27 560

原创 Linux c/c++ 网络编程:TCP客户端/服务器实现

前言前阵子我下载了基于tcp协议的客户端和服务器的代码,想借用一下来处理我们公司软件的日志模块,现在模块没问题了,但是我又想,服务器一般都在linux下,所以又在linux环境下写了一个服务器,也优化了客户端. 期间遇到了一些问题,都记录在这里. 如果哪里有问题,请大家指出,共同进步!软件名称: 文件服务器软件功能: 用于局域网内的文件传输技术涉及:socket网络编程,tcp协议,文件操作,c/c++软件不足:单线程,局域网,封装度低,数据结构不够精简未来拓展:多线程,文件夹传输,

2021-01-11 20:26:28 931

原创 矿池数据分析:python实现矿工管理及其数据统计

I am glad to share a python script today about the statistics and downloadsof the workers who are working(prefer to say makingmoney )with populor protocal stratumfor digit currency in the main domestic website such as f2pool.com.很高兴今天分享一个关于统计和下载矿...

2021-01-06 18:07:30 688

原创 linux环境中静态库与动态库(共享库)的生成与使用

一 静态库的生成步骤: 1 写源程序,以PrintS.c为例,保存退出。 2 编译源程序,得到目标文件(.o文件)。 gcc -c 源文件名 例:PrintS.c #include <stdio.h> void printS(){ printf( " *\n"); printf( "***\n"); printf( " *\n"); }通过以下命令生成.o目标文件PrintS.o# gcc -c Prin...

2021-01-06 15:42:30 131

空空如也

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

TA关注的人

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