【Godot4自学手册】第四十三用着色器(shader)给纹理描边

news2024/9/21 18:38:53

这一节我们学一下用着色器(shader)描边效果。来看看最终效果:
请添加图片描述

一、进行shader初始设置

首先我们进入NPC场景,选择Sprite2D节点,在检查器中中岛CanvasItem属性,并在Material->Material后方选择下拉按钮选择新建ShaderMaterial
请添加图片描述

然后选中新建的材质球,在Shader属性选择新建着色器,在弹出框内进行如下设置:
请添加图片描述

然后创建保存。

二、编写代码

这样我们就可以在着色器内进行编码了。我们先来学习一下Shader的基本知识。在 Godot 游戏引擎中,片段着色器(Fragment Shader)是一种运行在图形处理单元(GPU)上的程序,用于计算并确定屏幕上每个像素的颜色。片段着色器是图形渲染过程中的关键部分,它们使得开发者能够创造出丰富和动态的视觉效果。

片段着色器的基本概念:
  1. 像素颜色计算
    • 片段着色器的主要任务是计算每个像素的颜色。这可以通过直接指定颜色值或使用纹理映射来实现。
  2. 并行处理
    • 片段着色器在 GPU 上并行运行,这意味着它们同时对所有像素进行处理。这种并行处理方式使得着色器非常适合执行复杂的数学运算,以实现高效的图形渲染。
  3. 输入和输出
    • 片段着色器接收一系列输入,如纹理坐标(UV)、顶点颜色、时间变量等,并输出最终的颜色值。
片段着色器的结构:

一个基本的片段着色器通常包含以下部分:

  • 声明着色器类型
    shader_type canvas_item; // 对于 2D 渲染
    // 或者
    shader_type spatial;     // 对于 3D 渲染
    
  • 片段函数
    void fragment() {
        // 片段着色器的代码
        COLOR = vec4(1.0, 0.0, 0.0, 1.0); // 设置像素颜色为红色
    }
    
  • 使用 UV 坐标
    void fragment() {
        COLOR = vec4(UV.x, UV.y, 0.0, 1.0); // 使用 UV 坐标设置颜色
    }
    
  • 使用纹理
    void fragment() {
        COLOR = texture(TEXTURE, UV); // 从纹理中获取颜色
    }
    
片段着色器的应用:
  • 颜色效果:可以创建颜色渐变、色调映射、颜色校正等效果。
  • 纹理处理:可以实现纹理混合、模糊、锐化等效果。
  • 光照和阴影:模拟不同的光照模型和阴影效果。
  • 后处理效果:如模糊、边缘检测、颜色过滤等。
在 Godot 中使用片段着色器:
  1. 创建材质:在 Godot 中,首先需要创建一个 ShaderMaterial
  2. 编写着色器代码:在材质编辑器中,可以编写和修改着色器代码。
  3. 应用到对象:将材质应用到场景中的对象上,着色器效果就会应用到该对象。
    片段着色器是 Godot 提供的一个强大工具,可以极大地扩展游戏的视觉表现力。开发者可以通过不断学习和实践,创造出各种独特的视觉效果。

三、编写代码

请添加图片描述

我们先录入如下代码,然后我在解释一下原理和重点知识:

shader_type canvas_item;
uniform float outline_width=1.0;
uniform vec4 outline_color:source_color =vec4(0,0,0,1);

void fragment() {
	vec2 uv =UV;
	vec2 uv_up = uv+vec2(0,TEXTURE_PIXEL_SIZE.y)*outline_width;
	vec2 uv_down = uv + vec2(0,-TEXTURE_PIXEL_SIZE.y)*outline_width;
	vec2 uv_left = uv + vec2(TEXTURE_PIXEL_SIZE.x,0)*outline_width;
	vec2 uv_right = uv + vec2(-TEXTURE_PIXEL_SIZE.x,0)*outline_width;
	vec4 color_up = texture(TEXTURE,uv_up);
	vec4 color_down = texture(TEXTURE,uv_up);
	vec4 color_left = texture(TEXTURE,uv_left);
	vec4 color_right = texture(TEXTURE,uv_right);
	vec4 outline = color_down+color_up+color_left+color_right;
	outline.rgb = outline_color.rgb;
	vec4 original_color = texture(TEXTURE,UV);	
	COLOR = mix(outline,original_color,original_color.a);
	}

看一下前后对比效果:
未添加描边效果如下:
请添加图片描述

添加描边效果如下:
请添加图片描述

而且描边的宽度和颜色均可以通过参数来控制。
请添加图片描述

