自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小猪佩奇的博客

重视基础,重在坚持

  • 博客(93)
  • 资源 (1)
  • 收藏
  • 关注

原创 OpenGL-ES 学习(17) ---- CubeMap 纹理

立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体立方体贴图有一个非常有用的特性,它可以通过一个方向向量来进行索引/采样。假设我们有一个1x1x1的单位立方体,方向向量的原点位于它的中心使用一个方向向量来从立方体贴图上采样一个纹理值会像是这样note:方向向量的大小并不重要,只要提供了方向,OpenGL_ES就会获取方向向量(最终)所击中的纹素,并返回对应的采样纹理值。

2025-11-29 21:57:57 1020 1

原创 OpenGL-ES 学习(16) ----Pixel Buffer Object

, 也就是像素缓冲区对象,主要用于异步像素的传输操作,暂存区域,结合异步的方式,一点程度上可以解决这个问题。仅仅用做像素的一个暂存区,不连接到纹理,并且和。管理的内存区域) 之间拷贝往往是比较耗时的,使用。读取帧缓冲区数据时,帧缓冲数据可以直接传输到。上图从文件中加载纹理,图像数据首先被加载到。内存),两次加载过程(拷贝和加载)完成由。加载纹理时,文件中图像数据可以直接加载到。的缓冲区的内存地址,再将帧缓冲数据拷贝到。内存区域拷贝,是需要阻塞等待完成的。从 帧缓冲区读取图像数据,需要。

2025-11-22 21:41:40 927

原创 开源项目学习(7) ---- Google Gtest

