[游戏开发][Shader]ShaderToy通用模板转Unity-CG语言

news2024/11/18 17:20:19

 这个通用模板貌似是Candcat写的,漏了几个宏定义,我这给补一下,例如:

#define iTime _Time.y

#define atan atan2

对照表如下

 代码如下

Shader "Shadertoy/Template" {
    Properties{
        iMouse("Mouse Pos", Vector) = (100, 100, 0, 0)
        iChannel0("iChannel0", 2D) = "white" {}
        iChannelResolution0("iChannelResolution0", Vector) = (100, 100, 0, 0)
    }

        CGINCLUDE
#include "UnityCG.cginc"   
#pragma target 3.0      

#define vec2 float2
#define vec3 float3
#define vec4 float4
#define mat2 float2x2
#define mat3 float3x3
#define mat4 float4x4
#define iGlobalTime _Time.y
#define iTime _Time.y
#define mod fmod
#define mix lerp
#define fract frac
#define texture2D tex2D
#define iResolution _ScreenParams
#define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.w) * _ScreenParams.xy)

#define PI2 6.28318530718
#define pi 3.14159265358979
#define halfpi (pi * 0.5)
#define oneoverpi (1.0 / pi)

            fixed4 iMouse;
        sampler2D iChannel0;
        fixed4 iChannelResolution0;

        struct v2f {
            float4 pos : SV_POSITION;
            float4 scrPos : TEXCOORD0;
        };

        v2f vert(appdata_base v) {
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
            o.scrPos = ComputeScreenPos(o.pos);
            return o;
        }

        vec4 main(vec2 fragCoord);

        fixed4 frag(v2f _iParam) : COLOR0{
            vec2 fragCoord = gl_FragCoord;
            return main(gl_FragCoord);
        }

            vec4 main(vec2 fragCoord) {
            return vec4(1, 1, 1, 1);
        }

        ENDCG

            SubShader{
                Pass {
                    CGPROGRAM

                    #pragma vertex vert    
                    #pragma fragment frag    
                    #pragma fragmentoption ARB_precision_hint_fastest     

                    ENDCG
                }
        }
            FallBack Off
}

 测试Shader的代码,把这个脚本挂到相机上,把shader托进去即可,如果有的shader需要material,则把material拖进去。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class ScreenEffect : MonoBehaviour
{

    public Shader effectShader;
    public Material effectMaterial;
    public Material EffectMaterial
    {
        get
        {
            if (effectMaterial == null)
            {
                effectMaterial = CreateMaterial(effectShader, effectMaterial);
                return effectMaterial;
            }
            else
            {
                return effectMaterial;
            }
        
        }
    }

    [Range(0.0f, 3.0f)]
    public float brightness = 1.0f;  //亮度

    [Range(0.0f, 3.0f)]
    public float saturation = 1.0f;  //饱和度

    [Range(0.0f, 3.0f)]
    public float contrast = 1.0f;    //对比度


    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (EffectMaterial != null)
        {
            EffectMaterial.SetFloat("_Brightness", brightness);
            EffectMaterial.SetFloat("_Saturation", saturation);
            EffectMaterial.SetFloat("_Contrast", contrast);
            //对渲染纹理进行处理
            Graphics.Blit(src, dest, EffectMaterial);
        }
        else
        {
            Graphics.Blit(src, dest);
        }
    }

    private void Start()
    {
        bool isSupported = CheckSupport();

        if (isSupported == false)
        {
            this.enabled = false;
        }
    }


    // 检测当前平台是否支持屏幕特效
    private bool CheckSupport()
    {
        if (SystemInfo.supportsImageEffects == false || SystemInfo.supportsRenderTextures == false)
        {
            Debug.LogWarning("当前平台不支持!");
            return false;
        }
        return true;
    }


    // 创建材质
    private Material CreateMaterial(Shader shader, Material material)
    {
        if (shader == null)
        {
            return null;
        }

        if (shader.isSupported && material && material.shader == shader)
            return material;

        if (!shader.isSupported)
        {
            return null;
        }
        else
        {
            material = new Material(shader);
            material.hideFlags = HideFlags.DontSave;
            if (material)
                return material;
            else
                return null;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

恩智浦为稳固地位,将扩大投资4国家 | 百能云芯

车用芯片制造商恩智浦,今天宣布了一项重大计划,旨在进一步深耕欧洲市场。该公司将利用欧洲微电子和通信技术共同利益重点计划(IPCEI ME/CT)的支持,加强其在奥地利、德国、荷兰和罗马尼亚的研发能力,并将根据…

MySQL数据库详解 五:用户管理

文章目录 1. 数据库的用户管理1.1 新建用户1.2 重命名用户1.3 删除用户1.4 修改用户密码1.5 忘记用户密码的解决方法1.6 数据库用户授权1.6.1 授权用户权限类别1.6.2 添加权限1.6.2 撤销权限 2. mysql命令 1. 数据库的用户管理 1.1 新建用户 create user 用户名来源地址 [ide…

性能测试必备知识-使用MySQL存储过程构造大量数据:实例解析

在软件开发过程中,测试是一个不可或缺的环节。通过测试,我们可以发现并修复软件中的各种问题,提高软件的质量和稳定性。然而,手动编写大量的测试用例是一项耗时且容易出错的任务。为了解决这个问题,我们需要学会使用批…

一文了解线上展厅设计与搭建要点,线上展厅有哪些应用

引言: 线上展厅已经成为了现代营销领域中不可或缺的一部分。通过巧妙的设计与搭建,企业可以与潜在客户建立更深入的联系,提高品牌知名度,从而提高商务成交量。 一、线上展厅设计要点 线上展厅的设计是关键的一步,因为…

架构师面试必备:高并发限流算法全攻略

Hello大家好,我是小米!今天我要和大家聊一聊一个在技术面试中经常被问到的问题——高并发限流算法!这个话题非常有趣,也是我们在日常工作中经常会碰到的挑战之一。在本文中,我将详细介绍一些常见的高并发限流算法&…

无涯教程-JavaScript - SUMIF函数

描述 您可以使用SUMIF函数对满足指定条件的范围内的值求和。 语法 SUMIF (range, criteria, [sum_range])争论 Argument描述Required/Optionalrange 您要通过条件判断的单元格范围。 每个范围中的单元格必须是数字或包含数字的名称,数组或引用。 空白和文本值将被忽略。 所…

AMEYA360:村田土壤传感器新增功能

村田制作所新增了土壤传感器功能,除了以前的普通土壤外,还可对人工培养土岩棉、椰糠进行测量。 近年来,对番茄、草莓等农作物广泛使用配制营养土岩棉及椰糠等人工培养土。相较普通培养土,此类培养土的保水力非常高,且难…

面试官:Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同?

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 开始之前 正文 一、Options Api 二、Composition Api 三、对比 逻辑组织 Options API Compostion API 逻辑…

vue select联动 设置filterable坑

需求: 平台改变 获取服务类目List 服务类目改变 获取模板标题List 模板标题改变 获取关键词List 由于模板标题List数据条数较多,因此需要设置可搜索选择 问题:由于模板标题加了【filterable】属性。当服务类目改变时,模板标题要么…

肖sir__mysql之索引__010

mysql之索引 一、什么是索引? 索引是一种数据结构设计 一个索引是存储的表中数据结构; 索引是建立在表字段上, 索引包含了一列值,这个值保存在一个数据结构中 二、索引作用 1、保证数据记录的唯一性 2、实现表与表之间的参照性 3…

openGauss学习笔记-72 openGauss 数据库管理-创建和管理分区表

文章目录 openGauss学习笔记-72 openGauss 数据库管理-创建和管理分区表72.1 背景信息72.2 操作步骤72.2.1 使用默认表空间72.2.1.1 创建分区表(假设用户已创建tpcds schema)72.2.1.2 插入数据72.2.1.3 修改分区表行迁移属性72.2.1.4 删除分区72.2.1.5 增…

java学习--day6(数组)

文章目录 day5作业今天的内容1.数组1.1开发中为啥要有数组1.2在Java中如何定义数组1.3对第二种声明方式进行赋值1.4对数组进行取值1.5二维数组【了解】1.6数组可以当成一个方法的参数【重点】1.7数组可以当成一个方法的返回值1.8数组在内存中如何分配的【了解】 2.数组方法循环…

一文轻松实现在VSCode中编写Go代码

1.下载并安装VSCode VSCode(Visual Studio Code)是一款免费且功能强大的开源代码编辑器。VSCode适用于Windows、macOS和Linux操作系统,提供了丰富的编辑功能,包括语法高亮、智能代码补全、代码导航、重构支持、代码片段、多光标编…

windows常见的命令行操作

1.查看网络 ipconfig 2.根据任务id关闭进程 1.模糊搜索服务 tasklist | findstr QQ 2.根据模糊搜索结果,获取对应的pid taskkill /F /PID 5128 其他常见命令 若不清楚参数,使用(命令 /?)即可查看help

APP不存在,AK有误请检查再重试。详情查看: http://lbsyun.baidu.com/apiconsole/key

近期网站报百度地图无法使用情况,请参考百度提示的详情操作。 提示1: 提示2: 创建并复制AK教程:获取百度地图AK-易优CMS

看我72变!教你最火的 AI 变身换脸

今天要向大家推荐一个超级实用的AI换脸 APP——好说AI !这款工具让你告别繁琐的修图流程,轻松几步就能生成完美照片。更重要的是,无需电脑,只要手机就能搞定! 从前,我们看着综艺和电视剧,幻想着…

【好书推荐】《用户画像:平台构建与业务实践》

文章目录 1. 内容简介2. 书籍目录3. 图文介绍4. 送书活动 在大数据时代,如何有效地挖掘数据价值并通过画像数据进行呈现,如何基于画像数据构建平台功能并提高业务产出,是值得各类公司和业务人员思考并付诸实践的事情。通过画像释放大数据价值…

项目运行报错:error:0308010C:digital envelope routines::unsupported

node版本升到18之后,运行老项目报错 运行命令:npm run dev 解决办法: 第一步:在运行命令中补充set NODE_OPTIONS–openssl-legacy-provider & 第二步:如果依然报错,在终端中运行set NODE_OPTIONS–ope…

电视盒子什么品牌好?数码小编盘点网络电视盒子排行榜

电视盒子什么品牌好?每个品牌的优势并不一样,我们要根据自己的需求选择,看视频选无广告的,投屏频繁选投屏功能完善的,不懂的新手们可以参考小编分享的网络电视盒子排行榜,堪称目前最专业权威的电视盒子排名…

逻辑漏洞挖掘之XSS漏洞原理分析及实战演练 | 京东物流技术团队

一、前言 2月份的1.2亿条用户地址信息泄露再次给各大公司敲响了警钟,数据安全的重要性愈加凸显,这也更加坚定了我们推行安全测试常态化的决心。随着测试组安全测试常态化的推进,有更多的同事对逻辑漏洞产生了兴趣,本系列文章旨在…