原理

我们想要实现描边效果,只需每个点位上下左右向外扩展一个点位,这样在与原图像叠加到一起,让后把扩展的点变成描边颜色即可。

重点知识学习
  1. shader_type::是用来定义一个着色器(Shader)的类型的关键字,Godot 支持多种类型的着色器,每种类型的着色器都有其特定的用途和上下文环境。
  2. canvas_item:着色器类型用于处理 2D 渲染,它通常用于控制 CanvasItem 类型的节点,比如 Sprite、TextureRect 或自定义的 2D 节点。当你在 Godot 中使用这种类型的着色器时,你可以自定义这些节点的渲染行为,比如颜色混合、纹理处理、光照效果等。
  3. uniform:该关键字用于声明全局变量,这些变量在着色器的所有执行实例中保持一致。换句话说,uniform 变量是那些你在渲染过程中想要从 CPU 传递到 GPU 的值,并且这些值对于同一绘制调用的所有片段都是相同的。
  4. TEXTURE_PIXEL_SIZE:是一个内置变量,用于在着色器中获取纹理的像素大小。这个变量通常用于片段着色器中,以确定纹理中每个像素的物理大小。在 Godot 的片段着色器中,TEXTURE_PIXEL_SIZE 的值通常表示为二维向量,其中包含了纹理的宽度和高度上的像素大小。例如,如果纹理的分辨率是 320x240,那么 TEXTURE_PIXEL_SIZE 应该是 (1/320, 1/240),这意味着在每个维度上,一个单元代表一个像素。
  5. texture() 函数用于在着色器中从指定的纹理中采样颜色值。
  6. mix() 函数用于在两个值之间进行线性插值,常用于混合颜色或向量。一句话描述其用途是:函数有三个参数,第一个参数表示起始颜色,第二参数表示结束颜色;第三个参数(通常是一个介于 0.0 和 1.0 之间的系数)在两个值之间进行平滑过渡,如果为0,表示第一种颜色;1表示第二种颜色;0到1之间表示过度颜色。

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

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

相关文章

如何从智联招聘网站快速抓取职位详情?两大技巧揭秘

摘要: 本文将揭秘如何利用Python爬虫技术,高效且合法地从智联招聘网站抓取职位详情信息。通过实战示例,展现两大核心技巧,助你在大数据时代抢占先机,为你的市场分析、人才研究提供强大支持。 一、引言:数据…

LLM4Decompile反编译大模型的试用实践过程梳理

LLM4Decompile 是一款开源大型语言模型,专注于反编译工作,我们将其试用过程进行介绍: 论文地址:https://arxiv.org/abs/2403.05286 代码地址:https://github.com/albertan017/LLM4Decompile 首先,找到代码位置: 1.搭建基础环境1.python3,我用的是3.12.4 …

LinuxC++(7):认识主函数参数

主函数有哪些参数? main函数有三个参数,argc、argv和envp,它的标准写法如下: int main(int argc,char *argv[],char *envp[]){return 0; } 认识argc argc表示有几个参数,主函数自身也算一个,所以如果没…

解锁概念测量类比完成任务如何改变词语表征

欢迎来到雲闪世界。本文旨在讨论 word2vec 和 GloVe 算法的发展,因为这与这些算法的第二个应用目的有关:分析文本语料库中包含的概念。首先,根据 word2vec 算法的历史背景对其进行讨论。然后,描述类比完成任务,该任务突…

【C语言篇】操作符详解(上篇)

文章目录 操作符详解(上篇)前言sizeof强制类型转换算术操作符赋值操作符逻辑操作符逻辑取反运算符逻辑与运算符逻辑或运算符 关系操作符自增自减操作符和-逗号表达式 操作符详解(上篇) 前言 操作符又被叫做运算符,是不…

深度学习中降维的几种方法

