庄懂着色器_L18_序列帧与极坐标

2023-12-04 14:39

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

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


序列帧_Sequence

小人是一个AB的模型,外面鬼火是AD模式,是一个双Pass的Shader

代码部分

Pass可以都是有一个名字的,这样一个Pass写完之后,其它的Shader想调用这个Pass,然后里面内容完全不想改,可以使用" UsePass (调用Pass名字)"

LightMode
Unity的手游一般都是ForwardBase前项渲染
使用SRP自定义渲染管线是可以自己声明一个LightMode,你的相机在渲染场景的时候,它会有一个模式,这个模式只会渲染这个模式下的Shader,相当于为什么你写的那个shader没有原先写的那个角色那些shader,为什么你完全都没有写关于阴影的事情,你只把Autolight和Lighting两个cginclude包含进来,它有就投影了呢?因为FallBack回退的shader里面它会有一个Pass,它的LightMode是shadowcast产生阴影,然后是它在渲染阴影的时候,它的相机的LightMode是shadowcast,然后它会在你的shader里面去找,我要找一个Pass,里面的LightMode是shadowcast,然后看看这个是LightMode是ForrwardBase,啊,不是的,这个是LightMode是ForwardAdd,啊也不是的!这个是shadowcast,那我就用这个shadowcast去渲染阴影,其实这个 渲染阴影是一个渲染距离

