TLSF 代码实现分析:1、创建内存池

创建内存池

  • 内存池的开启是从new函数开始的

TLSF笔记

名词

  • DSA: dynamic storage allocator
  • TLSA:Two Level Segregated Fit memory allocator
  • RTOS:real-time operating system
  • WCET:worst-case execution time

OpenGL学习笔记:Compute Shader

概念

  • 区别于vs 、fs,compute shader虽然从名字上有个shader,但是在用途上是与shader区别开的。
  • shader从词义上是着色器的意思,因此它的核心用途是参与渲染。而compute shader可以看做是跑在GPU上的program,它可以完全是不参与渲染,而仅仅是运行一些我们想要的计算。

用法

  • 下面是一个用compute shader反转图片的例子

shader上的变化

  • gl_GlobalInvocationID是一个全局的变量,标记当前是在绘制哪个顶点,依靠这个变量来进行采样,compute shader专用。
  • In the compute language, gl_GlobalInvocationID is a derived input variable containing the n-dimensional index of the work invocation within the global work group that the current shader is executing on. The value of gl_GlobalInvocationID is equal to gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID.
  • image2D:a handle for accessing a 2D texture

OpenGL学习笔记:Subroutine

概念

  • Subroutine赋予了代码动态调用shader中函数的能力
  • 写法比较固定,直接上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#version 400 core
subroutine vec4 SurfaceColor();
uniform sampler2D U_MainTexture;
subroutine uniform SurfaceColor U_SurfaceColor;
varying vec3 V_Normal;
varying vec4 V_WorldPos;
varying vec2 V_Texcoord;

subroutine (SurfaceColor) vec4 Ambient()
{
return texture2D(U_MainTexture,V_Texcoord)*ambientColor;
}

subroutine (SurfaceColor) vec4 Diffuse()
{
return ambientColor+texture2D(U_MainTexture,V_Texcoord)*diffuseColor;
}

subroutine (SurfaceColor) vec4 Specular()
{
return ambientColor+texture2D(U_MainTexture,V_Texcoord)*diffuseColor+specularColor+vec4(1f, 0.7f, 0.72f,1.0f);
}

void main()
{
gl_FragColor=U_SurfaceColor();
}

OpenGL学习笔记:Instance

步骤

  • 定义多个实例之间不同的数据(posOffsets),类似unity中的constantbuffer数据。
  • shader中定义一个变量,代表这这些变化的数据。例子代码中用了位置的偏移量。
  • 在draw的时候给这个变量赋值,这个和position、normal那些变量的赋值方式是一样的。
  • 使用glVertexAttribDivisor说明posOffsets的使用频率
  • 使用glDrawArraysInstanced函数,替换glDrawArrays

OpenGL学习笔记:截图生成图片

获得窗口数据

  • 利用glReadPixels得到屏幕的像素值
  • 然后利用glTexImage2D获得GPU中的纹理

Vulkan学习笔记:CommandBuffer

什么是commandbuffer

  • CPU发给GPU的命令,用于两者之间的通信。
  • 通过Graphic Queue、Present Queue等队列发送到GPU
  • 它是有顺序的

使用的流程

创建commandbuffer

Vulkan学习笔记:CPU数据写入GPU

从物理硬件获取内存类型索引

  • GPU里有存储纹理的内存、存储通用数据的内存。
  • 当申请一个vkBuffer的时候,它只是定义了一个逻辑上的对象,真正需要开辟物理内存时,需要根据要存储的是对象类型来决定给与它什么样的内存。
  • 获取类型有两个条件
    • 32位掩码:来自VkMemoryRequirements
    • VkMemoryPropertyFlags:这个设置代表着内存的访问权限,是GPU访问还是CPU访问。当CPU可见时,GPU访问会很慢。

Vulkan学习笔记:基础概念

与OpenGL的区别

  • Vulkan的目标是提供高性能与更均衡的CPU和GPU占用,这一点和DX12、Mantle一直。
  • 与DX(12之前)和OpenGL比,Vulkan是一个底层的API,可以执行并行任务。
  • 可以更好的分配多个CPU核心的使用。
  • 在传统的OpenGL编程中,OpenGL的驱动会追踪很多全局的状态,会掩盖大部分显卡操作的细节,比如命令的同步,指令排队的维护。但是在Vulkan中,这都需要程序自己维护。
  • 在Vulkan程序设计中,显卡就像一份资源,你可以往上面传输数据,可以往显卡上面传输程序。

Unity material 冗余数据清理

问题

  • 做如下操作:
    • 创建一个material文件,设置shader和texture。获得此时mat文件的内容。
    • 对这个material换几个不同的shader,并且分别在不同的shader中选中了一些texture后,最终还原为初次的shader和texture。获取此时mat文件的内容。
  • 可以看到,文件中保存了一些过程中用到的shader的变量。例子中就是多了一些纹理和颜色的数据。
  • 为什么原始的mat会多出这么多当前shader中没有的变量呢?这是因为一个material创建之初,默认给了standard这个shader,所以就保留了这个shader中的变量。
  • PS:下面的YAML文件中,第一个是原始的mat文件,第二个是修改后再还原的。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×