如何将一张纹理图贴在模型上

news2024/12/25 9:09:34

前言

小伙伴们是否有过这样的场景:看到一个精美的3D模型,很想知道它是如何被创作出来的?于是开始了一番搜索引擎查找之后,得知需要建模工具来完成,例如3D Max、Maya、Blender、Photoshop。那么本篇就使用这些工具来完成一个精美的3D模型吧!哈哈,当然不是,本篇不会介绍如何使用这些工具来建模,而是假设在拥有了模型和纹理之后,如何利用Shader来将一张纹理贴到模型上。

纹理采样

为了获取一张纹理图上的纹素,我们需要对纹理进行采样,而在Unity当中对纹理进行采样需要用到以下函数:

tex2D(纹理图,uv坐标) 

uv坐标即纹理的映射坐标,其定义了模型的顶点在该纹理图中对应的2D坐标。uv坐标信息通常是在建模软件中通过展uv的方式将其存储在顶点坐标上的。

采样结果应用

使用tex2D(纹理图,uv坐标)函数得到的结果是一个颜色值,包含了r、g、b、a四个值。我们通常会将其应用到光照模型中的漫反射的颜色上,在之前的文章中,对光照模型中的漫反射和高光进行了介绍,这次在之前的基础上做修改即可。

 //float3 diffuse = _LightColor0.rgb * _Diffuse.rgb * lambert;
fixed3 diffuse = _LightColor0.rgb * col * saturate(nDotl); 

在Unity中的具体实现

  • 1、在Project面板右键创建一个Unlit Shader,将其命名为TexureMap。
  • 2、选中刚刚创建的Specular,右键创建一个Material。
  • 3、在Hierarchy面板创建一个Sphere,并将第2步创建的Material拖拽赋值到Sphere上。
  • 4、使用脚本IDE打开第一步创建的Shader,添加代码如下:
