Cocos Creator 3.8.x 后效处理(前向渲染)

关于怎么开启后效效果我这里不再赘述,可以前往Cocos官方文档查看具体细节:后效处理官网

下面讲一下怎么自己定义一个后处理效果,想添加自己的后效处理的话只需要在postProcess节点下添加一个BlitScreen 组件即可,然后自己去添加自己想要的材质,官方说 简单的后效可以直接将后效材质添加到 Blit-Screen 后效组件 上,复杂的后效需要自定义一个后效 pass ,但是我觉得这种方式搞的后处理效果就可以很炸裂。

1:模拟下雨雨滴掉到水面上的效果

首先创建一个shader文件,关键是这个shader文件在哪里下载呢,你可以复制一个内置的后效文件,然后在它的基础上做一下修改,比如我复制 internal/effects/pipeline/post-process/blit-screen.effect文件到自己的项目文件夹里面,但是它还依赖了一个chun文件,这时候我直接将chunk文件也直接复制过来使用,放到我自己的shaders文件夹:稍作修改:

a: 创建shader文件
// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.

CCEffect %{
  techniques:
  - passes:
    - vert: vs
      frag: fs
      pass: post-process
      rasterizerState:
        cullMode: none
      depthStencilState:
        depthTest: false
        depthWrite: false
      blendState:
        targets:
        - blend: true
          blendSrc: one
          blendDst: one_minus_src_alpha
          blendSrcAlpha: one
          blendDstAlpha: zero
      properties:
        color: {value: [1.0,1.0,1.0,0.5],editor: {type: color}}
}%


CCProgram vs %{
  /* 这个vs就是 我复制不来的chunk 放到shaders文件夹了 */
  #include <./vs>
  
}%


CCProgram fs %{
  /** 想要使用cc_time变量需要引入这个文件 */
  #include <builtin/uniforms/cc-global>
  precision highp float;
  // Maximum number of cells a ripple can cross.
  #define MAX_RADIUS 1

  // Set to 1 to hash twice. Slower, but less patterns.
  #define DOUBLE_HASH 0

  // Hash functions shamefully stolen from:
  // https://www.shadertoy.com/view/4djSRW
  #define HASHSCALE1 .1031
  #define HASHSCALE3 vec3(.1031, .1030, .0973)

  

  float hash12(vec2 p)
  {
    vec3 p3  = fract(vec3(p.xyx) * HASHSCALE1);
    p3 += dot(p3, p3.yzx + 19.19);
    return fract((p3.x + p3.y) * p3.z);
  }


  vec2 hash22(vec2 p)
  {
    vec3 p3 = fract(vec3(p.xyx) * HASHSCALE3);
    p3 += dot(p3, p3.yzx+19.19);
    return fract((p3.xx+p3.yz)*p3.zy);
  }
  in vec2 v_uv;

  uniform UBO {
    vec4 inputViewPort;
    vec4 color;
  };
  #pragma rate inputTexture pass
  uniform sampler2D inputTexture;

  layout(location = 0) out vec4 fragColor;

  vec3 rain()
  {
    vec2 uv = v_uv;
    uv *= 5.;
      vec2 p0 = floor(uv);

      vec4 time = cc_time;
      vec2 resolution = cc_screenSize.xy;

      vec2 circles = vec2(0.);
      for (int j = -MAX_RADIUS; j <= MAX_RADIUS; ++j)
      {
          for (int i = -MAX_RADIUS; i <= MAX_RADIUS; ++i)
          {
        vec2 pi = p0 + vec2(i, j);
              #if DOUBLE_HASH
              vec2 hsh = hash22(pi);
              #else
              vec2 hsh = pi;
              #endif
              vec2 p = pi + hash22(hsh);

              float t = fract(0.3*time.x + hash12(hsh));
              vec2 v = p - uv;
              float d = length(v) - (float(MAX_RADIUS) + 1.)*t;

              float h = 1e-3;
              float d1 = d - h;
              float d2 = d + h;
              float p1 = sin(40.*d1) * smoothstep(-0.6, -0.3, d1) * smoothstep(0., -0.3, d1);
              float p2 = sin(40.*d2) * smoothstep(-0.6, -0.3, d2) * smoothstep(0., -0.3, d2);
              circles += 0.1 * normalize(v) * ((p2 - p1) / (2. * h) * (1. - t) * (1. - t));
          }
      }
      circles /= float((MAX_RADIUS*2+1)*(MAX_RADIUS*2+1));

      float intensity = mix(0.01, 0.1, smoothstep(0.1, 0.6, abs(fract(0.05*time.x + 0.5)*2.-1.)));
      vec3 n = vec3(circles, sqrt(1. - dot(circles, circles)));
      vec3 color1 = texture(inputTexture, uv/resolution - intensity*n.xy).rgb + 5.*pow(clamp(dot(n, normalize(vec3(1., 0.7, 0.5))), 0., 1.), 6.);
    return color1.xyz;
  }

  void main () {
    fragColor = texture(inputTexture, v_uv);
    vec3 destColor = rain();
    fragColor.rgb = mix(fragColor.rgb,destColor,color.a);
  }

}%