笔者在搞网络的时候碰到个问题,就是将特征维度从1024降维到268,那么可以通过哪些深度学习方法来实现呢? 文章目录 1. 卷积层降维2. 全连接层降维3. 使用注意力机制4. 使用自编码器 1. 卷积层降维 可以使用1x1卷积层(也叫pointwis…

AI新闻:近期AI领域最繁忙的一周!

本周AI领域发生了许多令人瞩目的大事,可以说是繁忙的一周了。下面我将为大家一一盘点这些精彩瞬间。 OpenAI的新功能和发展 高级语音功能:OpenAI开始推出全新的高级语音功能,之前展示时声音如同斯嘉丽约翰逊。这项功能已经开放给部分用户使用…

鸿蒙双向绑定组件:TextArea、TextInput、Search、Checkbox,文本输入组件,图案解锁组件PatternLock

对象暂不支持双向绑定, 效果: 代码: Entry Component struct MvvmCase {StateisSelect: boolean falseStatesearchText: String ""StateinputText: string ""StateareaText: string ""build() {Grid() {G…

「漏洞复现」百易云资产管理运营系统 comfileup.php 文件上传漏洞(XVE-2024-18154)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

武汉流星汇聚:亚马逊北美站引领中国跨境潮,全球商机触手可及

在当今全球跨境电商的浪潮中,亚马逊北美站以其独特的区域优势和强大的市场影响力,为中国跨境卖家提供了前所未有的发展机遇。根据最新统计数据显示,60%的中国跨境卖家将亚马逊视为他们海外拓展的首选平台,这一选择背后&#xff0c…

ASPCMS 漏洞

一、后台修改配置文件拿shell 登录后台后如下点击 点击保存并抓包 将slideTextStatus的值修改为1%25><%25Eval(Request(chr(65)))25><%25 放包&#xff08;连接密码是a&#xff09; 影响文件为 /config/AspCms_Config.asp 访问文件,使用工具连接

window10上配置typora图床

window10上配置typora图床 window10picgotypora 教程 picgo设定存储区域 picgo下载地址 安利一款截图贴图软件

Simulink代码生成:数学运算

文章目录 1 引言2 模块使用实例2.1 Math Function模块2.2 Trigonometric Function模块2.3 Abs模块 3 代码生成4 总结 1 引言 Simulink中提供了大量的数学运算模块&#xff0c;对应C语言中<math.h>中用于数学计算的函数&#xff0c;例如幂函数、开平方、三角反三角函数、…

FFmpeg源码:av_gcd函数分析

一、引言 公约数&#xff0c;是一个能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公约数。 公约数与公倍数相反&#xff0c;就…

数据科学 - 数据预处理 (数据清洗,结构化数据)

1. 前言 数据清洗与结构化数据在数据分析和机器学习项目中扮演着至关重要的角色。随着大数据时代的到来&#xff0c;数据的质量、准确性和可用性成为决定项目成功与否的关键因素。 数据清洗提高数据质量&#xff0c;保证数据集的一致性&#xff1b;促进数据分析与挖掘&#xf…

剪映课+短视频综合课程:抖音底层算法

课程内容&#xff1a; 01-直播回放精选&#xff1a;2024抖音4_5月新知识.mp4 02-直播回放&#xff1a;核心算法讲解.mp4 03-直播回放&#xff1a;推流人群顺序和赛马依据.mp4 04-直播回放&#xff1a;从0-1kw推流细节.mp4 05-直播回放&#xff1a;抖加投放①.mp4 06-直播回…

调试模式下如何调试看门狗?

大家在调试GD32 MCU系统的时候&#xff0c;若开了看门狗外设&#xff0c;是否会碰到进入调试模式看门狗就会咬狗造成无法调试的问题&#xff1f; 碰到这种情况&#xff0c;一般是将看门狗关闭&#xff0c;然后再进行调试&#xff0c;但这个时候看门狗外设就无法工作了&#xf…

SSH远程服务器MobaXterm PuTTY XShell Tabby

云服务器运维SSH远程工具软件&#xff0c; PuTTY 相比有很大的优势&#xff0c;有兼顾 SSH 和 FTP一体的工具。 SSH的软件&#xff0c;而且有支持 Mac 、Windows 、Linux等跨平台的。 1、XShell 官网地址&#xff1a;https://www.xshell.com/en/xshell/ 免费地址&#xff1a;h…

Kimi居然能做PPT了,是职场人的得力助手还是噱头满满?

你们有没有发现&#xff0c;Kimi最近搞了个大新闻——它竟然能做PPT了&#xff01;是的&#xff0c;你没听错&#xff0c;就是那个让我们又爱又恨的演示PPT。这不&#xff0c;我一看到公告&#xff0c;就激动得像打了鸡血&#xff0c;连夜把市面上其他的几款主流AI PPT产品测了…

数据工程解决的十大数据生命周期问题

欢迎来到雲闪世界。解决关键痛点的明确策略 使用Kandinsky 的AI 生成图像 在本文中&#xff0c;我想解决数据工程师在整个数据生命周期中使用管道时面临的一些最大挑战。了解如何管理数据生命周期是我们不断变化的领域的关键。作为一名数据工程师&#xff0c;我经常处理大量不同…