庄懂着色器_L1416_Fire/Water

2023-12-04 14:38

本文主要是介绍庄懂着色器_L1416_Fire/Water,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

庄懂-BoyanTata的个人空间_哔哩哔哩_Bilibili


答疑
双面显示和双面模型的性能比较
火焰效果
绿色部分代表内焰,红色部分代表外焰,蓝色代表其余部分
左边A通道效果:中间强,四周弱
右边RG通道通过混合去扰动左边RG通道
本身不同的形态和Tilling以及流速,然后在做一个叠加Add,产生的效果会有一个随机性
将上一步骤叠加的效果在乘以一个Mask_A和从上到下的一个遮罩,就得到了一个火焰范围扰动的强度
火焰的底部扰动会小一些,所以第四张Mask底部会是一个黑色的从下到上的一个渐变
然后再直接加上一个UV到Y周上
扰动之后的UV所采样的一个效果
火焰效果_代码部分
Shader "AP01/L16/Fire"
{Properties
{_Mask           ("R:外焰 G:内焰 B:透贴", 2d) = "blue"{}_Noise          ("R:噪声1 G:噪声2", 2d) = "gray"{}_Noise1Params   ("噪声1 X:大小 Y:流速 Z:强度", vector) = (1.0, 0.2, 0.2, 1.0)_Noise2Params   ("噪声2 X:大小 Y:流速 Z:强度", vector) = (1.0, 0.2, 0.2, 1.0)[HDR]_Color1    ("外焰颜色", color) = (1,1,1,1)[HDR]_Color2    ("内焰颜色", color) = (1,1,1,1)}SubShader{Tags{"Queue"="Transparent"               // 调整渲染顺序"RenderType"="Transparent"          // 对应改为Cutout"ForceNoShadowCasting"="True"       // 关闭阴影投射"IgnoreProjector"="True"            // 不响应投射器}Pass{Name "FORWARD"Tags { "LightMode"="ForwardBase" }Blend One OneMinusSrcAlpha          // 修改混合方式One/SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _Mask;    uniform float4 _Mask_ST;uniform sampler2D _Noise;uniform half3 _Noise1Params;uniform half3 _Noise2Params;uniform half3 _Color1;uniform half3 _Color2;// 输入结构struct VertexInput{float4 vertex : POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输出结构struct VertexOutput{float4 pos : SV_POSITION;       // 顶点位置 总是必要float2 uv0 : TEXCOORD0;         // UV信息 采样Maskfloat2 uv1 : TEXCOORD1;         // UV信息 采样Noise1float2 uv2 : TEXCOORD2;         // UV信息 采样Noise2};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos( v.vertex);    // 顶点位置 OS>CSo.uv0 = TRANSFORM_TEX(v.uv, _Mask);o.uv1 = o.uv0 * _Noise1Params.x - float2(0.0, frac(_Time.x * _Noise1Params.y));o.uv2 = o.uv0 * _Noise2Params.x - float2(0.0, frac(_Time.x * _Noise2Params.y));return o;}// 输出结构>>>像素half4 frag(VertexOutput i) : COLOR{// 扰动遮罩half warpMask = tex2D(_Mask, i.uv0).b;// 噪声1half var_Noise1 = tex2D(_Noise, i.uv1).r;// 噪声2half var_Noise2 = tex2D(_Noise, i.uv2).g;// 噪声混合half noise = var_Noise1 * _Noise1Params.z + var_Noise2 * _Noise2Params.z;// 扰动UVfloat2 warpUV = i.uv0 - float2(0.0, noise) * warpMask;// 采样Maskhalf3 var_Mask = tex2D(_Mask, warpUV);// 计算FinalRGB 不透明度half3 finalRGB = _Color1 * var_Mask.r + _Color2 * var_Mask.g;half opacity = var_Mask.r + var_Mask.g;return half4(finalRGB, opacity);                // 返回值}ENDCG}}
}
水面效果_代码部分
Shader "AP01/L16/Water"
{Properties{_MainTex        ("颜色贴图", 2d) = "white"{}_WarpTex        ("扰动图", 2d) = "gray"{}_Speed          ("X:流速X Y:流速Y", vector) = (1.0, 1.0, 0.5, 1.0)_Warp1Params    ("X:大小 Y:流速X Z:流速Y W:强度", vector) = (1.0, 1.0, 0.5, 1.0)_Warp2Params    ("X:大小 Y:流速X Z:流速Y W:强度", vector) = (2.0, 0.5, 0.5, 1.0)}SubShader{Tags { "RenderType"="Opaque" }Pass{Name "FORWARD"Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _MainTex; uniform float4 _MainTex_ST;uniform sampler2D _WarpTex;uniform half2 _Speed;uniform half4 _Warp1Params;uniform half4 _Warp2Params;// 输入结构struct VertexInput{float4 vertex : POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输出结构struct VertexOutput{float4 pos : SV_POSITION;       // 顶点位置 总是必要float2 uv0 : TEXCOORD0;         // UV信息 采样Maskfloat2 uv1 : TEXCOORD1;         // UV信息 采样Noise1float2 uv2 : TEXCOORD2;         // UV信息 采样Noise2};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos( v.vertex);    // 顶点位置 OS>CSo.uv0 = v.uv - frac(_Time.x * _Speed);o.uv1 = v.uv * _Warp1Params.x - frac(_Time.x * _Warp1Params.yz);o.uv2 = v.uv * _Warp2Params.x - frac(_Time.x * _Warp2Params.yz);return o;}// 输出结构>>>像素float4 frag(VertexOutput i) : COLOR{half3 var_Warp1 = tex2D(_WarpTex, i.uv1).rgb;      // 扰动1half3 var_Warp2 = tex2D(_WarpTex, i.uv2).rgb;      // 扰动2// 扰动混合half2 warp = (var_Warp1.xy - 0.5) * _Warp1Params.w +(var_Warp2.xy - 0.5) * _Warp2Params.w;// 扰动UVfloat2 warpUV = i.uv0 + warp;// 采样MainTexhalf4 var_MainTex = tex2D(_MainTex, warpUV);return float4(var_MainTex.xyz, 1.0);}ENDCG}}FallBack "Diffuse"
}

这篇关于庄懂着色器_L1416_Fire/Water的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/453829

相关文章

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

学习使用RenderDoc查看着色器代码

0. 准备 首先,我想要一个相对简单的程序来学习。因此,我选择了 DX11官方范例(包含在DirectX11官方SDK中)里的【Tutorial 07: Texture Mapping and Constant 】 需要安装工程,编译出exe,然后将着色器文件(Tutorial07.fx)和贴图文件(seafloor.dds)放到exe的同级目录。随后应该可以打开exe: 1. 截一帧

LeetCode - 11. Container With Most Water

11. Container With Most Water  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一个N条垂直于x轴的直线,从中找两条直线和x轴组成一个桶状容器,使得这个容器的容量最大. analyse:

LeetCode - 42. Trapping Rain Water

42. Trapping Rain Water  Problem's Link  ---------------------------------------------------------------------------- Mean:  在坐标上给你一些竖直放置的条形积木,问你这个积木能够容纳多少液体. analyse: 首先找出最高的积木,然后从前往后一直

glsl着色器学习(九)屏幕像素空间和设置颜色

在上一篇文章中,使用的是裁剪空间进行绘制,这篇文章使用屏幕像素空间的坐标进行绘制。 上一篇的顶点着色器大概是这样子的 回归一下顶点着色的主要任务:  通常情况下,顶点着色器会进行一系列的矩阵变换操作,将输入的顶点坐标从模型空间依次经过世界空间,视图空间,最终转换到裁剪空间。 将顶点着色器改成下面这样: <script id="vertex-shader-2d" type="x-sh

glsl着色器学习(十)缩放

对二维图形进行缩放,需要用到顶点着色器,顶点着色器经过矩阵变换,会将模型空间最终转换成裁剪空间。下面就来操作矩阵 这里需要用到一个库glMatrix。 首先修改顶点着色器 <script id="vertex-shader-2d" type="x-shader/x-vertex">attribute vec4 a_position;uniform mat4 u_matrix;void m

glsl着色器学习(六点五)顶点和片元的处理顺序

在WebGL中,顶点和片元的处理顺序遵循着图形渲染管线的流程。 顶点处理阶段 顶点处理阶段是图形渲染管线的起点,在这一阶段,所有与顶点相关的操作都会被执行。 顶点着色器(Vertex Shader) 顶点着色器接收每个顶点的数据,例如顶点坐标,法线,纹理坐标等。将顶点数据上传到图形硬件的缓冲区。在顶点着色器中,对这些顶点数据进行变换和运算,例如将顶点从模型空间转换到世界空间、视图空间和

Container With Most Water (Java实现)

当看见这道题时想到的一个答案就是暴力破解,附上代码 <span style="font-size:18px;"><span style="font-size:18px;">package com.alibaba;import java.util.Scanner;public class Solution{public int maxArea(int[] height){int maxCapac

three.js 编辑器,动画,着色器, cesium 热力图,聚合点位,大量点线面, 图层,主题,文字

对于大多数的开发者来言,看了很多文档可能遇见不到什么有用的,就算有用从文档上看,把代码复制到自己的本地大多数也是不能用的,非常浪费时间和学习成本, 尤其是three.js , cesium.js 这种难度较高, 想要实现一个功能可能会查阅很多博客 ,进行很多错误尝试,费时费力。 所以,话不多说为了给各位造福利,我搭建了在线查看代码且可的调试系统,所有案例可直接访问,让你欣赏 什么叫做 - 优雅永

为什么AVL fire DVI 界面里面的response Editor project 中的Summary result 点不了???

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述   为什么AVL fire DVI 界面里面的response Editor project 中的Summary result 点不了??