Posts

Unity3D中摄像机的FOV和Camera.ScreenToWorldPoint方法的关系

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在Unity3D编程中经常会碰到以下的问题: 比如一开始的FOV为60度,后来设置为22度,可以通过怎样的公式,使得使用22度FOV对应生成的3D位置点,通过这个公式,可以转换到其位置点和使用60度生成的一样呢 当从一个FOV为60度的视角切换到22度的视角时,使用Camera.ScreenToWorldPoint函数生成的3D位置点会发生变化,因为FOV直接影响视锥体的宽度和高度。要解决这个问题,需要通过调整视锥体的缩放因子,来抵消FOV变化带来的位置偏移。 问题分析 当FOV变化时,屏幕坐标对应的世界坐标会随之缩放。假设有一个屏幕坐标screenPos,在FOV为60度时通过Camera.ScreenToWorldPoint生成一个3D位置点P60。当FOV变为22度时,假设生成的3D位置点为P22。我们需要找到一个转换公式,使得P22转换回P60。 FOV与世界坐标的关系 视锥体的高度(在深度为z处)与FOV通过以下公式相关: $$ Heightz=2×z×tan⁡(FOV2)\text{Height}_z = 2 \times z \times \tan\left(\frac{FOV}{2}\right)Heightz=2×z×tan(2FOV) $$ 其中: Height_z :在深度为z处的视锥体高度。 FOV:垂直视野角度。 z:深度(从摄像机到目标点的距离)。 视锥体的宽度和高度成比例地变化,具体公式为: $$ Widthz=Heightz×Aspect Ratio\text{Width}_z = \text{Height}_z \times \text{Aspect Ratio}Widthz=Heightz×Aspect Ratio $$ 对于两个不同的FOV(如60度和22度),可以计算出它们对应的视锥体高度比值。为了让FOV为22度时生成的世界坐标与FOV为60度时生成的一致,需要应用这个比值进行缩放。 缩放因子的推导 在FOV为60度时的视锥体高度: $$ \mathrm{Heigth}_{60}=2\times \mathrm{z}\times \tan \left( \frac{60^o}{2} \right) $$ 在FOV为22度时的视锥体高度: $$ \mathrm{Heigth}_{22}=2\times \mathrm{z}\times \tan \left( \frac{22^o}{2} \right) $$ 缩放因子: 需要将FOV为22度时的世界坐标缩放到FOV为60度的视锥体高度,因此缩放因子是这两个视锥体高度的比值: $$ ScaleFactor=\frac{Height_{60}}{Height_{22}}=\frac{\tan \left( 30^{o} \right)}{\tan \left( 11^{o} \right)} $$ 可以计算出这个缩放因子: $$ \mathrm{ScaleFactor}=\frac{0.5774}{0.1944}\approx 2.97 $$ 公式应用 在FOV为22度时生成的3D世界坐标P22可以通过如下公式转换为FOV为60度时的3D世界坐标P60:

Unity3D中根据深度值重建像素点对应的世界坐标

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 1 深度图介绍 就是将深度信息(Z坐标值)保存在了一张贴图上的R通道上,因为R通道的值范围是[0, 1],所以我们可以用ndc空间下的Z坐标值做下处理就能变成[0, 1]范围了( (Zndc+1)*0.5 2 C#接口取得深度图纹理的方法 Shader.GetGlobalTexture("_CameraDepthTexture") 3 在NDC空间下深度值的计算公式 4 从片元着色器中根据深度图反推出片元世界坐标且输出的shader Shader "zznewclear13/DepthToPositionShader" { Properties { [Toggle(REQUIRE_POSITION_VS)] _Require_Position_VS("Require Position VS", float) = 0 } HLSLINCLUDE #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/core.hlsl" #pragma multi_compile _ REQUIRE_POSITION_VS sampler2D _CameraDepthTexture; struct Attributes { float4 positionOS : POSITION; float2 texcoord : TEXCOORD0; }; struct Varyings { float4 positionCS : SV_POSITION; float2 texcoord : TEXCOORD0; }; Varyings Vert(Attributes input) { Varyings output = (Varyings)0; // 根据顶点在其模型坐标系下的值,计算得到在裁剪空间中的齐次坐标 VertexPositionInputs vertexPositionInputs = GetVertexPositionInputs(input.

HLSL语言的编译指令#include_with_pragmas的具体用法

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com #include_with_pragmas 在 HLSL 语言中的作用 #include_with_pragmas 是 Unity Shader 编译器提供的一个扩展指令,用于 在包含 HLSL 头文件 (.hlsl) 时,同时解析其中的 #pragma 指令。这与普通的 #include 不同,普通 #include 只会包含代码,但不会处理 #pragma 相关的指令。 基本语法 #include_with_pragmas "MyShaderHeader.hlsl" 与普通的 #include 相比: #include 不会解析 #pragma multi_compile 等编译指令。 #include_with_pragmas 会解析 #pragma 指令,确保 .hlsl 文件中的 #pragma 也会影响 Shader 变体编译。 使用示例 示例 1:在 .hlsl 文件中定义 multi_compile MyShaderHeader.hlsl #pragma multi_compile _ FEATURE_ENABLED float4 CustomFunction() { return float4(1, 0, 0, 1); } MyShader.shader Shader "Example/Shader" { SubShader { Pass { HLSLPROGRAM #include_with_pragmas "MyShaderHeader.

不使用MeshRenderer去绘制Mesh【翻译】

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 原文地址 在 Unity 中不使用 MeshRenderer 渲染网格 1. 概述 目的:使用 DrawMesh 系列方法在 Unity 中渲染大量网格,而无需创建和管理 GameObject。 特点: 网格会受到光照影响,可以投射和接收阴影。 可以针对所有相机或特定相机渲染。 支持 GPU 实例化和 Compute Shader。 2. 常用方法 DrawMesh:最简单的渲染方法,使用指定材质渲染网格。 DrawMeshInstanced:通过 GPU 实例化渲染大量相同网格,支持小规模变化(如颜色)。 DrawMeshInstancedIndirect:通过 ComputeBuffer 传递实例数量和位置等数据,适用于大规模实例化。 DrawMeshInstancedProcedural:与 DrawMeshInstancedIndirect 类似,但实例数量可以直接从 C# 传递。 DrawProcedural:在 GPU 上执行绘制调用,无需顶点或索引缓冲区,适用于 Compute Shader。 DrawProceduralIndirect:与 DrawProcedural 类似,但实例数量等数据从 ComputeBuffer 传递。 3. 代码示例 DrawMesh: public class ExampleDrawMesh : MonoBehaviour { public Mesh mesh; public Material material; void Update() { Graphics.DrawMesh(mesh, Vector3.zero, Quaternion.identity, material, 0); } } DrawMeshNow: public class ExampleDrawMeshNow : MonoBehaviour { public Mesh mesh; public Material material; public void OnPostRender() { material.

Unity3D中枚举类型UnityEngine.Experimental.Rendering.GraphicsFormat详解

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在Unity中,UnityEngine.Experimental.Rendering.GraphicsFormat 枚举类型定义了多种图形格式,用于描述纹理、渲染目标等的像素格式。每种格式都有不同的通道数、每个像素的字节数以及适用场景。以下是 GraphicsFormat 中每个值的具体含义、通道数、每个像素的字节数等详细信息: 1. 常用图形格式 枚举值 含义 通道数 每个像素字节数 描述 None 无格式 - - 未定义格式。 R8_UNorm 单通道 8 位无符号归一化 1 1 适用于单通道数据,如灰度图。 R8_SNorm 单通道 8 位有符号归一化 1 1 适用于单通道有符号数据。 R8_UInt 单通道 8 位无符号整数 1 1 适用于单通道无符号整数数据。 R8_SInt 单通道 8 位有符号整数 1 1 适用于单通道有符号整数数据。 R16_UNorm 单通道 16 位无符号归一化 1 2 适用于单通道高精度数据。 R16_SNorm 单通道 16 位有符号归一化 1 2 适用于单通道高精度有符号数据。 R16_UInt 单通道 16 位无符号整数 1 2 适用于单通道高精度无符号整数数据。 R16_SInt 单通道 16 位有符号整数 1 2 适用于单通道高精度有符号整数数据。 R16_SFloat 单通道 16 位有符号浮点数 1 2 适用于单通道高精度浮点数数据。 R32_UInt 单通道 32 位无符号整数 1 4 适用于单通道超高精度无符号整数数据。 R32_SInt 单通道 32 位有符号整数 1 4 适用于单通道超高精度有符号整数数据。 R32_SFloat 单通道 32 位有符号浮点数 1 4 适用于单通道超高精度浮点数数据。 R8G8_UNorm 双通道 8 位无符号归一化 2 2 适用于双通道数据,如法线贴图的 XY 通道。 R8G8_SNorm 双通道 8 位有符号归一化 2 2 适用于双通道有符号数据。 R8G8_UInt 双通道 8 位无符号整数 2 2 适用于双通道无符号整数数据。 R8G8_SInt 双通道 8 位有符号整数 2 2 适用于双通道有符号整数数据。 R16G16_UNorm 双通道 16 位无符号归一化 2 4 适用于双通道高精度数据。 R16G16_SNorm 双通道 16 位有符号归一化 2 4 适用于双通道高精度有符号数据。 R16G16_UInt 双通道 16 位无符号整数 2 4 适用于双通道高精度无符号整数数据。 R16G16_SInt 双通道 16 位有符号整数 2 4 适用于双通道高精度有符号整数数据。 R16G16_SFloat 双通道 16 位有符号浮点数 2 4 适用于双通道高精度浮点数数据。 R32G32_UInt 双通道 32 位无符号整数 2 8 适用于双通道超高精度无符号整数数据。 R32G32_SInt 双通道 32 位有符号整数 2 8 适用于双通道超高精度有符号整数数据。 R32G32_SFloat 双通道 32 位有符号浮点数 2 8 适用于双通道超高精度浮点数数据。 R8G8B8A8_UNorm 四通道 8 位无符号归一化 4 4 适用于 RGBA 颜色数据。 R8G8B8A8_SNorm 四通道 8 位有符号归一化 4 4 适用于 RGBA 有符号数据。 R8G8B8A8_UInt 四通道 8 位无符号整数 4 4 适用于 RGBA 无符号整数数据。 R8G8B8A8_SInt 四通道 8 位有符号整数 4 4 适用于 RGBA 有符号整数数据。 R16G16B16A16_UNorm 四通道 16 位无符号归一化 4 8 适用于 RGBA 高精度数据。 R16G16B16A16_SNorm 四通道 16 位有符号归一化 4 8 适用于 RGBA 高精度有符号数据。 R16G16B16A16_UInt 四通道 16 位无符号整数 4 8 适用于 RGBA 高精度无符号整数数据。 R16G16B16A16_SInt 四通道 16 位有符号整数 4 8 适用于 RGBA 高精度有符号整数数据。 R16G16B16A16_SFloat 四通道 16 位有符号浮点数 4 8 适用于 RGBA 高精度浮点数数据。 R32G32B32A32_UInt 四通道 32 位无符号整数 4 16 适用于 RGBA 超高精度无符号整数数据。 R32G32B32A32_SInt 四通道 32 位有符号整数 4 16 适用于 RGBA 超高精度有符号整数数据。 R32G32B32A32_SFloat 四通道 32 位有符号浮点数 4 16 适用于 RGBA 超高精度浮点数数据。 B8G8R8A8_UNorm 四通道 BGRA 8 位无符号归一化 4 4 适用于 BGRA 颜色数据。 B8G8R8A8_SNorm 四通道 BGRA 8 位有符号归一化 4 4 适用于 BGRA 有符号数据。 B8G8R8A8_UInt 四通道 BGRA 8 位无符号整数 4 4 适用于 BGRA 无符号整数数据。 B8G8R8A8_SInt 四通道 BGRA 8 位有符号整数 4 4 适用于 BGRA 有符号整数数据。 B8G8R8X8_UNorm 四通道 BGRA 8 位无符号归一化(无 Alpha) 4 4 适用于 BGRA 颜色数据(无 Alpha 通道)。 B8G8R8X8_SNorm 四通道 BGRA 8 位有符号归一化(无 Alpha) 4 4 适用于 BGRA 有符号数据(无 Alpha 通道)。 B8G8R8X8_UInt 四通道 BGRA 8 位无符号整数(无 Alpha) 4 4 适用于 BGRA 无符号整数数据(无 Alpha 通道)。 B8G8R8X8_SInt 四通道 BGRA 8 位有符号整数(无 Alpha) 4 4 适用于 BGRA 有符号整数数据(无 Alpha 通道)。 R10G10B10A2_UNorm 四通道 RGBA,RGB 各 10 位,A 2 位 4 4 适用于高精度 RGB 和低精度 Alpha 数据。 R10G10B10A2_UInt 四通道 RGBA,RGB 各 10 位,A 2 位 4 4 适用于高精度 RGB 和低精度 Alpha 无符号整数数据。 R11G11B10_UFloat 三通道 RGB,R 和 G 各 11 位,B 10 位 3 4 适用于 HDR 数据,节省内存。 D16_UNorm 16 位深度 1 2 适用于深度缓冲区。 D24_UNorm_S8_UInt 24 位深度 + 8 位模板 2 4 适用于深度和模板缓冲区。 D32_SFloat 32 位深度 1 4 适用于高精度深度缓冲区。 D32_SFloat_S8_UInt 32 位深度 + 8 位模板 2 5 适用于高精度深度和模板缓冲区。 2.

Unity3D中枚举类型UnityEngine.TextureFormat详解

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在Unity中,UnityEngine.TextureFormat 枚举类型定义了多种纹理格式,每种格式都有不同的通道数、每个像素的字节数以及适用场景。以下是 UnityEngine.TextureFormat 中每个值的具体含义、通道数、每个像素的字节数等详细信息: 1. 常用纹理格式 枚举值 含义 通道数 每个像素字节数 描述 Alpha8 单通道 Alpha 1 1 仅存储 Alpha 通道,适用于遮罩或透明度贴图。 ARGB4444 4 通道 ARGB,每通道 4 位 4 2 每个通道 4 位,适用于低精度颜色贴图。 RGB24 3 通道 RGB,每通道 8 位 3 3 存储 RGB 颜色,无 Alpha 通道,适用于普通颜色贴图。 RGBA32 4 通道 RGBA,每通道 8 位 4 4 存储 RGBA 颜色,适用于带透明度的颜色贴图。 RGB565 3 通道 RGB,R 和 B 各 5 位,G 6 位 3 2 压缩格式,适用于低精度颜色贴图。 R16 单通道 16 位 1 2 存储单通道 16 位数据,适用于高度图或深度图。 DXT1 DXT1 压缩格式 3 0.

高效地访问纹理数据

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 原文地址 Working with pixel data in Unity Pixel data describes the color of individual pixels in a texture. Unity provides methods that enable you to read from or write to pixel data with C# scripts. 像素数据描述纹理中各个像素的颜色。Unity 提供了使用 C# 脚本读取或写入像素数据的方法。 You might use these methods to duplicate or update a texture (for example, adding a detail to a player’s profile picture), or use the texture’s data in a particular way, like reading a texture that represents a world map to determine where to place an object.

Unity的2D Pixel Perfect包的工作原理

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com Unity的 2D Pixel Perfect 包(现为 Pixel Perfect Camera 组件)是专为像素风格游戏设计的工具,其核心目标是确保2D精灵(Sprites)在屏幕上以整数像素呈现,避免模糊或锯齿,保持复古像素艺术的清晰锐利。以下是它的工作原理和关键实现方式: 1. 核心原理:像素对齐(Pixel Snapping) 问题根源: 当游戏相机或精灵的坐标包含小数部分(如位置为 (10.3, 5.7)),Unity的渲染器会进行子像素插值,导致精灵边缘模糊(抗锯齿效果)。 解决方案: Pixel Perfect Camera 会动态调整相机位置和渲染分辨率,确保所有2D精灵的顶点坐标对齐到屏幕像素网格(即整数坐标),消除小数偏移。 2. 关键工作流程 (1) 设置目标分辨率 Assets Pixels Per Unit (PPU): 在精灵导入设置中定义 Pixels Per Unit(如 16 表示1 Unity单位 = 16像素)。 示例:若角色精灵为 32x32 像素,PPU=16,则精灵在Unity中的大小为 2x2 单位。 Reference Resolution: 在 Pixel Perfect Camera 组件中设置目标分辨率(如 256x144),表示游戏设计的基准像素分辨率。 (2) 动态调整相机 整数倍缩放(Scale to Fit): 相机会根据当前屏幕分辨率,选择整数倍缩放(1x, 2x, 3x…)以适配窗口,避免非整数拉伸。 例如: 目标分辨率 256x144,屏幕为 768x432 → 缩放3倍(256*3=768)。 若屏幕为 900x500,可能缩放3倍并留黑边(Letterboxing)。 像素对齐(Pixel Snapping):

Http详解及如何在Unity上使用

** 请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com。** 1 HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 HTTP是一个基于TCP/IP通信协议。来传递数据(HTML 文件, 图片文件, 查询结果等)。它指定了客户端可能发送给服务器什么样的消息,以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。 HTTP协议永远都是客户端发起请求,服务器回送响应。见下图: 2 HTTP工作流程 一次HTTP操作称为一个事务,其工作过程可分为四步: 客户机与服务器建立TCP连接。只要单击某个超级链接/输入网址/提交表单等。 建立连接后,客户机发送http请求给服务器. 服务器接到请求后,响应信息。 客户端接收服务器所返回的信息,然后客户机与服务器断开TCP连接。 3 HTTP发展及各版本 版本 产生时间 内容 发展现状 HTTP/1.1 1997年 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 2015年前使用最广泛 HTTP/2 2015年 多路复用、服务器推送、头信息压缩、二进制协议等 逐渐覆盖市场 3.1 HTTP1.1 版本 HTTP 1.1 新增了delete options 等几种请求数据的方式,客户端和服务端三次握手后,建立tcp链接,一个tcp链接可以传送多个请求和响应,这样就减少了握手和建立tcp和关闭tcp链接的消耗,传输更快 HTTP 1.1 支持持久链接 请求头有一个connection 参数,参数值是close/keep-alive 意思是本次请求处理完后,服务器是关闭该tcp链接还是继续使用该链接 3.2 HTTP 2.0 版本 HTTP2.0使用了多路复用的技术,做到同一个链接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。 4 HTTP主要特点 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 无状态:无状态是指协议对于事务处理没有记忆能力。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。 支持B/S及C/S模式 5 HTTP协议安全机制 HTTPS (Secure Hypertext Transfer Protocol):安全超文本传输协议。HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。HTTPS提供的安全通信,应用了对称加密,非对称加密,数据签名等技术。 HTTP缺点:不够安全——明文传输,不做加密,易被中间人攻击(中间人截获甚至篡改信息) HTTPS主要作用: (1)对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全; (2)对网站服务器进行真实身份认证。 6 HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法。到目前为止,有以下的方法