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;

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

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

相关文章

js数组和字符串之间的转换方式以及数组的一些方法

一、数组和字符串之间的转换方式 1)将字符串切割成字符串数组—stringObject.split(separator, howmany) seperator-----字符串、正则表达式,必需 howmany------指定返回的数组的最大长度,可省略,省略后全量返回 源代码 var str&q…

VBA技术资料MF114:批量给Word文档添加页眉

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…

改进的 K-Means 聚类方法介绍

引言 数据科学的一个中心假设是,紧密度表明相关性。彼此“接近”的数据点是相似的。如果将年龄、头发数量和体重绘制在空间中,很可能许多人会聚集在一起。这就是 k 均值聚类背后的直觉。 我们随机生成 K 个质心,每个簇一个,并将…

聊聊并发编程,另送5本Golang并发编程新书

大家好,我是飞哥! 并发编程并不是一个新话题,但是我觉得在近几年以及未来的时间里,并发编程将显得越来越重要。 为什么这样讲,让我们先回到一个基本的问题上来,为什么我们要采用并发编程?关于这…

k8s之安装部署及kuboard发布应用

目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm,kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…

OpenSSL:configure: error: OpenSSL library not found解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

springboot153相亲网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

【Redis】整理

对于现代大型系统而言,缓存是一个绕不开的技术话题,一提到缓存我们很容易想到Redis。 Redis整理,供回顾参考

PHP漏洞查询

CVE - Search CVE List (mitre.org) 美国国家漏洞数据库(需要梯子) NATIONAL VULNERABILITY DATABASE NVD - Search and Statistics (nist.gov) 基本都能查询到,传结果详情页里面会有一些解决方案的连接 PHP的官方网站 PHP :: Bugs :: Se…

【annie/lux 快速下载哔哩哔哩视频】全网最简单,只需要5步!!!

1.首先 现在annie更名为lux 官网地址:https://github.com/iawia002/lux/releases 2.进入官网之后如图所示 3.下载lux软件 4.下载lux 这里需要说明一下 如果不下载这个的话也可以下载视频 但是视频和音频是分开的,你的视频没有声音 5.下载视频

从宏观上对人工智能(AI)的一些理解

1.人工智能概述 68年前,约翰麦卡锡在“达特茅斯会议”正式提出人工智能概念。直到2023年,ChatGPT掀起全球AI大模型浪潮,英伟达市值一年飙涨2.4倍,真正意义上的“人工智能元年”到来了。 提到人工智能&#x…

【信息抽取 YYDS!】KnowLM:知识图谱 + 大模型,实现更有效的信息抽取和知识管理

KnowLM 知识图谱 大模型:实现信息抽取 KnowLM 原理KnowLM 部署KnowLM 应用1. 命名实体识别(NER)2. 关系抽取(RE)3. 事件抽取(EE) KnowLM 原理 代码:https://github.com/zjunlp/Kno…