UntiyShader(七)Debug

目录

前言

一、利用假彩色图像

二、利用Visual Studio

三、帧调试器


前言

Debug(调试),是程序员检查问题的一种方法,对于一个Shader调试更是一种噩梦,这也是Shader难写的原因之一——如果效果不对,我们可能要花费很多时间去查找问题所在。

造成这种状况的原因便是Shader中可以选择的调试方法非常有限。

一、利用假彩色图像

假彩色图像(false-color image)指得是用假彩色技术生成一种图像,与假彩色图像对应的是照片这种真彩色图像(true-color image)

主要思想:

我们可以把需要调试的变量映射到[0,1]之间,把它们作为颜色输出到屏幕上,然后通过屏幕上显示的像素颜色来判断这个值是否是正确的。这种方法得到的调试信息很模糊,能够得到的信息很有限,但在很长一段时间内它的确是唯一的可选方法。

需要注意的是,由于颜色的分量范围为[0,1],因此我们需要小心处理需要调试的变量的范围。

如果我们已经知道了它的值域范围,可以先把它映射到[0,1]之间再进行输出。如果不知道,我们只能不停地实验。(一个提示是,颜色分量中任何大于1地数值会被设置为1,而任何小于0的数值会被设置为0,因此我们可以个尝试不同的映射,直到发现颜色发生了变化)

示例