火焰序列图_Wrap Modex选择 Repeat
Shader "AP01/L18/Sequence"
{Properties{_MainTex    ("RGB:颜色 A:透贴", 2d) = "gray"{}_Opacity    ("透明度", range(0, 1)) = 0.5_Sequence   ("序列帧", 2d) = "gray"{}_RowCount   ("行数", int) = 1_ColCount   ("列数", int) = 1_Speed      ("速度", range(0.0, 15.0)) = 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 _MainTex;uniform half _Opacity;// 输入结构struct VertexInput{float4 vertex : POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输出结构struct VertexOutput{float4 pos : SV_POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos( v.vertex);    // 顶点位置 OS>CSo.uv = v.uv;                                // UV信息 支持TilingOffsetreturn o;}// 输出结构>>>像素half4 frag(VertexOutput i) : COLOR{half4 var_MainTex = tex2D(_MainTex, i.uv);      // 采样贴图 RGB颜色 A透贴half3 finalRGB = var_MainTex.rgb;half opacity = var_MainTex.a * _Opacity;return half4(finalRGB * opacity, opacity);                // 返回值}ENDCG}Pass{Name "FORWARD"Tags { "LightMode"="ForwardBase" }Blend One One          // 混合方式CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _Sequence; uniform float4 _Sequence_ST;uniform half _Opacity;uniform half _RowCount;uniform half _ColCount;uniform half _Speed;// 输入结构struct VertexInput{float4 vertex : POSITION;       // 顶点位置 总是必要float3 normal : NORMAL;float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输出结构struct VertexOutput{float4 pos : SV_POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){VertexOutput o = (VertexOutput)0;v.vertex.xyz += v.normal * 0.03;            // 顶点位置法向挤出o.pos = UnityObjectToClipPos(v.vertex);     // 顶点位置 OS>CSo.uv = TRANSFORM_TEX(v.uv, _Sequence);      // 前置UV ST操作float id = floor(_Time.z * _Speed);         // 计算序列idfloat idV = floor(id / _ColCount);          // 计算V轴idfloat idU = id - idV * _ColCount;           // 计算U轴idfloat stepU = 1.0 / _ColCount;              // 计算U轴步幅float stepV = 1.0 / _RowCount;              // 计算V轴步幅float2 initUV = o.uv * float2(stepU, stepV) + float2(0.0, stepV * (_ColCount - 1.0));   // 计算初始UVo.uv = initUV + float2(idU * stepU, idV * stepV);   // 计算序列帧UVreturn o;}// 输出结构>>>像素half4 frag(VertexOutput i) : COLOR{half4 var_Sequence = tex2D(_Sequence, i.uv);      // 采样贴图 RGB颜色 A透贴half3 finalRGB = var_Sequence.rgb;half opacity = var_Sequence.a * _Opacity;return half4(finalRGB * opacity, opacity);        // 返回值}ENDCG}}
}极坐标_PolarCoord_代码部分
极坐标的换算只能在像素Shader里面去做
Shader "AP01/L18/PolarCoord"
{Properties{_MainTex    ("RGB:颜色 A:透贴", 2d)   = "gray"{}[HDR]_Color      ("混合颜色", color)         = (1.0, 1.0, 1.0, 1.0)_Opacity    ("透明度", range(0, 1))     = 0.5  }SubShader{Tags{"Queue"="Transparent"               // 调整渲染顺序"RenderType"="Transparent"          // 对应改为Cutout"ForceNoShadowCasting"="True"       // 关闭阴影投射"IgnoreProjector"="True"            // 不响应投射器}Pass{Name "FORWARD"Tags { "LightMode"="ForwardBase" }Blend One OneMinusSrcAlpha                       // 修改混合方式CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform sampler2D _MainTex;uniform half _Opacity;uniform half3 _Color;// 输入结构struct VertexInput{float4 vertex : POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用float4 color : COLOR;};// 输出结构struct VertexOutput{float4 pos : SV_POSITION;       // 顶点位置 总是必要float2 uv : TEXCOORD0;          // UV信息 采样贴图用float4 color : COLOR;};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v){VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos( v.vertex);    // 顶点位置 OS>CSo.uv = v.uv;                                // UV信息 支持TilingOffseto.color = v.color;return o;}// 直角坐标转极坐标方法float2 RectToPolar(float2 uv, float2 centerUV){uv = uv - centerUV;float theta = atan2(uv.y, uv.x);    // atan()值域[-π/2, π/2]一般不用; atan2()值域[-π, π]float r = length(uv);return float2(theta, r);}// 输出结构>>>像素half4 frag(VertexOutput i) : COLOR{// 直角坐标转极坐标float2 thetaR = RectToPolar(i.uv, float2(0.5, 0.5));// 极坐标转纹理采样UVfloat2 polarUV = float2(thetaR.x / 3.141593 * 0.5 + 0.5,    // θ映射到[0, 1]thetaR.y + frac(_Time.x * 3.0)      // r随时间流动);// 采样MainTexhalf4 var_MainTex = tex2D(_MainTex, polarUV);// 处理最终输出half3 finalRGB = (1 - var_MainTex.rgb) * _Color;half opacity = (1 - var_MainTex.r) * _Opacity * i.color.r;// 返回值return half4(finalRGB * opacity, opacity);}ENDCG}}
}

这篇关于庄懂着色器_L18_序列帧与极坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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. 截一帧

使用Python调用ImageMagick将序列帧生成GIF

目标 使用Python来调用ImageMagick,将文件夹内所有的图片作为序列帧合并为一个GIF。 我事先使用Blender渲染了一组图片(操作很简单, 可见《尝试在blender中渲染一个最简单的动画》) 1. 使用ImageMagick将序列帧生成GIF 最基础的命令是比较简单的: convert 第1帧图片 第2帧图片 ...第n帧图片 结果GIF Animation

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) 顶点着色器接收每个顶点的数据,例如顶点坐标,法线,纹理坐标等。将顶点数据上传到图形硬件的缓冲区。在顶点着色器中,对这些顶点数据进行变换和运算,例如将顶点从模型空间转换到世界空间、视图空间和

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

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

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是从原点到数据点的距离。 极坐标图用于说明以下类型的数据: 方向数据:当数据具有方向性时,例如风的方向和速度,极坐标图可以清

OpenCV几何图像变换(11)极坐标转换函数warpPolar()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 函数将图像重映射到极坐标或半对数极坐标空间。 极坐标重映射参考 用以下转换来转换源图像: d s t ( ρ , ϕ ) = s r c ( x , y ) dst(\rho , \phi ) = src(x,y

Vulkan教程 - 08 着色器及编译SPIR-V

着色器模块 不像是之前的API,Vulkan着色器代码一定要用字节码格式,而不是人类可读的语法如GLSL和HLSL。这个字节码就是SPIR-V,设计用于Vulkan和OpenCL。这是一个可以用于编写图形和计算着色器的格式,但是我们主要关注的是Vulkan的图形管线。使用字节码格式的优点之一是GPU厂商写的编译器将着色器代码转化为原生代码会非常简单。过去的经验表明,人类易读的语法如GLSL,某些