然后创建一个材质,effect使用上面的shader文件 取名叫做rain

b: 把材质放到BlitScreen上的材质插槽

这个时候已经可以在编辑器中看到效果了。当然这个BlitScreen是一个数组,你可以在创建一个材质来再做一个效果出来,因为它是一个数组

2:模拟炸裂技能的效果

跟上一个shader文件类似,你可以在创建一个shader文件,你可以同样复制上一个shader文件

只是里面的视线变了而已,

a: 创建shader文件 ele.effect:
// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.

CCEffect %{
  techniques:
  - passes:
    - vert: vs
      frag: fs
      pass: post-process
      rasterizerState:
        cullMode: none
      depthStencilState:
        depthTest: false
        depthWrite: false
      blendState:
        targets:
        - blend: true
          blendSrc: one
          blendDst: one_minus_src_alpha
          blendSrcAlpha: one
          blendDstAlpha: zero
      properties:
        color: {value: [1.0,1.0,1.0,0.5],editor: {type: color}}
}%


CCProgram vs %{
  #include <./vs>
  
}%


CCProgram fs %{
  #include <builtin/uniforms/cc-global>
  precision highp float;
  
  in vec2 v_uv;

  uniform UBO {
    vec4 inputViewPort;
    vec4 color;
  };
  #pragma rate inputTexture pass
  uniform sampler2D inputTexture;

  layout(location = 0) out vec4 fragColor;

  const float PI = 3.14159265359;


float random(float p){
  	return fract(sin(p) * 10000.0);
} 
  
float noise(vec2 p){
	float t = cc_time.x / 2000.0;
    if(t > 1.0) t -= floor(t);
    return random(p.x * 14. + p.y * sin(t) * 0.5);
}

vec2 sw(vec2 p){
  	return vec2(floor(p.x), floor(p.y));
}
  
vec2 se(vec2 p){
  	return vec2(ceil(p.x), floor(p.y));
}
  
vec2 nw(vec2 p){
  	return vec2(floor(p.x), ceil(p.y));
}
  
vec2 ne(vec2 p){
  	return vec2(ceil(p.x), ceil(p.y));
}

float smoothNoise(vec2 p){
  	vec2 inter = smoothstep(0.0, 1.0, fract(p));
  	float s = mix(noise(sw(p)), noise(se(p)), inter.x);
  	float n = mix(noise(nw(p)), noise(ne(p)), inter.x);
    return mix(s, n, inter.y);
}

mat2 rotate (in float theta){
  	float c = cos(theta);
  	float s = sin(theta);
    return mat2(c, -s, s, c);
}

float circ(vec2 p){
	float r = length(p);
  // return r;
  // 防止线性变化
	r = log(sqrt(r));
  float intensity = 7.;
  // 周期性出现
	return abs(sin(.8 * r + PI * 4.0)) * 7. + 0.2;
}

float fbm(in vec2 p){
	float z = 2.0;
  // 每层噪声贡献的结果总和
    float rz = 0.0;
    vec2 bp = p;
    // 用于生成5层不同频率的噪声
    for(float i = 1.0; i < 6.0; i++) {
      // 随着 z 的增加,每层噪声的影响减少,模拟了自然界中细节随观察距离增加而减少的现象
    	rz += abs((smoothNoise(p) - 0.5)* 2.0) / z;
        // 振幅衰减
        z *= 2.0;
        // 频率加倍。通过将 p 加倍,实际上是在增加噪声的频率,使得每一层的噪声比上一层更“紧密”,这样就能在最终的噪声图案中创造出更多的细节。
        p *= 2.0;
    }
    return rz;
}

vec3 ele()
{
  vec2 uv = v_uv;
  // uv *= .5;
    vec2 p = uv - 0.5;
    vec2 resolution = cc_screenSize.xy;
    p.x *= resolution.x / resolution.y;
    p *= 10.;
    float rz = fbm(p);
    p /= exp(mod(cc_time.x * 2.0, PI));
    rz *= pow(abs(0.1 - circ(p)), 0.9);
    vec3 col = vec3(0.2, 0.1, 0.643);
    return col / rz;
}

  void main () {
    fragColor = texture(inputTexture, v_uv);
    vec3 destColor = ele();
    fragColor.rgb = mix(fragColor.rgb,destColor,color.a);
  }

}%