Shader "Unlit/TexureMap"
{Properties{ _MainTex("Texures",2D) = "white"{} _Specular("Specular",Color) = (1,1,1,1) _Gloss("Gloss",Range(1,100)) = 10}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "UnityLightingCommon.cginc"sampler2D _MainTex;float3 _Specular;float _Gloss;struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 nDirWS : TEXCOORD1;float4 posWS : TEXCOORD2;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;o.nDirWS = UnityObjectToWorldNormal(v.normal);o.posWS = mul(unity_ObjectToWorld,v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{float3 lDirWS = _WorldSpaceLightPos0.xyz;float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);float3 rDirWS = reflect(-lDirWS,i.nDirWS);float nDotl = dot(i.nDirWS,lDirWS);float vDotr = dot(vDirWS,rDirWS);//采样纹理fixed3 col = tex2D(_MainTex, i.uv).rgb;//光照模型fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * col * saturate(nDotl);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(vDotr),_Gloss);fixed3 finalColor = ambient + diffuse + specular;return fixed4(finalColor,1.0);}ENDCG}}
} 
  • 5、回到Unity,选中material,将纹理图拖拽赋值到_MainTex。
  • 6、查看最终效果。

最后

纹理映射的代码实现起来比较简单,不过其背后的工作其实并不简单,如果想要深入理解纹理映射背后的原理,可以翻看图形学相关书籍。OK,本篇就到这里。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

Redis【包括Redis 的安装+本地远程连接】

Redis 一、为什么要用缓存? 缓存定义 缓存是一个高速数据交换的存储器,使用它可以快速的访问和操作数据。 程序中的缓存 在我们程序中,如果没有使用缓存,程序的调用流程是直接访问数据库的; 如果多个程序调用一个数…

如何在原始的认知上找回自己

认知、欲望加恐惧,这三种要素在我们对一个事物的判断中都在起作用,只不过配比不一样,导致你的判断不一样。我们通常以为有了认知能力,就产生了认知,就如同面前有一个东西,你用照相机拍下来就成了一张照片—…

【算法基础】高精度除法

👦个人主页:Weraphael ✍🏻作者简介:目前是C语言 算法学习者 ✈️专栏:【C/C】算法 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

PN外加电场后电场变化

没有外加电场时(下面都是以外加反向电场分析) 中间两条实线假设是PN节在没有外加电场的情况下形成的一个内部电场边界。 形成原因 实用的半导体一般是混合物 P型半导体,实际上是一种4价和3价元素的混合物。化学中都知道达到4或8的外层电子…

论文浅尝 | KGE by Adaptive Limit Scoring Loss Using DWS

笔记整理:陈磊,天津大学硕士链接:https://ieeexplore.ieee.org/ielx7/6287639/7859429/08057770.pdf动机设计一个强大而有效的损失框架对于知识图嵌入模型区分正确和不正确的三元组至关重要。经典的基于边距的排名损失将正负三元组的分数限制…

极智AI | 算能SDK架构

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 算能SDK架构。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com…

华芯微特开发环境搭建-SWM34SVET6为例

SWM34S系列是cortex-M33,内核是arm-v8指令集,和其他cortex系列有差异,要新的工具版本支持(jlink要升级到V9以上,keil要升级到5.32以上)。 1.Keil要先安装5.36的版本,并取得版权(5.3…

【MYSQL中级篇】数据库数据查询学习

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 相关文章 文章名文章地址【MYSQL初级篇】入门…

网络安全-Kali更新源(APT)

网络安全-Kali更新源(APT) 这篇东东很少内容 Kali是基于乌班图开发出来的 这个APT不是攻击的那个APT 这个APT和centos里面的YUM是一样的 下面是介绍的一些国内的APT包,我自己用的阿里云 通俗点怎么理解呢,你手机里面的应用市场,苹…

【闲聊】我用ChatGPT参加了大数据面试

用Chat GPT试了试面试题,回答得比较简单。 问:你可以以应聘者的身份参加一场大数据程序员面试吗 答:可以 ,如果您符合面试要求,可以参加大数据程序员面试。 问:那么为什么你要投递大数据开发这个岗位 答&am…

数据结构总结

数据结构总结排序算法冒泡排序选择排序插入排序希尔排序堆排序快速排序算法归并排序计数排序基数排序树红黑树基本概念规则B树基础知识规则B树图回溯算法并查集拓扑排序其他算法KMP算法例题数组类求最大和子数组求子数组最大乘积删除重复链表元素十大排序算法参考 排序算法 冒…

16:00面试,16:09就出来了 ,问的实在是太...

从外包出来,没想到算法死在另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到8月一纸通知,所有人不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟内…

情人节快到了,我部署了一套情侣头像小程序,并过审了

最近在学习如何部署微信小程序,目的就是像拥有一个属于自己的小程序 之前做的是一个微信公众号,靠自然的流量虽然也开通了流量主,但是每天收益就是那0.0几的,所有寻思看能不能做一个小程序出来。不会写小程序的我,也只能用现成的…

IO流01_字节字符流、缓冲流、标准输入、输出流、打印流

文章目录①. IO流概述及分类②. 字节输入流 - FileInputStream③. 字节输出流 - FileOutputStream④. 字符输入流 - FileReader⑤. 字符输出流 - FileWriter⑥. 字节缓冲流 - Buffered⑦. 掌握 - 相关流习题操作⑧. 标准输入、输出流(了解)⑨. 打印流 - PrintStream、PrintWrit…

Retinanet网络与focal loss损失

1.损失函数 1)原理 本文一个核心的贡献点就是 focal loss。总损失依然分为两部分,一部分是分类损失,一部分是回归损失。 在讲分类损失之前,我们来回顾一下二分类交叉熵损失 (binary_cross_entropy)。 计…

算法设计与分析(屈婉玲)视频笔记day2

序列求和的方法 数列求和公式 等差、等比数列与调和级数 求和的例子 二分检索算法 二分检索运行实例 2 n 1个输入 比较 t 次的输入个数 二分检索平均时间复杂度 估计和式上界的放大法 放大法的例子 估计和式渐近的界 估计和式渐近的界 小结 • 序列求和基本公式:…

使用 CSS 变量更改多个元素样式

使用 CSS 变量更改多个元素样式 var() 函数用于插入自定义的属性值,如果一个属性值在多处被使用,该方法就很有用。 custom-property-name 是必需的, 自定义属性的名称,必需以 – 开头。 value 可选。备用值,在属性不存在的时候使…

牛客网Python篇数据分析习题(六)

1.某公司计划举办一场运动会,现有运动会项目数据集items.csv。 包含以下字段: item_id:项目编号; item_name:项目名称; location:比赛场地。 有员工报名情况数据集signup.csv。包含以下字段: employee_id&a…

高性能(二)

三、读写分离和分库分表 1.读写分离 1.1 概述 将数据库的读写操作分散到不同的数据库节点上 通常一主多从一台主数据库负责写,多台从数据库负责读。 主库和从库之间会进行数据同步,以保证从库中数据的准确性。 1.2 问题及解决 1.2.1 问题 主从同…

ChatGPT眼中的产品经理是这样的

在玩ChatGPT的时候,突发奇想,ChatGPT对产品经理的认知是啥样呢?于是我找了几个大家都比较关注的产品经理问题,看看ChatGPT是如何回答的。1、产品经理可以干一辈子嘛?2、产品经理的核心竞争力是啥?3、产品经…