Gtest是一个跨平台的(LinuxMac OS XWindowsCygwinWindows CEandSymbianC++单元测试框架,由google公司发布,gtest是为在不同平台上为编写C++测试而生成的,它提供了丰富的断言、致命和非致命判断、参数化、死亡测试等等。

2025-10-07 23:07:35 617

原创 C++ 学习(3) ----设计模式

对上面的简单工厂模式进行修改,不再设计一个统一按钮工厂类来负责所有产品的创建,而是将具体的按钮创建过程交给专门的工厂子类完成,先定义一个抽象的按钮工厂类,在定义具体的工厂类来生成圆形按钮,矩形按钮,菱形按钮等等。在系统运行时,对象不是孤立的,它可以通过相互通信和协作完成某些复杂功能,一个对象的运行也会影响其他对象。我们希望使用这些按钮的时候,不需要知道具体的按钮的名字,只需要知道表示这个按钮类的一个参数,并且提供一个方便调用的方法,传入参数就可以或者一个具体的对象,这个就是简单工厂模式。

2025-10-07 22:52:28 960

原创 AI 基础知识(2) ---- 神经网络原理

是一个抽象类, 允许你从自己的数据源中创建数据集len(self): 返回数据集中的样本数量getitem(self, idx): 通过索引返回一个样本。

2025-10-07 22:31:41 757

原创 Python 学习(5) ---- Python 语法规则

包是一个分层次的文件目录结构, 它定义了一个由模块及子包, 简单说, 包就是文件夹, 但是该文件夹下必须存在文件, 该文件的内容可以为空,用于标志当前文件夹是一个包。

2025-10-07 20:24:52 877

原创 Python 学习(2) ---- Python 数据类型

Python中的变量顶定义不需要指定类型,变量需要再使用前赋值,赋值之后变量才会被创建可以连续的方式为变量赋值也可以为多个变量指定值# ==>a = 1b = 2c = "demo"

2025-10-07 19:57:49 777

原创 Python 学习(1) ---- Python 初步介绍

Python是一个高层次的结合了解释性,编译性,互动性和面向对象的脚本语言Python的涉及具有很强的可读性,比其他语言更有语法特色Python是一种解释性语言,这意味着开发过程中没有编译这个环节,类似于PHP或者PerlPython是交互式语言: 意味着可以在 Python 提示符>>>直接执行代码Python是面向对象的语言,这意味这Python支持面向对象风格或者代码封装在对象的编程技术Python是初学者的语言,广泛的支持程序开发。

2025-10-07 18:59:37 716

原创 Vulkan 学习(20)---- UniformBuffer 的使用

mat4 model;mat4 view;mat4 proj;mat4 view;mat4 proj;mat4 view;mat4 proj;uniformin和out定义在着色器中出现的顺序可以是任意的,任意代码中binding修饰符类似于我们对顶点属性使用的location修饰符,我们会在描述符布局引用这个binding值使用变换矩阵最终得到矩形在三维空间内的裁剪坐标。

2025-09-07 15:24:42 987

原创 Vulkan 学习(19)---- Vulkan Compute

与OpenGL等较旧的API不同,Vulkan中强制要求支持计算着色器,这意味着您可以在任何可用的Vulkan实现上使用计算着色器,无论它是高端桌面GPU还是低功耗嵌入式设备GPU的计算功能可以用于图像处理、可见性测试、后期处理、高级照明计算、动画、物理(例如粒子系统)等等,甚至可以用于非可见性的工作比如AI和 数字运算等使用 GPU 进行计算的一个明显的优势是降低CPU负载避免CPU和GPU之间交换数据所有数据都可以直接保持在GPU上,无需从缓慢的主存储器中获取数据。

2025-07-20 14:39:46 1085

原创 Vulkan 学习(18)---- 使用 ValidationLayer

Vulkan API的设计是按照最小化驱动程序的开销进行的,所以默认情况下Vulkan API提供的错误检测的功能非常有限,很多基本的错误都没有被Vulkan显式进行处理,遇到错误也是直接错误崩溃,或者直接发生未定义行为,比如使用了一个新的特性,但是在逻辑设备创建的时候没有添加这个拓展Vulkan引入验证层,验证层是一个可选组件,它会hook到Vulkan对照规范检查参数的值是否合法跟踪对象的销毁和创建,找出潜在的资源泄露跟踪调用来源的线程来检查线程的安全性将每个调用及其参数记录到标准输出。

2025-06-29 11:21:25 846

原创 Vulkan 学习(17)---- 使用 IndexBuffer

绘制一个矩形可以通过绘制两个三角形来实现,如果不共享顶点,就需要6个顶点,共享顶点的话,只需要4个顶点就可以可以想象对于更加复杂的三维网格,通过共享顶点可以节约大量内存资源索引缓冲()是一个包含了指向顶点缓冲中顶点数据的索引数组的缓冲,使用索引缓冲,我们可以对顶点数据进行复用。

2025-06-22 16:53:26 790

原创 Linux 内核学习(12) --- Linux workqueue

work queue即工作队列,也是中断下半部的一种work queue将下半部工作推迟给一个内核线程去执行 ==>总是会在进程的上下文执行,重要的是workqueue允许重新调度甚至睡眠如果推迟的工作需要睡眠,则使用workqueue,否则使用softirq或taskletsworkqueue适用于需要分配大量的内存,获得一个信号量,或者执行阻塞的I/O的情况工作队列创建的内核线程称为工作者线程(),工作队列子系统创建了一个缺省的工作者线程来处理这些推后的工作,一般都是使用缺省的工作线程。

2025-06-21 15:47:32 1100

原创 Linux 内核学习(11) --- Linux 链表结构

链表是一种数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针链表可以动态增长或者缩小,适合频繁的插入和删除操作,常见的链表类型有单向链表和双向链表在 linux 内核开发中,开发者无需自己实现链表或者使用第三方库,内核内置了双向链表实现定义在中。

2025-06-12 21:41:09 1474

原创 Linux 内核学习(10) --- Linux sysfs 节点创建

在/sysint retval;if (!kobj)name表示目录名称parent表示父目录,NULL为默认在/sys目录下创建。

2025-06-11 21:28:53 570 1

原创 Linux 内核学习(9) --- Linux sysfs 文件系统

sysfs是一个基于RAM的文件系统,从Linux 2.6内核开始引入,用于导出内核对象()的数据,属性到用户空间,以文件目录的形式为用户空间提供对这些数据,属性访问的支持从驱动开发的角度看,sysfs为用户提供了除了devfs和procfs之外的另外一种访问内核数据的方式,使用sysfs,编译内核的时候要定义,并且通过的方式将其挂载到/sys目录sysfs是一个特殊的文件系统,并没有一个实际存放文件的介质,sysfs的来源是kobject的层级结构,读取一个sysfs的文件,就是动态从kobject。

2025-05-25 16:01:08 992

原创 Linux 内核学习(8) --- 字符设备操作函数

<\ //30sizeof_IOC0_IOC_IOC_IOC_IOCsizeof_IOCsizeof_IOCsizeof>>>>>>>>type:一般为 magincNumbernr:一般为递增的序列号size:传输数据的sizecmd是一个类型的整形数,大小为 32bitcmd的高位 2Bit cmd[31:30] 是数据的传输方向,可以是_IOC_READ_IOC_WRITE或者和_IOC_NONEcmd[29:16]最多是 14 bit,表示数据的大小。

2025-05-25 15:06:24 831

原创 Vulkan 学习(15)---- Vulkan 完整渲染流程

上执行,可以执行不同类型的工作,包括绑定顶点缓存、绑定流水线、录制渲染通道指令、设置视口和裁切矩形,设置绘制指令,执行图像和缓存内容的复制操作等。命令包括绑定顶点缓存(可选)、绑定流水线、设置视口和裁切矩形、录制渲染通道指令、设置绘制指令等。需要注意的是,如果窗口变化或者失效,此时需要重建。的操作关系是以颜色,模板、深度附件的形式关联到。只描述渲染流程,不包括渲染数据,渲染数据需要以。类似于一个图像的容器,里面包含一系列的。),确保图像可用后再显示,它可能涉及。管理的,不能直接访问,需要调用。

