Unity自定义shader打包SpriteAtlas图集问题

Unity打包图集还是有一些坑的,至于图集SpriteAtlas是什么请参考我之前写的文章:【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程_spriteatlas 使用-CSDN博客

问题:

今天碰到的问题是,shader绘制的时候,因为打包图集后,MainTexture是图集的图片,所以shader渲染就错误了。

非图集是这样显示的,正常的一个地块。

打包完图集后,发现这个MainTexture是整个图集的图片

导致显示就错乱了,如下图。

正常的显示是这样的。

问题所在:

原因就是打包图集后传入给shader的uv变了,本来只有图片的时候,uv就是0-1的本地uv值,现在素材换成一张更大的图了,导致uv采样就出现了问题。

解决方法:

将图片本身的uv信息传给shader,做一个计算转换即可。

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor.Sprites;
using UnityEngine;public class StaticGroundObject : GroundObject
{public GameObject notCellObjectShow;private SpriteRenderer spriteRenderer;private const string _UVRangeName = "_UVRange";protected override void OnStart(){base.OnStart();SetSortingOrder();spriteRenderer = GetComponentInChildren<SpriteRenderer>();UpdateSpriteRenderer();}protected override void OnEnable(){base.OnEnable();}//修改也要void UpdateSpriteRenderer(){if (spriteRenderer != null){Sprite sprite = spriteRenderer.sprite;Vector2 texelSize = sprite.texture.texelSize;Rect rect = sprite.textureRect;Vector4 uvRemap = new(rect.x * texelSize.x,rect.y * texelSize.y,rect.width * texelSize.x,rect.height * texelSize.y);// 将UV值传递给材质Material material = spriteRenderer.material;if (material != null){// 确保shader中有对应的属性if (material.HasProperty(_UVRangeName)){material.SetVector(_UVRangeName, uvRemap);Debug.Log("UV值已成功写入shader");}else{Debug.LogError("shader缺少必要的属性,请确保shader中定义了_UV1和_UV2属性");}}else{Debug.LogError("renderer的材质为空");}}}public override void SetNotCellObjectShow(GameObject notCellObjectShow){base.SetNotCellObjectShow(notCellObjectShow);this.notCellObjectShow = notCellObjectShow;}protected override void CheckRandomPrefabs(bool isShow){if (notCellObjectShow != null){//上面没有东西,而且没有混合到其他格子上if (ParentGround == null && isShow){notCellObjectShow.SetActive(true);}else{notCellObjectShow.SetActive(false);}}}private void SetSortingOrder(){var ground = GetComponentsInChildren<SpriteRenderer>(true)[0];var groundName = ground.name;var lastIndex = groundName.LastIndexOf('_');var secondLastIndex = groundName.LastIndexOf('_', lastIndex - 1);int.TryParse(groundName.Substring(secondLastIndex + 1, lastIndex - secondLastIndex - 1), out int result);ground.sortingOrder -= result;}protected override void SetBlendMaskValue(Texture2D newBlendMask, int newRotateMaskValue, Texture2D mainBlendTex,Texture2D blendMaskChamfer, Dictionary<int, float> _offsetList){// base.SetBlendMaskValue(newBlendMask, newRotateMaskValue, mainBlendTex, blendMaskChamfer, offsetList);//获得要渲染的对象if (mainBlends.Count == 0){mainBlends = GetComponentsInChildren<Renderer>().ToList();}if (mainBlends.Count == 0){Debug.LogError("mainBlends.Count==0");return;}//设置遮罩贴图this.blendMask = newBlendMask;this.rotateMaskValue = newRotateMaskValue;this.mainBlendTex = mainBlendTex;this.blendMaskChamfer = blendMaskChamfer;//设置偏移值this.blendOffsetTargetList = _offsetList;UpdateMaterial();UpdateSpriteRenderer();}protected override void SetBlendOffsetList(Dictionary<int, float> _offsetList){// base.SetBlendOffsetList(_offsetList);blendOffsetTargetList = _offsetList;UpdateMaterial();UpdateSpriteRenderer();}
}public class MaterialCacheTool
{public static Dictionary<string, Material> materialCache = new Dictionary<string, Material>();public static Material CheckMaterial(string materialKey, Renderer defaultRenderer, Action<Material> onInit){Material checkMaterial = null;if (materialCache.ContainsKey(materialKey)){checkMaterial = materialCache[materialKey];}else{var material = new Material(defaultRenderer.sharedMaterial);material.name = materialKey;onInit?.Invoke(material);materialCache.Add(materialKey, material);checkMaterial = material;}return checkMaterial;}
}
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Shader/GroundObjectV3_Code"
{Properties{[NoScaleOffset]_MaskMap("MaskMap", 2D) = "white" {}[NoScaleOffset]_MainTex("MainTex", 2D) = "white" {}[NoScaleOffset]_Chamfer("Chamfer", 2D) = "black" {}_RotateMask("RotateMask",Range(0, 360)) = 0_OffsetUp("OffsetUp", Range(0, 1)) = 0_OffsetDown("OffsetDown", Range(0, 1)) = 0_OffsetLeft("OffsetLeft", Range(0, 1)) = 0_OffsetRight("OffsetRight", Range(0, 1)) = 0_OffsetUpLeft("OffsetUpLeft", Range(0, 1)) = 0_OffsetUpRight("OffsetUpRight", Range(0, 1)) = 0_OffsetDownLeft("OffsetDownLeft", Range(0, 1)) = 0_OffsetDownRight("OffsetDownRight", Range(0, 1)) = 0//相反_IsInversion("IsInversion", Float) = 0[NoScaleOffset]_BlendMaskMap("BlendMaskMap", 2D) = "black" {}[NoScaleOffset]_BlendMainTex("BlendMainTex", 2D) = "white" {}[NoScaleOffset]_BlendChamfer("_BlendChamfer", 2D) = "black" {}_BlendOffsetUp("BlendOffsetUp", Range(0, 1)) = 0_BlendOffsetDown("BlendOffsetDown", Range(0, 1)) = 0_BlendOffsetLeft("BlendOffsetLeft", Range(0, 1)) = 0_BlendOffsetRight("BlendOffsetRight", Range(0, 1)) = 0_BlendOffsetUpLeft("BlendOffsetUpLeft", Range(0, 1)) = 0_BlendOffsetUpRight("BlendOffsetUpRight", Range(0, 1)) = 0_BlendOffsetDownLeft("BlendOffsetDownLeft", Range(0, 1)) = 0_BlendOffsetDownRight("BlendOffsetDownRight", Range(0, 1)) = 0[HideInInspector]_QueueOffset("_QueueOffset", Float) = 0[HideInInspector]_QueueControl("_QueueControl", Float) = -1[HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}[HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}[HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}_OffsetFactor("OffsetFactor", Float) = 0_OffsetUnits("OffsetUnits", Float) = 0[ToggleUI] _ReceiveShadows("Receive Shadows", Float) = 1.0[ToggleUI] _CastShadows("Cast Shadows", Float) = 1.0//阴影模糊_ShadowBlur("ShadowBlur", Float) = 0.0_Cull("__cull", Float) = 2.0// 新增距离缩放因子属性_DistanceScaleFactor("Distance Scale Factor", Range(0.1, 100.0)) = 60.0//补充UV_UVRange("UV Range", Vector) = (0, 0, 1, 1)}SubShader{Tags{"RenderPipeline"="UniversalPipeline""RenderType"="Opaque""UniversalMaterialType" = "Lit""Queue"="AlphaTest""DisableBatching"="LODFading""ShaderGraphShader"="true""ShaderGraphTargetId"="UniversalLitSubTarget""EnableGPUInstancing" = "true"}LOD 100Pass{// Render StateCull BackZTest LEqualZWrite OnBlend One ZeroAlphaToMask Onoffset [_OffsetFactor] , [_OffsetUnits]HLSLPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fog// #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"            // #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"#include "EgoLight.hlsl"#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREENstruct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;//光照计算float4 positionOS : POSITION;float4 normalOS : NORMAL;};struct v2f{float2 uv : TEXCOORD0;// UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;float3 worldPos : TEXCOORD1;//光照计算float3 viewDirWS : TEXCOORD2;float3 normalWS : TEXCOORD3;// 新增距离变量float distanceToCamera : TEXCOORD4;float prevLod : TEXCOORD5; // 新增变量存储上一次的LODfloat2 uv2:TEXCOORD6;};sampler2D _MaskMap;float4 _MaskMap_ST;sampler2D _MainTex;float4 _MainTex_ST;sampler2D _Chamfer;float4 _Chamfer_ST;float _RotateMask;float _OffsetUp;float _OffsetDown;float _OffsetLeft;float _OffsetRight;float _OffsetUpLeft;float _OffsetUpRight;float _OffsetDownLeft;float _OffsetDownRight;float _IsInversion;//混合剔除的参数sampler2D _BlendMaskMap;float4  _BlendMaskMap_ST;sampler2D _BlendMainTex;float4 _BlendMainTex_ST;sampler2D _BlendChamfer;float4 _BlendChamfer_ST;float _BlendOffsetUp;float _BlendOffsetDown;float _BlendOffsetLeft;float _BlendOffsetRight;float _BlendOffsetUpLeft;float _BlendOffsetUpRight;float _BlendOffsetDownLeft;float _BlendOffsetDownRight;float4 _GlobalShadowColor;// 新增距离缩放因子属性变量,放在HLSL代码的合适位置,这里在函数外部声明float _DistanceScaleFactor;float4 _UVRange;v2f vert (appdata v){v2f o;o.uv = TRANSFORM_TEX(v.uv, _MaskMap);float2 spriteRectPos = _UVRange.xy;float2 spriteRectSize = _UVRange.zw;float2 localUV = (v.uv - spriteRectPos) / spriteRectSize;o.uv2 = localUV;o.vertex = TransformObjectToHClip(v.vertex);//UnityObjectToClipPos   //o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);                        o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;// 计算物体到摄像机的距离o.distanceToCamera = distance(mul(unity_ObjectToWorld, v.vertex).xyz, _WorldSpaceCameraPos.xyz);o.prevLod = 0; // 初始化//光照计算VertexPositionInputs positionInputs = GetVertexPositionInputs(v.positionOS.xyz);VertexNormalInputs normalInputs = GetVertexNormalInputs(v.normalOS.xyz);o.viewDirWS = GetCameraPositionWS() - positionInputs.positionWS;o.normalWS = normalInputs.normalWS;return o;}float2 GetMaskUV(float2 uv){float2 maskUV=uv;maskUV -= 0.5;// 旋转 45 度(π/4 弧度)float angle = radians(_RotateMask);float cosAngle = cos(angle);float sinAngle = sin(angle);float2x2 rotationMatrix = float2x2(cosAngle, -sinAngle, sinAngle, cosAngle);maskUV = mul(rotationMatrix, maskUV);// 平移回原来的坐标maskUV += 0.5;return maskUV;}//全部的Offsetfloat GetColorMask(sampler2D colorMask, sampler2D colorChamfer,float2 uv, float _OffsetUp,  float _OffsetDown,  float _OffsetLeft,  float _OffsetRight,  float _OffsetUpLeft,  float _OffsetUpRight,  float _OffsetDownLeft,  float _OffsetDownRight,float _lod){float offsetMax = 0.5;float2 offsets[8] = {float2(0, -_OffsetUp * offsetMax),float2(0, _OffsetDown * offsetMax),float2(_OffsetLeft * offsetMax, 0),float2(-_OffsetRight * offsetMax, 0),float2(_OffsetUpLeft * offsetMax, -_OffsetUpLeft * offsetMax),float2(-_OffsetUpRight * offsetMax, -_OffsetUpRight * offsetMax),float2(_OffsetDownLeft * offsetMax, _OffsetDownLeft * offsetMax),float2(-_OffsetDownRight * offsetMax, _OffsetDownRight * offsetMax)};float alpha = 0;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv),0,_lod)).r;// 循环采样偏移纹理//for (int i = 0; i < 8; i++) {//    alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[i]),0,_lod)).r;//}alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[0]),0,_lod)).r;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[1]),0,_lod)).r;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[2]),0,_lod)).r;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[3]),0,_lod)).r;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[4]),0,_lod)).r;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[5]),0,_lod)).r;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[6]),0,_lod)).r;alpha += tex2Dlod(colorMask, float4(GetMaskUV(uv + offsets[7]),0,_lod)).r;// 采样倒角纹理alpha += tex2Dlod(colorChamfer, float4(uv + float2( _OffsetLeft * offsetMax, -_OffsetUp * offsetMax),0,_lod)).r;alpha += tex2Dlod(colorChamfer, float4(uv + float2(-_OffsetRight * offsetMax, -_OffsetUp * offsetMax),0,_lod)).r;alpha += tex2Dlod(colorChamfer, float4(uv + float2( _OffsetLeft * offsetMax,  _OffsetDown * offsetMax),0,_lod)).r;alpha += tex2Dlod(colorChamfer, float4(uv + float2(-_OffsetRight * offsetMax, _OffsetDown * offsetMax),0,_lod)).r;// 透明度限制在0-1之间alpha = clamp(alpha, 0, 1);                         return alpha;}float4 frag (v2f i) : SV_Target{float2 maskUV = i.uv2;    float lod = i.distanceToCamera / _DistanceScaleFactor;lod = clamp(lod, 0, 5); float mainAlpha = GetColorMask( _MaskMap, _Chamfer, maskUV, _OffsetUp,  _OffsetDown,  _OffsetLeft,  _OffsetRight,  _OffsetUpLeft,  _OffsetUpRight,  _OffsetDownLeft,  _OffsetDownRight,lod);// 计算主纹理的UV偏移float2 mainTexUV = TRANSFORM_TEX(i.uv, _MainTex).xy;float4 mainColor = tex2Dlod(_MainTex, float4(mainTexUV, 0, lod));//tex2D(_MainTex, TRANSFORM_TEX(i.uv, _MainTex));mainAlpha *= mainColor.a;float f = lerp(1.01,0.99,_IsInversion);//1.01;//maskUV缩放变大一点点maskUV -= 0.5;maskUV *=lerp(1.01,0.99,_IsInversion);         // 1.005;maskUV += 0.5;//各个边移动多一丢丢// _BlendOffsetUp += float2(0,f);// _BlendOffsetDown  += float2(0,-f);// _BlendOffsetLeft  +=  float2(-f,0);// _BlendOffsetRight  += float2(f,0);// _BlendOffsetUpLeft  += float2(-f,f);// _BlendOffsetUpRight += float2(f,f);// _BlendOffsetDownLeft += float2(-f,-f);// _BlendOffsetDownRight  += float2(f,-f);float blendAlpha = GetColorMask( _BlendMaskMap, _BlendChamfer, maskUV, _BlendOffsetUp,  _BlendOffsetDown,  _BlendOffsetLeft,  _BlendOffsetRight,  _BlendOffsetUpLeft,  _BlendOffsetUpRight,  _BlendOffsetDownLeft,  _BlendOffsetDownRight,lod);float4 blendColor = tex2Dlod(_BlendMainTex, float4(TRANSFORM_TEX(i.uv, _BlendMainTex),0,lod));blendAlpha*=blendColor.a;float alpha = mainAlpha - blendAlpha;alpha = lerp(alpha,1-alpha,_IsInversion);          // 根据距离调整纹理采样的LOD// mainColor = tex2Dlod(_MainTex, float4(TRANSFORM_TEX(i.uv, _MainTex).xy, 0, lod));// blendColor = tex2Dlod(_BlendMainTex, float4(TRANSFORM_TEX(i.uv, _BlendMainTex).xy, 0, lod));float _Cutoff = 0.8;float3 color = CheckColor(i.worldPos,i.normalWS,_GlobalShadowColor,mainColor.rgb);clip(alpha - _Cutoff);return float4(color.rgb, alpha);}ENDHLSL}}
}

参考这个链接会解释的更加详细点:

Local UVs for Sprites in Sprite Sheet/Atlas | Cyanilux

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

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

相关文章

如何用 OceanBase 的 LOAD DATA 旁路导入进行大表迁移

前言 在日常工作中&#xff0c;我们时常会遇到需要将某个大数据量的单表进行迁移的情况。在MySQL中&#xff0c;针对这样的大表&#xff0c;我们通常会选择先将原表导出为csv格式&#xff0c;然后利用LOAD DATA语法来导入csv文件&#xff0c;这种方法相较于mysqldump在效率上有…

VR 互动实训的显著优势​

&#xff08;一&#xff09;沉浸式学习&#xff0c;提升培训效果​ 在 VR 互动实训中&#xff0c;员工不再是被动的知识接受者&#xff0c;而是主动的参与者。以销售培训为例&#xff0c;员工戴上 VR 设备&#xff0c;就能置身于逼真的销售场景中&#xff0c;与虚拟客户进行面对…

OpenCV 第6课 图像处理之几何变换(重映射)

1. 概述 简单来说,重映射就是把一副图像内的像素点按照规则映射到到另外一幅图像内的对应位置上去,形成一张新的图像。 因为原图像与目标图像的像素坐标不是一一对应的。一般情况下,我们通过重映射来表达每个像素的位置(x,y),像这样: g(x,y)=f(h(x,y)) 在这里g()是目标图…

Java虚拟机 - 程序计数器和虚拟机栈

运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前&#xff0c;我们要了解&#xff0c;对于计算机来说&#xff0c;内存是非常重要的资源&#xff0c;因为内…

MySQL数据库——支持远程IP访问的设置方法总结

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…

CSS- 4.6 radiu、shadow、animation动画

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…

排序算法之基础排序:冒泡,选择,插入排序详解

排序算法之基础排序&#xff1a;冒泡、选择、插入排序详解 前言一、冒泡排序&#xff08;Bubble Sort&#xff09;1.1 算法原理1.2 代码实现&#xff08;Python&#xff09;1.3 性能分析 二、选择排序&#xff08;Selection Sort&#xff09;2.1 算法原理2.2 代码实现&#xff…

第十节第一部分:常见的API:Math、System、Runtime

Math类介绍及常用方法&#xff08;了解知道即可&#xff09; System类介绍及常用方法&#xff08;了解知道即可&#xff09; Runtime类介绍及常用方法&#xff08;了解知道即可&#xff09; 代码&#xff1a; 代码一&#xff1a;Math类 package com.itheima.d14_math;public …

智能体间协作的“巴别塔困境“如何破解?解读Agent通信4大协议:MCP/ACP/A2A/ANP

AI 智能体的兴起触发了AI应用协作的新领域。这些智能体不再局限于被动的聊天机器人或独立的系统&#xff0c;它们现在被设计用于推理、计划和协作ーー跨任务、跨域甚至跨组织。但随着这一愿景成为现实&#xff0c;一个挑战很快浮出水面&#xff1a; 智能体如何以一种安全、可伸…

项目进度延误,如何按时交付?

项目进度延误可以通过加强计划管理、优化资源分配、强化团队沟通、设置关键里程碑和风险管理机制等方式来实现按时交付。加强计划管理、优化资源分配、强化团队沟通、设置关键里程碑、风险管理机制。其中&#xff0c;加强计划管理尤为关键&#xff0c;因为明确而详细的计划能提…

详解ip地址、子网掩码、网关、广播地址

1. IP 地址 定义&#xff1a;IP 地址是网络设备在网络中的唯一标识&#xff0c;用于标识设备的网络位置&#xff0c;类似于现实中的门牌号。它分为 IPv4&#xff08;如 192.168.1.5&#xff09;和 IPv6&#xff08;如 240e:305:3685:8100:a00:27ff:fefb:56b8&#xff09;。 示…

为 Windows 和 Ubuntu 中设定代理服务器的详细方法

有时下载大模型总是下载不出来&#xff0c;要配置代理才行 一、Windows代理设置 ① 系统全局代理设置 打开【设置】→【网络和Internet】→【代理】。 在【手动设置代理】下&#xff0c;打开开关&#xff0c;输入&#xff1a; 地址&#xff1a;10.10.10.215 端口&#xff1a;…

鸿蒙OSUniApp 实现的表单验证与提交功能#三方框架 #Uniapp

UniApp 实现的表单验证与提交功能 前言 在移动端应用开发中&#xff0c;表单是用户与应用交互的重要媒介。一个好的表单不仅布局合理、使用方便&#xff0c;还应该具备完善的验证与提交功能&#xff0c;以确保用户输入的数据准确无误。本文将分享如何在 UniApp 中实现表单验证…

前端的面试笔记——HTMLJavaScript篇(二)前端页面性能检测

前端页面性能检测和判定是优化用户体验的核心环节&#xff0c;需要结合实验室数据&#xff08;Lab Data&#xff09;、现场数据&#xff08;Field Data&#xff09;和行业标准综合评估。以下是主流方法、工具及判定标准的详细解析&#xff1a; 一、性能检测的核心维度与指标 …

再来1章linux系列-19 防火墙 iptables 双网卡主机的内核 firewall-cmd firewalld的高级规则

学习目标&#xff1a; 实验实验需求实验配置内容和分析 &#xff08;每一个设备的每一步操作&#xff09;实验结果验证其他 学习内容&#xff1a; 实验实验需求实验配置内容和分析 &#xff08;每一个设备的每一步操作&#xff09;实验结果验证其他 1.实验 2.实验需求 图…

LLM-Based Agent综述及其框架学习(五)

文章目录 摘要Abstract1. 引言2. 文本输出3. 工具的使用3.1 理解工具3.2 学会使用工具3.3 制作自给自足的工具3.4 工具可以扩展LLM-Based Agent的行动空间3.5 总结 4. 具身动作5. 学习智能体框架5.1 CrewAI学习进度5.2 LangGraph学习进度5.3 MCP学习进度 参考总结 摘要 本文围绕…

游戏引擎学习第298天:改进排序键 - 第1部分

关于向玩家展示多个房间层所需的两种 Z 值 我们在前一天基本完成了为渲染系统引入分层 Z 值的工作&#xff0c;但还没有完全完成所有细节。我们开始引入图形渲染中的分层概念&#xff0c;即在 Z 轴方向上拥有多个独立图层&#xff0c;每个图层内部再使用一个单独的 Z 值来实现…

一些C++入门基础

关键字 图引自 C 关键词 - cppreference.com 命名空间 命名空间解决了C没办法解决的各类命名冲突问题 C的标准命名空间&#xff1a;std 命名空间中可以定义变量、函数、类型&#xff1a; namespace CS {//变量char cs408[] "DS,OS,JW,JZ";int cs 408;//函数vo…

学习笔记:黑马程序员JavaWeb开发教程(2025.4.6)

12.4 登录校验-JWT令牌-介绍 JWT&#xff08;JSON Web Token&#xff09; 简洁是指JWT是一个简单字符串&#xff0c;自包含指的是JWT令牌&#xff0c;看似是一个随机字符串&#xff0c;但是可以根据需要&#xff0c;自定义存储内容 Header是JSON数据格式&#xff0c;原始JSO…

香港科技大学物理学理学(科学计算与先进材料物理与技术)硕士招生宣讲会——深圳大学

香港科技大学物理学理学&#xff08;科学计算与先进材料物理与技术&#xff09;硕士招生宣讲会——深圳大学专场 &#x1f559;时间&#xff1a;2025年5月23日&#xff08;星期五&#xff09;14:30 &#x1f3eb;地点&#xff1a;深圳大学沧海校区致原楼1101 &#x1f9d1…