b: 创建材质文件 ele.mtl,并且放到BlitScreen中

是不是相当的炸裂

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时隔n年再度会看Vue,Git

时隔n年再度会看Vue,Git 曾经沧海难为水&#xff0c;除却巫山不是云。不知道这句话用在这里合不合适&#xff0c;好多东西在记忆中都淡化了。但是互联网确是有记忆的。研究以前项目的时候&#xff0c;翻看到gitee码云上托管的项目&#xff0c;就像是自己的孩子重新又回来了一样…

【STM32】江科大STM32学习笔记汇总(50)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【STM32】STM…

0基础跨考计算机|408保姆级全年计划

我也是零基础备考408&#xff01; 虽说是计算机专业&#xff0c;但是本科一学期学十几门,真的期末考试完脑子里什么都不进的...基本都是考前一周发疯学完水过考试...&#x1f605; 想要零基础跨考可以直接从王道开始&#xff01;跟教材一点一点啃完全没必要&#x1f978; 现在…

http状态,cookie、session、token的对比

http是无状态的&#xff0c;也就是说断开会话了服务器就不记得任何事情了&#xff0c;但这样对于用户会很麻烦&#xff0c;因为要不停输入用户名和密码 cookie是放在浏览器里的数据&#xff0c;第一次访问后服务器会set cookie&#xff0c;然后浏览器保存这个cookie&#xff0…

《PySide6/PyQt6快速开发与实战》P111被省略了的案例

编程环境&#xff1a;Fedora, QtCreator 见代码&#xff1a; # This Python file uses the following encoding: utf-8 import sys from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget from PySide6.QtGui import QPalette #, QColo…

CryoEM - 使用 cryoSPARC 基于单颗粒图像从头重构蛋白质三维结构

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 基于冷冻电镜单颗粒图像重构蛋白质三维结构,利用冷冻电镜技术测定生物大分子结构的方法。原理是从冷冻电镜获得大量同一种蛋白质分子的二维投影图…

什么是端点安全以及如何保护端点

什么是端点安全 端点是指可以接收信号的任何设备&#xff0c;是员工使用的一种计算设备&#xff0c;用于保存公司数据或可以访问 Internet。端点的几个示例包括&#xff1a;服务器、工作站&#xff08;台式机和笔记本电脑&#xff09;、移动设备、虚拟机、平板电脑、物联网、可…

YOLOV8介绍

原文链接&#xff1a; 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署&#xff08;实战&#xff09;&#xff08;&#xff09;有具体部署和训练实现代码YOLOV8模型训练部署&#xff08;实战&#xff09;&…

