网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月22日漏签0天
unity3d吧 关注:117,088贴子:562,650
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 3 4 5 下一页 尾页
  • 88回复贴,共5页
  • ,跳到 页  
<<返回unity3d吧
>0< 加载中...

分享一个Unity3D的土制油画滤镜制法以及心得----顺便新人报道

  • 只看楼主
  • 收藏

  • 回复
  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近公司规定以后项目开发要使用U5,在整理心爱的Unity4.3时发现自己以前制作的项目发现了以前写过的一个滤镜我知道没图你们都懒得理我


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
开更--------一般3D转2D的意义毛线都没有,做这个单纯只是为了Fun。
项目是4.3条件下可运行的,转到Unity5需要一些小改动,所以就讲讲实现过程神马的


2026-05-22 18:07:00
广告
不感兴趣
开通SVIP免广告
  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
表示被度娘吞得好厉害,缓更


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
对油画滤镜的算法的概念性描述:
//本段摘自http://www.cnblogs.com/hoodlum1980/archive/2011/01/15/1936078.html
滤镜有两个参数,一个是模板半径(radius),则模板尺寸是(radius * 2 + 1)*(radius * 2 + 1)大小,也就是以当前像素为中心,向外扩展 radius 个像素的矩形区域,作为一个搜索范围,我们暂时将它称为“模板”(实际上该算法并不是例如高斯模糊,自定滤镜那种标准模板法,仅仅是处理过程类似,因此我才能实现稍后介绍的优化)。
    另一个参数是光滑度(smoothness),实际上他是灰度桶的个数。我们假设把像素的灰度/亮度( 0 ~ 255 )均匀的分成 smoothness 个区间,则每个区间我们在此称它为一个桶(bucket),这样我们就有很多个桶,暂时称之为桶阵列(buckets)。
    该算法遍历图上的每个像素,针对当前位置 (x, y) 像素,将模板范围内的所有像素灰度化,即把图像变成灰度图像,然后把像素值进一步离散化,即根据像素的灰度落入的区间,把模板内的像素依次投入到相应的桶中。然后从这些桶中找到一个落入像素个数最多的桶,并对该桶中的所有像素求出颜色平均值,作为位置 (x, y) 的结果值。
    上面的算法描述,用下面的示意图来表示。中间的图像是从原图灰度化+离散化(相当于 Photoshop 中的色调分离)的结果,小方框表示的是模板。下方表示的是桶阵列(8 个桶,即把0~255的灰度值离散化成 8 个区间段)。

个人理解是因为油画本身带有一定的水分,当水分在纸上着色时会由于虹吸效应而向四周围扩散,因此成为油画


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1.首先,我们需要创建对应的Properties。这使得脚本和Shader之间可以进行通信。在Properties块中输入如下代码:
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
}
使用_MainTex 的另一个好处是,当把材质球使用ImageEffects.BlitWithMaterial函数制作屏幕特效时当前摄像机画面会自动赋值到_MainTex 中去


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.我们需要在CGPROGRAM块中添加对应的变量,以便Properties块可以和CGPROGRAM块通信:
SubShader
{
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"
//使用Properties块的_MainTex
uniform sampler2D _MainTex;
//使用Unity3D中自带的_MainTex的像素规模属性
//其中_MainTex_TexelSize.z,_MainTex_TexelSize.w为_MainTex这张图片的长和宽
//_MainTex_TexelSize.x为1/_MainTex_TexelSize.z,_MainTex_TexelSize.y=1/_MainTex_TexelSize.w
half4 _MainTex_TexelSize;


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
3.说完参数,现在我们定义一下自己的结构体
//v2f定义为顶点着色器向片段着色器传值的结构体
struct v2f
{
float4 pos : POSITION;//像素位置
half2 uv : TEXCOORD0;//本像素的UV
half4 taps[2] : TEXCOORD1;//本像素旁边像素的UV
};
//自定义结构体,便于运算
struct statistics
{
fixed3 colorRGB : TEXCOORD0;//颜色的值,这个fixed3类型会在后面使用两次,第一次用于记录颜色,第二次用于统计颜色
int Inten: TEXCOORD1; //命名为强度,也有两次用法,第一次使用记录颜色的亮度,第二次是用来记录7楼所说灰度桶中颜色的个数
};


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
4.声明shader顶点着色器
v2f vert( appdata_img v )
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord;//获取顶点UV
//获取顶点偏移(1,1),(-1,-1),(1,-1)以及(-1,1)的UV
o.taps[0] = o.uv.xyxy + half4(1.00,1.00,-1.00,-1.00)*_MainTex_TexelSize.xyxy;//
o.taps[1] = o.uv.xyxy + half4(1.00,-1.00,-1.00,1.00)*_MainTex_TexelSize.xyxy;
return o;
}
使用顶点着色器计算UV而不使用片段着色器计算UV的一个好处是在GPU里面一个顶点着色器要比片段着色器运算次数少得多(我听来的,别打我),这样可以减少以几百万次(?)运算的片段着色器的运算量,减少GPU负荷


2026-05-22 18:01:00
广告
不感兴趣
开通SVIP免广告
  • 宁唯是宁唯
  • Scene
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上博客链接就可以啦


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
6.最后
FallBack "Diffuse"
回滚~回滚


  • 胡家骏2002819
  • Prefab
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
牛逼


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
附上屏幕滤镜附带的cs文件
using UnityEngine;
using System.Collections;
//编辑时运行
[ExecuteInEditMode]
//请挂到有Camera组件的GameObject下
[RequireComponent(typeof(Camera))]
public class RunMaterial: MonoBehaviour {
public Material curMaterial;
// Use this for initialization
void Start ()
{
//材质球是否被支持运行
if (curMaterial == null || curMaterial.shader.isSupported == false)
{
enabled = false;
}
}
void OnRenderImage (RenderTexture source, RenderTexture destination)
{
ImageEffects.BlitWithMaterial(curMaterial, source, destination);
}
// Update is called once per frame
void Update ()
{
if(curMaterial==null)
enabled=false;
}
}


  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
以下是油画滤镜的shader源码(其实用在普通图片那里也是可以的)



  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
完结撒花


2026-05-22 17:55:00
广告
不感兴趣
开通SVIP免广告
  • 美年达乌梅味
  • Animator
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一般的图片使用这个shader就没意义了(直接用PS就可以做出这种效果),但是如果你还是觉得不方便的话我可以提供一个插件供你轰油画,时间不早了明天再更


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 4 5 下一页 尾页
  • 88回复贴,共5页
  • ,跳到 页  
<<返回unity3d吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示