2025-05-25 13:15:21 1310

原创 Linux 内核学习(7) --- 字符设备驱动

Linux 中主要有三类设备的驱动程序,分别是字符设备驱动程序,块设备驱动程序和网络设备驱动程序字符设备是指在I/O传输过程中以字符为单位进行传输的设备,例如键盘,打印机等,字符设备的驱动程序结构如下图所示:字符设备可以通过文件节点来访问,设备文件和普通文件差别在于对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道,当然也存在数据区特性的字符设备,访问它们可以前后移动访问位置,比如就是这样一个设备,app可以用mmap或者lseek访问获取整个图像主设备号和次设备号。

2025-05-07 21:51:17 944

原创 Linux 内核学习(6) --- Linux 内核基础知识

可以在系统上电或者复位的时候以某种方法执行,执行方法包括:被BIOS引导执行,直接 NorFlash 执行,NAND Flash 代码被 MCU自动拷贝进入内部或者外部 RAM直接执行能将U盘,磁盘,光盘,NAND/Nor Flash ROM SD卡中存储介质,甚至串口网口中的操作系统加载到 RAM,并且将控制权交给内核源代码执行内核镜像不是完全直接可以执行的代码,而是一个压缩过的zImage 小内核bzImage big 大内核。

2025-05-07 21:29:42 1670

原创 OpenGL-ES 学习(15) ----纹理