Shader "Unity Shaders Book/FalseColor"
{SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct v2f{float4 pos : SV_POSITION;fixed4 color : COLOR0;};
;v2f vert (appdata_full   v){v2f o;o.pos=UnityObjectToClipPos(v.vertex);//可视化法线方向o.color=fixed4(v.normal*0.5+fixed3(0.5,0.5,0.5),1.0);//可视化切线方向o.color=fixed4(v.tangent.xyz*0.5+fixed3(0.5,0.5,0.5),1.0);//可视化副切线方向fixed3 binormal=cross(v.normal,v.tangent.xyz)*v.tangent.w;o.color=fixed4(binormal*0.5+fixed3(0.5,0.5,0.5),1.0); //可视化第一组纹理坐标o.color=fixed4(v.texcoord.xy,0.0,1.0); //可视化第二组纹理坐标o.color=fixed4(v.texcoord1.xy,0.0,1.0); //可视化第一组纹理坐标的小数部分o.color=frac(v.texcoord);if(any(saturate(v.texcoord)-v.texcoord)){o.color.b=0.5;}o.color.a=1.0;//可视化第二组纹理坐标的小数部分o.color=frac(v.texcoord1);if(any(saturate(v.texcoord1)-v.texcoord1)){o.color.b=0.5;}o.color.a=1.0;//可视化顶点颜色//o.color=v.color;return o;}fixed4 frag (v2f i) : SV_Target{return i.color;}ENDCG}}
}

效果:

在上面的代码中,我们使用了Unity内置的一个结构体——appdata_full。我们可以在UnityCG.cginc中找到它的定义:

struct appdata_full{

        float4 vertex:POSITION;

        float4 tangent:TANGENT;

        float3 normal"NORMAL;

        float4 texcoord:TEXCOORD0;

        float4 texcoord1:TEXCOORD1;

        float4 texcoord2:TEXCOORD2;

        float4 texcoord3:TEXCOORD3;

#if defined(SHADER_API_XBOX360)

        half texcoord4:TEXCOORD4;

        half texcoord5:TEXCOORD5;

#endif

        fixed4 color:COLOR;

};

可以看出,appdata_full几乎包含了所有的模型数据。 我们可以通过注释上面的代码块来查看不同的调试效果。

二、利用Visual Studio

在Visual Studio2012版本中也提供了对Unity Shader的调试功能——Graphics Debugger

三、帧调试器

我的Unity版本为2021.3.12,帧调式器在Window->Analysis->Frame Debugger中。

帧调试器可以用于查看渲染该帧时进行的各种渲染事件。

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

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

相关文章

ubuntu22.04安装anacoda遇到的坑

这几天把用了3年的windows10换成了ubuntu22.04 各种环境都得配置,本文记录下遇到的坑。 1、anacoda在ubuntu上也可以用官方也提供了安装包,但是没有图形界面,需要以命令行的方式安装和运行配置 1.1 安装:官网下载后,…

极速文件搜索工具Everything结合内网穿透实现远程搜索本地文件

文章目录 前言1.软件安装完成后,打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库,我们需要两个软件的支持,分别是cpolar(用于搭建内网穿透数据隧道…

ShuffleNet V2:高效CNN架构设计实用指南

摘要 目前,神经网络架构设计主要以计算复杂度的间接指标(即 FLOPs)为指导。然而,直接指标(如速度)还取决于其他因素,如内存访问成本和平台特性。因此,这项工作建议在目标平台上评估…

1 - 数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型

数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型 数据库服务概述构建mysql服务安装mysql软件包连接mysql服务器 修改密码 密码管理修改密码策略(需要登陆)破解数据库管理员root密码(数据库服务处于运行状态但是root忘记了密…

win/linux 环境查看动态库包含的函数

我们打包了动态库,还要查看是否包含一些函数,需要导出这些函数 在win 环境下可以使用 .def 格式的文件进行操作 ######################################################### 跳过这一步,回到主题,在两个系统平台如何查看动态库包…

时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测

时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测 目录 时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序…

机器学习---降维与度量学习

1. 度量学习 现有的大部分算法对图像进行特征提取后化为向量的表达形式,其本质是把每一幅用于训练的图像 通过某种映射到欧氏空间的一个点,并利用欧氏空间的良好性质在其中进行学习器的训练。但定义 图像特征之间的欧氏距离未必能很好反映出样本之间的…

Resnet BatchNormalization 迁移学习

时间:2015 网络中的亮点: 超深的网络结构(突破1000层)提出residual模块使用Batch Normalization加速训练(丢弃dropout) 层数越深效果越好? 是什么样的原因导致更深的网络导致的训练效果更差呢…

自行车服务PEDALWAYS 网站bootstrap5模板

一、需求分析 自行车服务网站的作用是为骑行爱好者和自行车用户提供便捷的信息、工具和服务,以满足他们的需求。以下是一些常见的自行车服务网站的功能: 自行车租赁:提供自行车租赁服务,用户可以在线预订自行车并选择租赁期限&am…

x-cmd pkg | hyperfine - 命令行基准测试工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 hyperfine 是一个用于命令行基准测试的开源工具,可以对多次命令运行的时间进行分析,帮助开发人员评估和比较不同命令或脚本的性能。它是用 Rust 语言开发的,可以在 Windows、macOS …

Avalonia学习(十五)-OxyPlot

今天开始继续Avalonia练习。展示一些样例,尤其是第三方库的使用。 本节:OxyPlot 1.引入OxyPlot.Avalonia 2.项目引入 在Main方法里增加OxyPlotModule.EnsureLoaded()方法调用。 public static void Main(string[] args) {OxyPlotModule.EnsureLoade…

最新解决msvcr100.dll丢失的方法,多种解决方法详细解析

msvcr100.dll丢失会导致某些程序或游戏无法正常运行,msvcr100.dll是Microsoft Visual C 2010的运行时组件,它包含了许多C标准库的函数实现。这些函数在程序运行时被调用,用于处理各种任务,如字符串操作、数学计算、文件操作等。因…

rancher 手册

官方 https://www.rancher.com/https://github.com/rancher/rancherhttps://docs.rke2.io/ rancher kubernetesl yaml deploy rancher serverHelm Deploy Online Rancher DemoHelm & Kubernetes Offline Deploy Rancher v2.7.5 Demohelm upgrade rancher server from v2…

算法(3)——二分查找

一、什么是二分查找 二分查找也称折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。 二、二分查找的原理 1、查找的目标数据元素必须是有序的。没有顺序的数据,二分法就失去意义。 2、数据元素通常是数值…

中文版大模型 Token 成本计算器

分享一个轻量的小工具,10MB 左右,能够帮助你直观的了解大模型 Token 的计算方法。 希望能够帮助到想了解或者正在规划模型 API 使用成本的你。 写在前面 之所以折腾这个小工具,是因为有朋友和我提问,大模型 API 的 Token 到底是…

基于ssm的房屋租赁管理系统

功能介绍 房源信息模块: 房源信息展示、房源信息更新、房源信息增加、房源信息删除 账户管理模块: 账户登录、账户绑定、账户管理 租金结算模块: 每月租金信息、租金交付功能、月租金收入总额统计 房屋租赁合同管理模块: 房屋租赁…

【深度解析C++之运算符重载】

系列文章目录 🌈座右铭🌈:人的一生这么长、你凭什么用短短的几年去衡量自己的一生! 💕个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️:【深度解析C之this…

OpenGauss 之索引查找和匹配

一. 前言 本文主要通过走读OpenGuass的代码,来了解查询的时候OpenGuass是如何查找表的索引信息以及根据谓词条件过滤掉无用的索引信息的。 二. 索引路径匹配流程 1. 首先OpenGuass在build_simple_rel的时候,首先将一个表以及与他相关的索引都加到rel-&g…

DSL查询语法和RestClient查询文档

目录 DSL查询语法 DLS Query的分类 DSL Query基本语法 全文检索查询 精准查询 地理查询 复合查询 Function Score Query 复合查询 Boolean Query 搜索结果处理 排序 分页 分页 深度分页问题 深度分也解决方案 高亮 RestClient查询文档 快速入门 全文检索查…

MK米客方德品牌 SD NAND在对讲机领域的引领作用

SD NAND在对讲机上的应用 SD NAND在对讲机上广泛应用,为其提供了高效可靠的存储解决方案。 这种存储技术不仅能容纳大量语音和数据文件,而且具有高速读取的特点,保障了实时通信的质量。SD NAND还注重安全性,通过数据加密和访问控…