1.UGUI源码阅读之Mask
2.PS源码如何使用
3.FFmpeg源码分析:视频滤镜介绍(上)
4.FFmpeg源码分析: AVStream码流
5.BMP协议:可手动解码的像素像素数据传输/保存协议(含源代码)
6.Pixel ArtAseprite像素软件源码编译使用(白嫖19.99刀)
UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的模板模板模版测试。
Unity Shader中的源码源码用模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,像素像素但是模板模板现在又出现了Early Fragment Test,可以在片元着色器之前进行。源码源码用云电话源码
Mask直接继承了UIBehaviour类,像素像素同时继承了ICanvasRaycastFilter和IMaterialModifier接口。模板模板
Mask主要通过GetModifiedMaterial修改graphic的源码源码用Material。大致流程:
1.获取当前Mask的像素像素层stencilDepth
2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存
3.StencilMaterial.Add设置一个unmaskMaterial,模板模板用于最后将模板值还原
MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的源码源码用Mask层数,然后StencilMaterial.Add修改模板测试的像素像素配置。
通过Frame Debugger看看具体每个batch都做了什么。模板模板先看第一个,源码源码用是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的stencil buffer的值设置为1
这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3
这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值
这是强制源码Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer
这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer
可以看到Mask会产生比较严重的overdraw。
2.drawcall和合批
每添加一个mask,一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。
如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批
如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。
PS源码如何使用
1、打开AdobePhotoshop软件,打开psd源码。
2、打开自己喜欢的,拖到AdobePhotoshop软件里面去。
3、把拖进来的像素改为×的大小。
4、用移动工具把该好的拖到psd源码里面去。
5、winvnc源码把拖到最后面去,也就是图层的最底。
6、把动画里面的帐图层改一样多,并且帐和图层设置一个亮其它不亮的进行调节。
7、调节好以后进行存储,存为web格式,选择gif存储即可。
FFmpeg源码分析:视频滤镜介绍(上)
FFmpeg在libavfilter模块提供了丰富的音视频滤镜功能。本文主要介绍FFmpeg的视频滤镜,包括黑色检测、视频叠加、色彩均衡、去除水印、抗抖动、矩形标注、九宫格等。
黑色检测滤镜用于检测视频中的纯黑色间隔时间,输出日志和元数据。若检测到至少具有指定最小持续时间的黑色片段,则输出开始、结束时间戳与持续时间。该滤镜通过参数选项rs、gs、bs、rm、gm、bm、rh、hwidgen源码gh、bh来调整红、绿、蓝阴影、基调与高亮区域的色彩平衡。
视频叠加滤镜将两个视频的所有帧混合在一起,称为视频叠加。顶层视频覆盖底层视频,输出时长为最长的视频。实现代码位于libavfilter/vf_blend.c,通过遍历像素矩阵计算顶层像素与底层像素的混合值。
色彩均衡滤镜调整视频帧的RGB分量占比,通过参数rs、gs、bs、rm、gm、bm、rh、gh、bh在阴影、基调与高亮区域进行色彩平衡调整。
去除水印滤镜通过简单插值抑制水印,仅需设置覆盖水印的矩形。代码位于libavfilter/vf_delogo.c,核心是基于矩形外像素值计算插值像素值。
矩形标注滤镜在视频画面中绘制矩形框,用于标注ROI兴趣区域。在人脸检测与人脸识别场景中,cosinor 源码检测到人脸时会用矩形框进行标注。
绘制x宫格滤镜用于绘制四宫格、九宫格,模拟画面拼接或分割。此滤镜通过参数x、y、width、height、color、thickness来定义宫格的位置、大小、颜色与边框厚度。
调整yuv或rgb滤镜通过计算查找表,绑定像素输入值到输出值,然后应用到输入视频,实现色彩、对比度等调整。相关代码位于vf_lut.c,支持四种类型:packed 8bits、packed bits、planar 8bits、planar bits。
将彩色视频转换为黑白视频的滤镜设置U和V分量为,实现效果如黑白视频所示。
FFmpeg源码分析: AVStream码流
在AVCodecContext结构体中,AVStream数组存储着所有视频、音频和字幕流的信息。每个码流包含时间基、时长、索引数组、编解码器参数、dts和元数据。索引数组用于保存帧数据包的offset、size、timestamp和flag,方便进行seek定位。
让我们通过ffprobe查看mp4文件的码流信息。该文件包含5个码流,是双音轨双字幕文件。第一个是video,编码为h,帧率为.fps,分辨率为x,像素格式为yuvp。第二个和第三个都是audio,编码为aac,采样率为,立体声,语言分别为印地语和英语。第四个和第五个都是subtitle,语言为英语,编码器为mov_text和mov_text。
调试实时数据显示,stream数组包含以下信息:codec_type(媒体类型)、codec_id、bit_rate、profile、level、width、height、sample_rate、channels等编解码器参数。
我们关注AVCodecContext的编解码器参数,例如codec_type、codec_id、bit_rate、profile、level、width、height、sample_rate和channels。具体参数如下:codec_type - 视频/音频/字幕;codec_id - 编码器ID;bit_rate - 位率;profile - 编码器配置文件;level - 编码器级别;width - 宽度;height - 高度;sample_rate - 采样率;channels - 音道数。
AVStream内部的nb_index_entries(索引数组长度)和index_entries(索引数组)记录着offset、size、timestamp、flags和min_distance信息。在seek操作中,通过二分查找timestamp数组来定位指定时间戳对应的帧。seek模式有previous、next、nearest,通常使用previous模式向前查找。
时间基time_base在ffmpeg中用于计算时间戳。在rational.h中,AVRational结构体定义为一个有理数,用于时间计算。要将时间戳转换为真实时间,只需将num分子除以den分母。
BMP协议:可手动解码的数据传输/保存协议(含源代码)
通常情况下,由红、绿、蓝三种颜色组成,即RGB显示。
在中,红、绿、蓝通道通常都是8位深度,被称为位位图。
因此,一个像素的颜色信息总是包含3个字节。
换句话说,我们可以将任何信息嵌入到像素的颜色中。
只要能无损地保存每个像素的信息,例如:
1. BMP格式(位图)
bmp格式可以直接保存每个像素点的颜色信息,并且这些信息在存储上是连续的。这非常适合我们的需求。
这里使用的特定bmp格式的文件头大致如下:
将对应的值填入,然后写入像素颜色(文件数据)即可。
但是,这里有一个小问题,BMP每行的数据量必须是4n字节,不足的部分需要向上补齐。(n为整数)
换句话说,由于每个像素有3字节,最好让每行有4n个像素,以免出现问题。
理论上,我们可以将任何文件直接放入另一个中:
要从文件乙提取文件甲,直接从文件乙的第个字节读取并保存即可。
然而,这里还有一个问题:
1. 不是所有文件大小都是的整数倍。
2. 如果m和n的差距很大,就会变成条状。
因此,除非原文件可以在末尾添加一些无用信息后仍然正常使用,或者有其他方式得知文件的实际大小,否则我们需要另外封装一个中间层:
...不过,一般来说,因为我传输的是文本文件(源代码),所以在最后加上一大堆空格补齐即可,并不需要使用这个方法。
来试试手:
《另存为.cpp》
查看的方式:
当然,如果你缺少bionukg_graphics.h这个我自己写的头文件,肯定编译不出来。
它在这里,请自取:
保存之后取不出来?
虽然服务器上保存的格式通常是无损的,但并不代表你可以用bmp的方式直接提取。
你需要另存为位位图文件,然后再提取。
Pixel ArtAseprite像素软件源码编译使用(白嫖.刀)
探索强大的Aseprite像素图像软件,本文为您带来源码编译使用的详细指南。首先,通过运行构建命令,您将看到成功的输出,这一步骤是确保软件正确安装的关键一步。
若您希望简化流程,不进行skia编译,可以选用预编译库作为替代方案,同样能实现功能使用。
请私信我以获取完整阅读体验,主页上您可一窥我全面的笔记内容。这些笔记汇集了丰富的图形学实战经验,旨在加速您的学习成长,避免走不必要的弯路。
通过深入研究与实践,您将掌握高效的图形学知识,面试时更有底气,工作期间也能轻松应对。这里汇集了PerfectPixel计算机图形学的首页资料目录,包括Unreal Engine、实时渲染、路径追踪、图形研究等丰富内容。