Unity Mesh(五) Mesh 立方體Cube貼圖以及六個面分別貼不同的圖片
using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class Test3D : MonoBehaviour { public enum Direction { ClockWise, Anti_ClockWise } public Material mat; public Direction direction; // Use this for initialization void Start() { switch (direction) { case Direction.ClockWise: DrawCubeWithUV_CloclWise(); break; case Direction.Anti_ClockWise: DrawCubeWithUV_Anti_CloclWise(); break; } } void DrawCubeWithUV_CloclWise() { gameObject.GetComponent<MeshRenderer>().material = mat; Mesh mesh = GetComponent<MeshFilter>().mesh; mesh.Clear(); //設定頂點 mesh.vertices = new Vector3[] { //front new Vector3(0, 0, 0), new Vector3(0, 0, 1), new Vector3(1, 0, 1), new Vector3(1, 0, 0), //top new Vector3(0, 0, 1), new Vector3(0, 1, 1), new Vector3(1, 1, 1), new Vector3(1, 0, 1), //back new Vector3(0, 1, 1), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 1, 1), //bottom new Vector3(0, 1, 0), new Vector3(0, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 1, 0), //left new Vector3(0, 1, 0), new Vector3(0, 1, 1), new Vector3(0, 0, 1), new Vector3(0, 0, 0), //right new Vector3(1, 0, 0), new Vector3(1, 0, 1), new Vector3(1, 1, 1), new Vector3(1, 1, 0), }; //順時針看不到正面的,貼圖在裡面 mesh.triangles = new int[] { 0,1,2, 0,2,3, 4,5,6, 4,6,7, 8,9,10, 8,10,11, 12,13,14, 12,14,15, 16,17,18, 16,18,19, 20,21,22, 20,22,23 }; Vector2[] uvs = new Vector2[mesh.vertices.Length]; for (int i = 0; i < uvs.Length; i += 4) { //正常貼圖 uvs[i] = new Vector2(0, 0); uvs[i + 1] = new Vector2(0, 1); uvs[i + 2] = new Vector2(1, 1); uvs[i + 3] = new Vector2(1, 0); //轉換貼圖 //uvs[i] = new Vector2(1, 0); //uvs[i + 1] = new Vector2(1, 1); //uvs[i + 2] = new Vector2(0, 1); //uvs[i + 3] = new Vector2(0, 0); } mesh.uv = uvs; //Vector3[] normals = new Vector3[mesh.vertices.Length]; //for (int i = 0; i < normals.Length; i++) //{ // if (i < 4) // normals[i] = Vector3.forward; // if (i >= 4 && i < 8) // normals[i] = Vector3.up; // if (i >= 8 && i < 12) // normals[i] = Vector3.back; // if (i >= 12 && i < 16) // normals[i] = Vector3.down; // if (i >= 16 && i < 20) // normals[i] = Vector3.left; // if (i >= 20 && i < 24) // normals[i] = Vector3.right; //} //mesh.normals = normals; } void DrawCubeWithUV_Anti_CloclWise() { gameObject.GetComponent<MeshRenderer>().material = mat; Mesh mesh = GetComponent<MeshFilter>().mesh; mesh.Clear(); //設定頂點 mesh.vertices = new Vector3[] { //front new Vector3(0, 0, 0), new Vector3(0, 0, 1), new Vector3(1, 0, 1), new Vector3(1, 0, 0), //top new Vector3(0, 0, 1), new Vector3(0, 1, 1), new Vector3(1, 1, 1), new Vector3(1, 0, 1), //back new Vector3(0, 1, 1), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 1, 1), //bottom new Vector3(0, 1, 0), new Vector3(0, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 1, 0), //left new Vector3(0, 1, 0), new Vector3(0, 1, 1), new Vector3(0, 0, 1), new Vector3(0, 0, 0), //right new Vector3(1, 0, 0), new Vector3(1, 0, 1), new Vector3(1, 1, 1), new Vector3(1, 1, 0), }; //逆時針看到的很好,但是貼圖反了 mesh.triangles = new int[] { 0,2,1, 0,3,2, 4,6,5, 4,7,6, 8,10,9, 8,11,10, 12,14,13, 12,15,14, 16,18,17, 16,19,18, 20,22,21, 20,23,22 }; #if false //六個面貼同一張圖片 Vector2[] uvs = new Vector2[mesh.vertices.Length]; for (int i = 0; i < uvs.Length; i += 4) { //uvs[i] = new Vector2(0, 0); //uvs[i + 1] = new Vector2(0, 1); //uvs[i + 2] = new Vector2(1, 1); //uvs[i + 3] = new Vector2(1, 0); uvs[i] = new Vector2(1, 0); uvs[i + 1] = new Vector2(1, 1); uvs[i + 2] = new Vector2(0, 1); uvs[i + 3] = new Vector2(0, 0); } mesh.uv = uvs; #else //六個面貼不同的圖片 Vector2[] uvs = sixTexForCube(mesh.vertices); mesh.uv = uvs; #endif //法線 //Vector3[] normals = new Vector3[mesh.vertices.Length]; //for (int i = 0; i < normals.Length; i++) //{ // if (i < 4) // normals[i] = Vector3.forward; // if (i >= 4 && i < 8) // normals[i] = Vector3.up; // if (i >= 8 && i < 12) // normals[i] = Vector3.back; // if (i >= 12 && i < 16) // normals[i] = Vector3.down; // if (i >= 16 && i < 20) // normals[i] = Vector3.left; // if (i >= 20 && i < 24) // normals[i] = Vector3.right; //} //mesh.normals = normals; } Vector2[] sixTexForCube(Vector3[] verticles) { Vector2[] uv = new Vector2[verticles.Length]; float t = 1 / 3f; //front uv[0] = new Vector2(t, 0); uv[1] = new Vector2(t, t); uv[2] = new Vector2(0, t); uv[3] = new Vector2(0, 0); //top uv[4] = new Vector2(2 * t, 0); uv[5] = new Vector2(2 * t, t); uv[6] = new Vector2(t, t); uv[7] = new Vector2(t, 0); //back uv[8] = new Vector2(1, 0); uv[9] = new Vector2(1, t); uv[10] = new Vector2(2 * t, t); uv[11] = new Vector2(2 * t, 0); //Bottom uv[12] = new Vector2(t, t); uv[13] = new Vector2(t, 2 * t); uv[14] = new Vector2(0, 2 * t); uv[15] = new Vector2(0, t); //left uv[16] = new Vector2(2 * t, t); uv[17] = new Vector2(2 * t, 2 * t); uv[18] = new Vector2(t, 2 * t); uv[19] = new Vector2(t, t); //right uv[20] = new Vector2(1, t); uv[21] = new Vector2(1, 2 * t); uv[22] = new Vector2(2 * t, 2 * t); uv[23] = new Vector2(2 * t, t); return uv; } }
相關推薦
Unity Mesh(五) Mesh 立方體Cube貼圖以及六個面分別貼不同的圖片
using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class Test3D : MonoBehaviour { publi
unity 中帶貼圖以及動畫的模型檔案轉為 lowpoly 風格的方法
本篇講述的是使用程式碼來修改的方法,其實unity已經給我們提供了設定的方法:Normals選擇Calculate,Smoothing Angle調整為0即可。原文章中主要是沒有提到UV以及骨骼與定點的繫結方法。由於實現lowpoly的風格其實就是將原來的1個點複製為多個點,
【原】高光貼圖參數放入顏色貼圖的alpha通道中
llb ceo -- shade struct surf render fall diffuse 今天美術想把高光貼圖參數合成到Main貼圖中,減少貼圖數,挺好,知道省內存了。 於是簡單改了改surface著色器。 Shader "Custom/HighLightByAlp
Unity Mesh(七) Mesh給球貼圖
之前在 中已經說明了如何畫球,現在我們在這個球的基礎上貼圖。 這裡我們有個極座標和直角座標的轉換,具體我也不是很明白,反正就是拿來用吧,據某位大神講解,極座標(球座標)由球半徑,水平角和垂直角決定,我們完全可以理解為三維座標轉換成uv座標的
Unity Mesh(四) Mesh 平面圖形的貼圖
前面都講了怎麼畫,沒有寫怎麼貼圖,上一篇提到了法線,今天這篇會說說平面圖形的貼圖。 為了更好的觀察,我們使用這張圖片來進行貼圖(可以右擊儲存): 一、三角形貼圖 三角形的貼圖是最簡單的,因為我們畫的三角形就簡單,直接根據點來選取: 首先說下貼圖的座標系:如下圖
動態載入烘培貼圖與Terrain轉mesh
前言 unity載入烘培貼圖是需要載入場景才可以使用,但如果專案只使用一個場景或者有許多關卡地形時,明顯通過載入場景來達到更換烘培貼圖的這種做法是不妥當的。而terrain地形在有些安卓機上的支援並不是很好,所以有必要把地形轉為網格。慶幸的是,網上也有這方面的
立方體環境貼圖(Cube Mapping)之OpenGL原理
立方體紋理是一種特殊的紋理技術,它用6幅二維紋理影象構成一個以原點為中心的紋理立方體。對於每個片段,紋理座標(s, t, r)被當作方向向量看待,每個紋理單元都表示從原點所看到的紋理立方體上的影象。 一個典型的立方環境貼圖如下:
FairyGUI UIPanel看不到顯示UI的Mesh和貼圖的問題
初學FairyGUI,看例子,FairyGUI在Editor中顯示UI的時候是先選擇Package名,在選擇Component名,然後在場景裡面就可以顯示包裡面的元件,這時就有一個問題,底層到底做了什麼使得UIPanel能夠顯示Mesh和貼圖? 看了Fairy
Unity Shader 法線貼圖的實現
計算 變換 float minus include 的確 dal 反射 mode 這裏有一個細節,關於法線貼圖是有兩個不同的空間的,如下: 切線空間:法線貼圖顏色為偏藍色 模型空間:法線貼圖顏色為五顏六色 因此根據不同的空間變換位置方便一致計算。 1 // 法
unity 貼圖
inf 因此 基礎上 tro 控制 ron lmap 導入 金屬 貼圖的英語 Map 其實包含了另一層含義就是“映射”。其功能就是把紋理通過 UV 坐標映射到3D 物體表面。貼圖包含了除了紋理以外其他很多信息,比方說 UV 坐標、貼圖輸入輸出控制等等。材質是一個數據集,主要
ShaderLab學習小結(十五)法線貼圖的簡單Shader
otl mvp truct 沒有 模型 視覺 有一個 rdb 值範圍 目標:賦予材質法線貼圖,並能響應光照的變化,體現出凹凸感。場景中只有一個主平行光找了一張法線貼圖(網上蕩的)在unity裏別忘了把這張圖設為normalmap先看一下,如果只是作為普通貼圖,賦在Diffu
Unity使用腳本進行批量動態加載貼圖
它的 有關 技術 post 應該 而且 下一步 AI 屬性。 先描述一下我正在做的這個項目,是跑酷類音遊。 那麽跑酷類音遊在繪制跑道上的時候,就要考慮不同的磚塊顯示問題。假設我有了一個節奏列表,那麽我們怎麽將不同的貼圖貼到不同的磚塊上去呢? 我花了好幾個小時才搞清楚裏面的門
blender 帶貼圖與顏色材質的模型,導入到Unity中
發現 dba http 就是 技術 有用 自己 oss bee Blender初學環境:win10 x64blender 2.79unity 5.6.2 之前不論是用導出fbx,還是把 .blend文件拽入u3d中,原先的貼圖就沒有了研究了很多天,才發現一個我這裏可用的方法
Unity的www網路下載類(以替換模型貼圖為例說明)
一、編寫給模型替換貼圖的指令碼 /*** * * Title: * 網路基礎 * * * Description: * 功能: * WWW 下載類的學習 * * Date: 20
Unity 動態生成mesh圓圈
using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))] public class yuan : MonoBehaviour
Unity Shader程式設計 (一)簡單凹凸貼圖和自選邊緣顏色和強度的shader編寫
程式碼轉自: http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星雲(淺墨) Shader "淺墨Shader程式設計/0.TheFirstShader" { &nb
Unity中的法線貼圖、漫反射及高光
我們都知道,一個三維場景的畫面的好壞,百分之四十取決於模型,百分之六十取決於貼圖,可見貼圖在畫面中所佔的重要性。在這裡我將列舉一些貼圖,並且初步闡述其概念,理解原理的基礎上製作貼圖,也就順手多了。 我在這裡主要列舉幾種UNITY3D中常用的貼圖,與大家分享,希望對大家有幫助。
unity標準Shader之十種貼圖型別
十種貼圖型別 介紹:標準 Shader 貼圖 標準 Shader 使用的是 PBR 渲染,基於現實物理效果的渲染表現形式。 一個模型能不能使用標準 Shad
Unity中貼圖處理
專案逼近後期,效能問題尤為突出。卡頓、幀數很低、記憶體過高等問題一一擺在面前。 就先從記憶體說起吧。 影響遊戲記憶體的因數有很多:比如說紋理、網格、動畫、音訊、Mono堆記憶體等。 今天咱們主要研究一
Unity標準 Shader 下的十種貼圖型別
一、Main Maps 主貼圖區域 1.Albedo 貼圖 ** Albedo:反照率[貼圖];用於體現模型的紋理,顏色。 反照率貼圖本身是一張顏色與紋理的貼圖。 該選項有貼圖屬性,也有顏色屬性。 兩個屬性可以單獨使用,也可以組合使用; 當顏色屬性為純白色時,