Unity 屏幕后处理及原理
后处理原理及过程后处理是在渲染完后对图像进行处理,unity使用的是 C# 脚本
就是渲染完后不显示,多走一步,经由脚本处理后再显示到屏幕上,以实现诸如各种模糊效果、Bloom、描边等等
后处理一般过程
获取当前屏幕图像,利用C#脚本调用shader对图像进行处理,在将处理后的图像显示到屏幕上
原理
创建了一个同屏幕宽高完全一样的面,将之前的渲染结果作为渲染纹理传入脚本,调用shader对纹理采样渲染回面片
所以在后处理时需要关闭深度写入等,防止渲染纹理覆盖了特殊情况下最后渲染的半透明物体
Unity提供了OnRenderImage() 函数获取屏幕图像
MonoBehaviour.OnRenderImage (RenderTexture src, RenderTexture dest)
123456/*OnRenderImage中利用Graphics.Blit实现处理*/public static void Blit(Texture src, Texture dest);public static void Blit(Texture src, Texture dest, Mate ...
Unity 透明效果
Unity 中实现透明效果一般有两种方法
透明度测试(Alpha Test)原理:只要片元的透明度不符合要求就直接舍弃
不关闭深度写入(ZWrite)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172Shader "AlphaTest"{ Properties{ _MainTex ("Main Tex", 2D) = "white" {} _Color ("Color", Color) = (1, 1, 1, 1) _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5 //控制剔除的阈值 } SubShader { ...
MVP变换详解
MVP变换详解之前学习中对这部分的理解不深,简单补了一遍线代,就又温习了一遍 MVP 变换
概述MVP 变换简单来说就是将我们已经构建好的各种3维模型映射到屏幕这个2维坐标中, 参与 MVP 变换的信息包括点、矢量、法线、切线等
模型变换(Model):将模型空间转换到世界空间
观察变换(View):将世界空间转换到观察空间
投影变换(Projection):将观察空间转换到裁剪空间
最后要获取屏幕坐标还需要一步:屏幕映射,又叫视口变换
屏幕映射:获取对应屏幕的 2D 坐标
《Shader 入门精要》的配图:
模型变换(Model)本质就是旋转,平移,缩放(见本文最后)
模型自身会携带模型坐标的原点信息等,再结合世界坐标还是很好变换的
观察变换(View)在我的理解下,M 和 V 变换本质上是同一种类型的变换
比较快速的方法是把整个摄像机坐标空间移动到世界坐标使二者重合再反转 z 轴(不是真的移动摄像机),即在物体与摄像机相对位置不变的情况下让摄像机位于(0,0,0),将变换摄像机的矩阵作用于物体上就可得到观察空间中的坐标
ps:模型变换也能这么想
投影(Projection)投影要为 ...
GAMES101-Ray Tracing
GAMES101-Ray Tracing光栅化无法很好的控制全局效果,fast but quality is low
glossy reflection:对比铜镜
Indirect illumination:间接照明
Introduction三个ideas
光线沿直线传播
光线之间不会发生碰撞
光线来自light source
光线可逆
eye ray
眼到每一个pixel的射线
Whitted-Style
反射、折射
每一个弹射点的着色都会被算入 eye ray 的 pixel,每一个点都要判断是否能被照亮
primary ray,secondary ray,shadow ray
光线:
由源点和方向向量定义
任意一点:r(t) = O + td
和球的交点:点p同时满足光线方程和球方程
其他隐式表面同理
显式表面:和三角形求交
先求光线和平面交点,再判断是否在三角形内
平面:法线+点
MT算法:利用三角形重心坐标,直接求t
加速
利用 bounding Volumes 包围盒
减少大量的光线和三角形交点计算
轴对齐包围盒(AABB,Axis-Aligned Boun ...
Games101-Rasterization(Antialiasing and Z-Buffer)笔记
Games101-Rasterization(Antialiasing and Z-Buffer)课堂收获的知识过多,无法全部记录在笔记中…只简单的记录一下大概
走样和反走样what上节课通过判断每个 pixel 是否在三角形内得到的图形会出现很严重的锯齿状边缘,这就是一种走样(Aliasing)
走样(Aliasing)只有锯齿状一种吗?
空间方面:摩尔纹,锯齿
时间方面:车轮效应
简单来说,产生走样的原因是:信号变化太快(数据量太大),采样跟不上(采集的数据少)
黑话:Artifact,指采样产生的各种误差和错误
why涉及信号处理和图像处理
首先提出一种可行方案:先将原图模糊再采样。效果确实比原先好,相当于在外围做了一圈渐变
两个步骤能调换次序吗?
基础知识引入
傅里叶级数展开:任何周期函数,都可以表示成一系列 正弦+余弦+常数 的形式
傅里叶变换:时域$\rightarrow$频域,用于采样
逆傅里叶变换:频域$\rightarrow$时域,用于还原
滤波:将特定频率过滤掉
分析一张黑白照片
(频率信息分布图?忘了)中心白色(低频信号),周围黑色(高频信号),有白色十 ...
glad、glfw配置
glad、glfw配置,VS 2019原文参考 >> https://learnopengl.com/Getting-started/Creating-a-window
中文版参考 >> https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/
GLFW下载glfw
下载地址
一般解压至项目文件夹
链接
解决方案资源管理器 右键 >> 属性 >> VC++目录
包含目录 添加 include 文件夹路径
库目录 添加 lib 文件夹路径
链接器
附加依赖项:手动输入glfw3.lib;opengl32.lib
这时就可以在cpp文件中加入#include <GLFW/glfw3.h>
GLADglad提供在线服务 https://glad.dav1d.de/
Language:C/C++
API gl 选择版本大于等于之前 glfw 版本的选项
Profile 选择 Core
勾选 Generate ...
基于离散对数的公钥加密
基于离散对数的公钥加密1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980import random from Crypto.Util import number def GenPara(bitlen): q = number.getPrime(bitlen-1) while(not number.isPrime(2 * q + 1)): q = number.getPrime(bitlen-1) p = 2 * q + 1 # generate safe prime p = 2 \* q + 1 g = random.randint(0, p-1) while(fastPowMod(g, 2, p) == 1 or fastPowMod(g, q, ...
rsa加解密(python实现)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import random # import random to use randint from Crypto.Util import number # import Crypto.Util.number to use getPrimedef Exgcd(r0, r1): # 扩展欧几里得算法 s0, s1 = 1, 0 t0, t1 = 0, 1 q, r = r0 // r1, r0 % r1 while (r): s, t = s0 - q * s1, t0 - q * t1 s0, s1, t0, t1 = s ...
公钥加密数学基础-欧几里得算法
公钥加密数学基础 - 欧几里得算法标准算法一般用来算两个整数的公因数
即使在大数求公因数时也极其高效
另一个耳熟能详的名字辗转相除法
12345678910#欧几里得算法count = 0def Euclidean(A,B): if A % B == 0: return B global count count += 1 r = A % B return Euclidean(B, r)
扩展欧几里得算法用来算模逆元
1234567891011121314151617181920#扩展欧几里得算法global lsglobal ltls = [1,0] lt = [0,1]s = t = -1def EEA(A,B): if A % B == 0: return 0 r = A % B q = A // B global s s = ls[0] - q*ls[1] global t t = lt[0] - q*lt[1] ls[0],ls[1] = ls[1],s lt[ ...
C++学习笔记
1.基础格式
头文件不用加后缀,如#include<iostream>
头文件的后缀.h、.hpp、.hxx
源文件的后缀.cpp、.cxx、.cc
<<流插入操作符,c里面是位操作符但这里含义变了,这个叫做运算符重载
IDE中是自动将制表符替换为4个空格
函数必须将返回值明确列出,不写的话编辑器默认返回int
main函数不写return的话,会自动返回一个int值
命名空间/名字空间不使用using namespace std;因为会导致不同命名空间中同名的在代码中使用时遇到冲突
最好用类似std::cout<<"Hello"<<std::endl
12345using std::cout;using std::endl;....cout<<"Hello"<<endl;....
名字空间可以嵌套声明可以定义自己的名字空间类似namespace Myname{......}
名字空间的函数在外部不可见,名字空间的一个作用是隔离标识符的作用范 ...