现实生活中,纹理(Texture) 类似于游戏中皮肤的概念,最通常的作用是装饰3D物体,它像贴纸一样贴在物体的表面,丰富物体的表面和细节在OpenGL-ES开发中,纹理除了用于装饰物体表面,还可以用来作为存储数据的容器所以在OpenGL-ES中,纹理实际上是一个可以被采样的复杂数据集合,是GPU的图像数据结构,纹理分为 2D纹理、立方图纹理和 3D纹理2D纹理是OpenGL-ES中最常见和最常用的纹理形式,是一个表示图像数据的二维数组,纹理中一个单独的数据单元被称为纹素或者纹理像素立方图纹理(

2025-05-01 16:54:33 2127

原创 OpenGL-ES 学习(14) ----顶点指定和基本图元的绘制

绘制图形的第一步就是指定顶点坐标,可以每个顶点指定,也可以是用于所有顶点的常量,或者直接用顶点数组指定,OpenGL-ES标准实现必须支持最少16个顶点属性;顶点着色器处理图元顶点之后进入图元装配阶段,在这个阶段执行裁剪,透视分割和视口变换,往后会进入光栅化阶段;光栅化是指将图元转换为一组二维片段的过程,这些片段最后会由FragmentShader 处理定义顶点属性的坐标并且关联到一个属性索引上,//注意下面的顶点定义方式。

2025-05-01 16:43:33 1186

原创 OpenGL-ES 学习(13) ---- Shader 编译和程序对象

在本节中,我们提供创建ShaderShader和程序对象概述创建和编译Shader创建和链接程序对象设置和获取统一变量获取和设置属性Shader编译器和程序二进制代码想要用ShaderShader对象和程序对象(它们之间的关系类似于C语言链接程序和编译器C语言对象将一段源代码生成目标对象C链接程序将对象文件链接为最后的文件Shader对象是包含多个Shader的对象,源代码提供给Shader对象,Shader对象被编译为一个目标形式(类似于obj文件),编译之后,Shader。

2025-05-01 16:31:59 1252

原创 OpenGL-ES 学习(12) ---- VBO EBO VAO

VBO) 是指顶点缓冲区对象,而EBO)是指图元索引缓冲区对象,VBO和EBO实际上是同一类buffer按照用途的不同称呼编程中,用于绘制的顶点数组数据首先保存在系统内存,在调用或者等进行绘制的时候,需要将顶点数组数据从系统内存拷贝到显存,但是很多时候我们没必要在每次绘制的时候进行内存拷贝,如果可以在显存中缓存这些数据,就可以在很大程度上降低内存拷贝带来的开销OpenGL-ES数组缓冲区对象指定数组缓冲区对象用于创建保存顶点数据的缓冲区对象元素数组缓冲区对象用于创建保存图元索引的缓冲区对象。

2025-05-01 16:22:09 1219

原创 OpenGL-ES 学习(12) ---- GPU 系统结构

每个图元,还需要确认图元是否位于视锥体内,如果没有完全位于,就需要进行裁剪,或者直接剔除,裁剪和剔除之后,顶点位置就被转换为屏幕坐标,传递给管线的下一阶段进行光栅化。着色是一种高度独立的任务,两个顶点或者像素之间谁都不需要关心对方的属性,并且它们之间的行为也几乎完全一致,比如说对一个三角形进行平移,则对它的每一个顶点加上相同的向量,区别只有输入:三个顶点的位置数据不同,如果对指令有一定了解的话,会发现这和。上分点地方放它,对于FB的频繁访问,不再产生DDR带宽,而是变成了低时延,低功耗的。

2025-05-01 11:48:46 975

原创 OpenGL-ES 学习(11) ---- EGL

OpenGL-ES是一个操作GPU的图像API标准,它通过驱动向GPU发送相关图形指令,控制图形渲染管线状态机的运行状态,但OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层,最好与平台无关EGL---- 因此被独立的设计出来,它作为OpenGL-ES和本地窗口的桥梁EGL是OpenGL ES和底层Native平台视窗系统之间的接口层,EGL API是独立于OpenGL ES各版本标准的独立APIEGL和设备的原生窗口系统进行通信查询绘图表面的可用类型和配置创建绘图表面在。

2025-05-01 11:19:02 1424

原创 OpenGL-ES 学习(10) ---- OpenGL-ES Shader语言语法

结构可以认为是C语言中的结构体的概念struct {vec4 color;float end;} fogVar;

2025-05-01 10:43:19 957

原创 OpenGL-ES 学习(9) ---- OpenGL-ES 简介和基本 Pipeline

OpenGL-ES)是以手持和嵌入式设备为目标的高级3D图形应用编程接口,OpenGL ES支持的的平台包括 IOS,Android,BlackBerry,bada,Linux 和 windows,它还是基于浏览器的3D图形Web标准WebGL的基础,OpenGL-ES标准由khronos组织发布OpenGL-ESOpenGL-ES 版本简介1.0固定管线1.1固定管线2.0开始支持可编程管线3.0从OpenGL 3.3 标准演化而来。

