UnityShader(十四)纹理

目录

前言:

单张纹理实现效果:

效果:


前言:

纹理最初的目的是用一张图片来控制模型的外观。使用纹理映射技术我们可以把一张图“贴”在模型表面,逐纹素(文素的名字是为了和像素进行区分)控制模型颜色。

在建模时候,通常会在建模软件中利用纹理展开技术把纹理映射坐标存储到每个顶点上,通常这些坐标用一个二维变量(u,v)表示,其中u为横坐标,v为纵坐标,纹理映射坐标也叫做。

单张纹理实现效果:

采用BlinnPhong光照模型效果:

Shader "MyShader/Texture"
{
    Properties
    {
        _MainTex("主贴图",2D)="white"{}
        _MainColor("主颜色",color)=(1,1,1,1)
        _SpecularColor("高光颜色",color)=(1,1,1,1)
        _Gloss("高光范围",float)=1.0
    }
    SubShader
    {
        Pass
        {
            Tags{"LigthMode"="ForwardBase"}

            CGPROGRAM
            #pragma vertex vert 
            #pragma fragment frag 
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _MainColor;
            fixed4 _SpecularColor;
            float _Gloss;

            struct vertexInput
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;
                float4 texcood:TEXCOORD0;
            };

            struct vertexOutput
            {
                float4 pos:SV_POSITION;
                float3 worldNormal:TEXCOORD0;
                float3 worldPos:TEXCOORD1;
                float2 uv:TEXCOORD2;
            };

            vertexOutput vert(vertexInput v)
            {
                vertexOutput o = (vertexOutput)o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
                o.uv = TRANSFORM_TEX(v.vertex,_MainTex);
                return o;
            }

            float4 frag(vertexOutput i):SV_TARGET
            {
                half3 worldNormal = normalize(i.worldNormal);
                half3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                half3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
                //half3 reflectDir = normalize(reflect(-worldLightDir,worldNormal));
                half3 halfDir = normalize(viewDir+worldLightDir);
                fixed3 albedo = tex2D(_MainTex,i.uv).rgb*_MainColor.rgb;

                fixed3 diffuse = albedo*_LightColor0.rgb*saturate(dot(worldNormal,worldLightDir));
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
                fixed3 specular = _LightColor0.rgb*_SpecularColor.rgb*pow(saturate(dot(worldNormal,halfDir)),_Gloss);
                fixed3 color = diffuse+ambient+specular;
                return float4(color,1.0);
            }
            ENDCG
        }
    }
}

效果:

在我们声明的变量中有一个_MainTex_ST,这一个变量不是随意定义的,其中S和T分别代表缩放和偏移。在编辑面板中我们可以看到主贴图旁边有一个四位参数变量,如下:

主帖图参数名_ST

指代的就是这个四维变量,其中xy代表缩放,zw代表偏移,在代码中

o.uv = TRANSFORM_TEX(v.texcoord,_MainTex) 

实现的就是通过这个四维变量对贴图进行缩放和偏移的功能,当然TRANSFORM_TEX()是Unity封装的方法,其原理就是对贴图的uv坐标先进行xy的缩放,在进行zw的偏移,我们也可以写成:

o.uv = v.vexcoord.xy*_MainTex_ST.xy+_MainTex_ST.ze;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源软件:引领技术创新、商业模式与安全的融合

序 在信息技术日新月异的今天,开源软件以其独特的魅力和影响力,正逐渐成为软件产业的新常态。开源软件的低成本、高度可协作性和透明度等特点,不仅吸引了无数企业和个人用户的青睐,更为软件行业带来了前所未有的繁荣景象。 一、…

代码随想录算法训练营DAY11 | 栈与队列 (2)

一、LeetCode 20 有效的括号 题目链接:20.有效的括号https://leetcode.cn/problems/valid-parentheses/ 思路:遇到左括号直接进栈;遇到右括号判断站顶是否有匹配的括号,没有就返回flase,有就将栈顶元素出栈&#xff1…

利用OpenCV实现物流与生产线自动化的革命性突破

背景介绍: 在当今高度自动化的时代,物流和生产线上的每一个环节都关乎企业的核心竞争力。传统的生产方式往往依赖于人工检测和操作,这不仅效率低下,而且容易出错。为了解决这一问题,越来越多的企业开始寻求利用计算机视…

pintia6-2符号函数 6-1两点距离

pintia的函数题,只需要把函数写上去就可以了,6-2函数题比较简单,三个if就可以解决: 6-1则套用数学公式即可,注意把函数名复制粘贴过去,以免抄错

Blender教程(基础)-切分工具-11

再菜单栏左侧、鼠标左键长按切割工具弹出选项,选择切分工具即可找到切分工具。 一、切割使用 A键全选需要切分的物体,再选择切分后再操作物体上单机长按鼠标左键划分切分范围 选择好切分位置后点击确定如下图所示:Enter键确认切分 二、…

