首页 > 其他分享 >后处理 - 色调映射

后处理 - 色调映射

时间:2024-03-27 22:56:15浏览次数:20  
标签:Tonemapping float 映射 color Material Shader 后处理 色调

就是将颜色值通过映射公式得到另一种颜色值,比如:将颜色值*0.8也算是映射公式

但这边介绍的映射公式可以得到一种电影校色的效果,至于原理,一般都是经验公式。

 

效果

 

c#代码

using UnityEngine;

public class TonemappingEff : MonoBehaviour
{

    public Shader m_Shader;
    public Material m_Material;

    void Start()
    {
        if (false == SystemInfo.supportsImageEffects)
        {
            Debug.LogWarning("This platform does not support image effects or render textures.");
            this.enabled = false;
            return;
        }

        if (null == m_Material)
        {
            if (null != m_Shader && m_Shader.isSupported)
            {
                m_Material = new Material(m_Shader);
                m_Material.hideFlags = HideFlags.DontSave;
            }
        }
        else if (m_Material.shader != m_Shader)
        {
            if (m_Shader.isSupported) //优先shader
            {
                m_Material = new Material(m_Shader);
                m_Material.hideFlags = HideFlags.DontSave;
            }
        }
    }

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (null != m_Material)
        {
            Graphics.Blit(src, dest, m_Material);
        }
        else
        {
            Graphics.Blit(src, dest);
        }
    }

}

 

shader

Shader "My/PostEff/Tonemapping"
{
	Properties
	{
	_MainTex("Texture", 2D) = "white" {}
	}

	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always

		Pass
		{
			CGPROGRAM
			#pragma vertex vert_img
			#pragma fragment frag

			#include "UnityCG.cginc"

			sampler2D _MainTex;

			//hdr颜色值, 用曲线函数映射到[0, 1]颜色范围内
			float3 ACES_Tonemapping(float3 x)
			{
				float a = 2.51f;
				float b = 0.03f;
				float c = 2.43f;
				float d = 0.59f;
				float e = 0.14f;
				float3 encode_color = saturate((x*(a*x + b)) / (x*(c*x + d) + e));
				return encode_color;
			}

			fixed4 frag(v2f_img i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				half3 linear_color = pow(col.rgb, 2.2); //Gamma空间转换成线性空间
				half3 encode_color = ACES_Tonemapping(linear_color);
				col.rgb = pow(encode_color, 1 / 2.2); //线性空间转换为Gamma空间
				return col;
			}
			ENDCG
		}
	}
}

 

颜色空间设置

菜单 -> File -> Builder Settings -> Player Settings -> Player页签

 

参考 

Unity自定义后处理——Tonemapping色调映射_unity 的tonemapping-CSDN博客

 

标签:Tonemapping,float,映射,color,Material,Shader,后处理,色调
From: https://www.cnblogs.com/sailJs/p/18098471

相关文章

  • 后处理 - 亮度,饱和度,对比度
    效果 c#代码usingUnityEngine;publicclassMyBrightnessSaturationAndContrast:MonoBehaviour{publicShaderm_Shader;publicMaterialm_Material;[Range(0.0f,3.0f)]publicfloatm_brightness=1.0f;[Range(0.0f,3.0f)]publ......
  • Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
    场景Nginx搭建静态资源映射实现远程访问服务器上的图片资源:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/117283572以上在配置静态资源映射时使用的如下配置     location/{           root  D:/pic_old/;           try_......
  • Spring整合Mybatis方式一 - 常规整合 - 注册映射器
    前置工作导包(mybatis-spring、mysql-connector-java、mybatis、spring-webmvc等)实体类DAO层两个文件(接口、xml文件);Service层的接口编写Spring管理mybatis的xml-spring-dao.xml核心代码(两种方式实现)第一种:xml<!--将会话工厂对象托管给spring--><beanid="sqlSess......
  • java.web 中的路径映射是啥
    在JavaWeb开发中,路径映射指的是将HTTP请求的URL与服务器端的某个组件(如Servlet、JSP页面或RESTful服务)关联起来的过程。当客户端发起一个请求时,Web服务器(如Tomcat、Jetty等)会根据其内部的配置来解析这个URL,并将其映射到相应的处理程序。具体到Servlet中,路径映射是在部署描......
  • Mybatis的接口映射原理
    1、问题引入在使用Mybaits时,只需要写一个Mapper接口(不用写实现类),并在对应的xml文件中写好sql。然后,Mybatis就自动实现了具体的CRUD方法调用。通常我们使用Mybatis的主要步骤是:构建SqlSessionFactory(通过xml配置文件,或者直接编写Java代码)从SqlSessionFactor......
  • drf : 自动生成路由,视图层自定义方法,路由映射方法,action参数。
    扩展一个知识点:在Django中,代码只要顶格编写,程序一运行,代码将直接执行。drf路由Routers自动生成路由需要继承ViewSetMixin子类,重写了as_view()方法。导入模块:fromrest_frameworkimportrouters创建router对象,并注册视图集合,例如:router=SimpleRouter()router.registe......
  • DMA一致性映射使用
    DMA映射可参考:https://www.cnblogs.com/lethe1203/p/18092749 reserved_memory方式1、定义保留内存的节点,由设备节点使用test_device_reserved:pmu_noc@0xe8000000{compatible="shared-dma-pool";reg=<0x00xe80000000x00x800000>;......
  • DMA映射
    参考资料:https://elinux.org/images/3/32/Pinchart--mastering_the_dma_and_iommu_apis.pdf《宋宝华:Linux设备驱动开发详解》 VA和PA的相互转换:系统启动时,MMU便会建立映射表,将DRAM物理地址和虚拟地址进行映射,在linux内核中,可以使用下面的函数完成VA和PA的转换#definevir......
  • c++ stl 之映射—— map 详解
     map是stl的一个关联容器,名叫“映射”,何为“映射”?其实就是一个数组,但有了数组何必还需映射,这是一个高深的问题。目录一、map简介         1.空间复杂度    2.时间复杂度     3.“键”的类型二、 map用法     1.声明  ......
  • 地址映射
    MMU的相关概念可参考:https://www.cnblogs.com/lethe1203/p/18064515Linux驱动开发在某些情况也会直接操作寄存器 MMU主要完成的功能:1、完成虚拟空间到物理空间的映射2、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性对于32位的处理器来说,虚拟地址范围为:2^32=4......