2025-05-01 10:26:33 1216

原创 图形图像基础知识(1)---- RGB/YUV 颜色格式

其中的**“Y”**表示明亮度,也就是灰阶值,即黑到白的范围值,所以只有Y值的图像是黑白的,RGB颜色空间以 R(Red:红)、G(Green:绿)、B(Blue:蓝) 三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式。将Y、U、V的三个分量分别存放在不同的存储空间中,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。将Y、U、V值按照像素存储在相同的存储空间,和RGB的存放方式类似,每个像素点的Y,U,V是连续交替存储的。每个像素点都存储对应的。

2025-05-01 10:04:23 1118

原创 Vulkan 学习(16)---- 使用 VertexBuffer

glm lib 的数据结构可以和 VertexShader 中的。是如何分布的, 结合输入参数传入的偏移就可以唯一的确定需要的值。,包括了步长,绑定索引和加载方式等信息。: 顶点缓冲区的索引,和前面的。中使用固定顶点值的做法。的处理方式,或者说是。

2025-04-30 21:52:32 682

原创 Vulkan 学习(14)---- 描述符集

渲染管线的时候需要设置管线布局,它描述了渲染过程中着色器如何访问资源,包括描述符集和推送常量等。描述符集是不能被直接创建的,首先需要从一个特定的缓冲池中被分配得到。对于内存分配效率较低的场合是非常有用的,它可以直接分配出多组描述符而不需要调用全局同步操作。对象,换句话说,它相当于一组描述符的集合,新的描述符就是从这些描述符中分配得到的。),布局指定了描述符的类型,数量,绑定点等信息。管线布局可以包括一个或者多个描述符布局(的类型,分别创建一个分配。)对应一个资源,代表。),类似于内存池的概念。

2025-02-17 22:00:41 908

原创 Vulkan 学习(13)---- Vulkan Framebuffer&Command Buffer

每个帧缓存区包含一组图像视图,这些图像视图表示实际的图像资源,可以是颜色附件,深度附件或者模板附件,帧缓冲区用于将渲染输出写入到这些图像中(就是用于存储渲染通道(上执行,可以执行不同类型的工作,包括绑定顶点缓存、绑定流水线、录制渲染通道指令、设置视口和裁切矩形,设置绘制指令,执行。):不能直接提交给队列,必须嵌套在主指令缓存中执行,可以用于记录可重用的指令或者多线程录制指令。每个帧缓冲区的附件和渲染通道的附件描述相对应,它们共同定义了渲染的目标。指令缓存可以是一直存在的,只需创建一个,就可以一直反复使用。

2025-02-03 14:39:19 1214

原创 Linux 内核学习(5) --- Linux 内核底半部机制

当产生一个中断时,会进入中断处理程序,但中断处理程序必须快速、异步、简单的对硬件做出迅速响应并完成那些时间要求很严格的操作,因此,对于那些其他的、对时间要求相对宽松的任务,就应该推后到中断被激活以后再去运行这样,整个中断处理流程就被分为了两个部分:第一个部分是中断处理程序上半部(),内核通过对它的异步执行完成对硬件中断的即时响应(完成清楚中断标志等操作)下半部() 下半部的任务主要是执行与中断相关的工作,这些工作没有被中断服务程序本身完成下半部并不需要指明一个确切时间,只要把这些任务推迟一点,让它们在系

2025-01-26 22:00:21 1185 1

原创 Linux 内核学习(4) --- devfreq 动态调频框架

现在的Soc由众多的子模块构成,比如CNNDSPISPCPU等,在不同的场景下,并非所有的模块都要保持最高的性能,因此,SoC设计的时候会划分一些电压域,这些电压域内的模块,可以根据具体需要调整电压和频率,从而达到既能实现功能,又能降低功耗的目的不过频率电压并不是随意搭配的,一般情况下,高频对应着高压,低频对应着低压,这是由于晶体管的电器特性决定的Linux内核用对这些设备支持的频率和电压进行描述和管理,CPU的DVFS也就是cpufreq也是基于OPP实现的,但是仅仅支持CPU。

2025-01-26 12:20:27 1096

原创 Vulkan 学习(12)---- Vulkan Pipeline 创建

渲染管线可以看作是一条生产流水线,定义了从输入顶点到输出图像的所有步骤,它包括一系列固定和可编程阶段,这些阶段按照顺序执行,以完成渲染任务。顶点输入阶段主要是从应用程序传递的顶端缓存区中读取顶点数据,并传递给后续阶段,顶点数据通常包括顶点位置、法线、颜色和纹理坐标等。顶点着色器阶段处理每个顶点,通常用于应用几何变化(如模型视图转换,投影变换), 并计算顶点的输出属性,如颜色、纹理坐标和法线等。)配置的结构体,用于将顶点数据组装成图元(如点、线、三角形),这些图元会被后续的管线阶段处理。