Mac 以SH脚本安装Arthas

SH脚本安装Aethas curl -L https://alibaba.github.io/arthas/install.sh | sh安装脚本说明 示例源文件&#xff1a; #! /bin/bash# temp file of as.sh TEMP_ARTHAS_FILE"./as.sh.$$"# target file of as.sh TARGET_ARTHAS_FILE"./as.sh"# update timeo…

【AI Agent系列】【MetaGPT多智能体学习】5. 多智能体案例拆解 - 基于MetaGPT的智能体辩论(附完整代码)

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第三篇笔记。主要是对课程刚开始环境搭…

AI Word Helper (Chorme Extentions) AI单词助手(谷歌浏览器插件)

AI Word Helper (Chorme Extentions) AI单词助手&#xff08;谷歌浏览器插件&#xff09; 英文网站&#xff0c;划词查单词&#xff0c;还是看不懂&#xff1f;因为单词意思那么多&#xff0c;词性搞不清&#xff0c;上下文搞不清&#xff0c;出来的意思就没法用&#xff0c;G…

【Spring整合H2内嵌数据库】

目录 H2介绍整合引入依赖配置相关参数编写sql文件启动spring boot项目&#xff0c;登录控制台 jpa实践entityservicedao 《饮酒》.&#xff08;陶渊明&#xff09; 结庐在人境&#xff0c;而无车马喧。 问君何能尔&#xff0c;心远地自偏。 采菊东篱下&#xff0c;悠然见南山…

【模型复现】自制数据集上复现目标检测域自适应 SSDA-YOLO

【模型复现】自制数据集上复现目标检测域自适应 SSDA-YOLO 1. 环境安装2. 数据集制作2.1 数据准备2.2 数据结构 3. 模型训练3.1 数据文件配置3.2 训练超参数配置3.3 模型训练 4. 模型验证4.1 验证超参数配置4.2 模型验证 5. 模型推理5.1 推理超参数配置5.2 模型推理 6. 踩坑记录…

计算机网络-典型网络组网架构

前面基本网络知识已经能够满足中小企业的需要了&#xff0c;今天来看下一些基本网络组网架构。 首先网络是分层架构&#xff0c;从接入层到汇聚层再到核心层&#xff0c;然后接入运营商出口。内部包括有线网络、无线网络&#xff0c;出口一般可以使用路由器或者防火墙进行安全防…

Docker:开启访问端口 || IDEA开发工具快速部署到服务器

参考文档&#xff1a;Docker开启远程安全访问-腾讯云开发者社区-腾讯云 一、Linux服务器环境 1.1、安装Linux 1.2、安装docker 二、Linux服务器配置docker开放端口 2.1、首先进入docker配置文件打开 /usr/lib/systemd/system/docker.service 或运行以下命令 vi /usr…

智能咖啡厅助手:人形机器人 +融合大模型,行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛)

智能咖啡厅助手&#xff1a;人形机器人 融合大模型&#xff0c;行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛) “机器人大模型与具身智能挑战赛”的参赛作品。的目标是结合前沿的大模型技术和具身智能技术&#xff0c;开发能在模拟的咖啡厅场景中承担服务员角色并…

蓝桥杯:真题讲解3(C++版)附带解析

报纸页数 来自&#xff1a;2016年七届省赛大学C组真题&#xff08;共8道题) 分析&#xff1a; --画出报纸长的样子&#xff0c;如果我们在上面多画一张报纸&#xff0c;那么就符合题意的5&#xff0c;6&#xff0c;11&#xff0c;12。 观察这张图&#xff1a;观察3&#xf…

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…

阿尔卡特Adixen ADP/ADS 系列 2 干泵使用说明

阿尔卡特Adixen ADP/ADS 系列 2 干泵使用说明

JVM 第二部分-2(堆,方法区)

4.堆 堆 一个Java程序&#xff08;main方法&#xff09;对应一个jvm实例&#xff0c;一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建&#xff0c;大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域&#xff0c;是垃圾回收的重点区域堆可以位…
最新文章