CSS 外边距合并、塌陷和BFC

外边距合并 CSS中的外边距合并指的是当两个相邻元素都设置了上下外边距时,它们之间会发生重叠。这种现象被称为"margin collapsing"(外边距合并)或者"margin collapse"(外边距塌陷)。 可以看出上…

2024年第四届能源与环境工程国际会议(CoEEE 2024) | Ei Scopus检索

会议简介 Brief Introduction 2024年第四届能源与环境工程国际会议(CoEEE 2024) 会议时间:2024年5月22日-24日 召开地点:意大利米兰 大会官网:www.coeee.org CoEEE 2024将围绕“能源与环境工程”的最新研究领域而展开,为研究人员、…

【Springcloud篇】学习笔记十(十七章):Sentinel实现熔断与限流——Hystrix升级

第十七章_Sentinel实现熔断与限流 1.Sentinel介绍 1.1是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 用来代替Hystrix Sentinel 具有…

Web路由列表

什么是Web路由列表 在Web开发中,路由列表通常用于将请求的URL映射到相应的处理函数。尽管路由列表可以用不同的数据结构来实现,但在很多情况下是一个字典(在Python中)或其他类似的键值对结构。 路由列表(Django&#…

远程手机搭建Termux环境,并通过ssh连接Termux

背景 Termux只能通过鼠标点击,无法使用电脑键盘,输入速度很慢,你想通过ssh 连接Termux,获得友好体验搞了个云手机,想像普通手机那样充当服务器想把自己的手机公开到局域网中供同事调试想把自己的模拟器公开到局域网中…

vue3-逻辑复用

什么是组合式函数 _无状态逻辑的函数_:它在接收一些输入后立刻返回所期望的输出。 比如 时间格式化的函数。 有状态逻辑的函数: 有状态逻辑负责管理会随时间而变化的状态。 比如 跟踪当前鼠标在页面中的位置。 在 Vue 应用的概念中,“组合式函数”(…

爬虫学习笔记-scrapy安装及第一个项目创建问题及解决措施

1.安装scrapy pycharm终端运行 pip install scrapy -i https://pypi.douban.com/simple 2.终端运行scrapy startproject scrapy_baidu,创建项目 问题1:lxml版本低导致无法找到 解决措施:更新或者重新安装lxml 3.项目创建成功 4.终端cd到项目的spiders文件夹下,cd scra…

JS 引导动画

前言 引导动画是程序在某一时刻播放的动画,通常用于向用户介绍程序的功能和特点。 实现效果 实现方式 引导动画的实现方式有很多种,这里我使用的是 CSS 的 clip-path 属性。 技术选型 这里我为什么要选择 clip-path 属性而不是 mask 属性呢&#xf…

SpringbootWeb案例

准备工作 需求说明 部门管理 部门管理功能开发包括:查询部门列表、删除部门、新增部门、修改部门   员工管理功能开发包括:查询员工列表(分页、条件)、删除员工、新增员工、修改员工 环境搭建 环境搭建步骤:1. 准备数据库表(dept、emp)…

ubuntu 安装 kvmQemu no active connection to install on

更新 apt sudo apt update检查虚拟化是否开启 0 不开,其余数字表示开启,开不开都可以,不开性能弱,只能跑 x86 系统 egrep -c (vmx|svm) /proc/cpuinfo安装 sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virt…

2.3作业

写一个shell脚本判断用户输入的是否是数字

我要成为嵌入式高手之2月3日Linux高编第一天!!

学习框架 一、IO编程 多任务编程(进程、线程) 网络编程 数据库编程 二、数据结构 学习笔记 Linux软件编程: 一. Linux 1、Linux: 操作系统的内核,真正的操作系统叫Ubuntu、Redhat、CentOS..... 内核(纯c实现的代码…

pdmodel从动态模型转成静态onnx

1.下载项目 git clone https://github.com/jiangjiajun/PaddleUtils.git 2.新建两个新的文件夹 第一个文件夹放两个必要文件 第二个文件夹可以设置为空,用来存放转换后的模型 如图: 3.在终端运行 python paddle/paddle_infer_shape.py --model_dir …

DevOps落地笔记-10|环境管理:交付测试环境的迅猛方法

上一讲我主要介绍在开发过程中如何处理应用程序在不同环境的配置问题,通过有效管理应用程序的配置,最终实现一包到底。不同的环境不仅会带来应用程序本身的配置管理问题,环境本身的创建、管理、一致性等问题也需要解决。环境管理的问题也是我…

在jetbrains IDEA/Pycharm/Android Studio中安装官方rust插件,开始rust编程

在idea插件市场搜索rust:JetBrains Marketplace ,就可以找到rust插件: jetbrains官方rust插件地址:[Deprecated] Rust - IntelliJ IDEs Plugin | Marketplace 直接在idea中搜索rust好像是搜不到的: 需要在这个插件市场…