2025-01-07 22:59:02 1100

原创 Linux 内核学习(3) --- 内核中断机制

不可以使用耗时很长的函数,因为中断会关闭调度,中断的优先级高于任何任务的优先级,长时间的中断处理会影响到系统的响应速度,使整个系统的任务无法政策运行,造成很多的任务超时,容易导致很多不可预知的后果。因为中断会关闭调度,中断的优先级高于任何任务的优先级,长时间的中断处理会影响到系统的响应速度,使整个系统的任务无法政策运行,造成很多的任务超时,容易导致很多不可预知的后果。读取到的内容从左到右,分别为:1、逻辑中断号,2、中断在各CPU发生的次数,3、中断所属设备类名称,4、硬件中断号,5、中断处理函数。

2025-01-01 23:01:22 1215

原创 Vulkan 学习(11)---- Vulkan RenderPass 创建

Vulkan渲染通道(RenderPass) 定义了整个渲染管线一次执行的过程,包括了渲染所使用的所有资源和操作的描述(比如指定渲染管线的渲染目标,告诉管线要渲染到哪里RenderPass 本质上是一个渲染流程的完整描述(管理渲染流程),包括如何渲染这些数据的元数据和指令,但是不包括实际的数据(图像),通过与结合来获取实际的图像数据在Vulkan编程,RenderPass是必不可少的,它必须包含一个或者多个子通道(SubPass)每个子通道表示一个渲染阶段,并且都是使用RenderPass。

2024-12-22 15:09:47 762

原创 Vulkan 学习(10)---- Vulkan SwapChain 创建

Vulkan交换链(Swapchain)是Vulkan应用程序和窗口系统的一座桥梁,负责将渲染结果呈现给用户换个说法,交换链机制是一种图元绘制结果呈现的机制,它可以将绘制的结果渲染到平台相关的展示窗口/展示层当中(这里我理解和android中的机制类似,可以绘制,同时到显示系统显示)交换链包含一组图像(一般作为渲染目标),这些图像被用于在屏幕上显示渲染的帧注意这里在屏幕上渲染才需要swapchain,如果是离屏渲染,可以直接创建vkImage和,不需要swapchain。

2024-12-22 14:53:04 1183

原创 OpenCL 学习(1)---- OpenCL 基本概念

和。

2024-09-30 22:38:16 1621

原创 OpenCL 学习(2)---- OpenCL Platform 和 Device

这个函数会得到于 platformID 关联的所有的 OpenCL 设备列表,如果参数 devices 设置为 null,每个平台可能关联到一组计算设备,应用程序通过这些计算设备执行内核程序,使用。来限制(0 < num_entries <= 设备数)设置为 0 和 nullptr 来查询返回值的大小。在得到当前支持platform 的前提下,设置。: 支持定位为核心规范的所有功能的一个子集。会返回设备数,返回的设备数可以用。:支持定位为核心规范的所有功能。会返回当前平台上可用的。

2024-09-22 16:40:59 1182

51单片机例程

很全的51单片机例程,包括定时器 串口 基本输入输出等等

2012-08-01

空空如也

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

TA关注的人

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