服務(wù)器數(shù)據(jù)庫等雜項
1.Unity連接數(shù)據(jù)庫
需要得到Mono.Data.Sqlite.dll文件與 System.Data.dll 文件
2.如何與服務(wù)器交互
做游戲,基本上都避免不了與服務(wù)器端交互,與服務(wù)器端交互的方式也有幾種,總結(jié)起來就是長連接模式(Socket)與短鏈接模式(Http)。
3.如何處理網(wǎng)絡(luò)異常下的可玩性
1)為游戲增加單機模式:比如故事模塊,網(wǎng)絡(luò)異常時可以閱讀游戲的故事;豐富的技能或卡牌,網(wǎng)絡(luò)異常時可以了解技能和卡牌;提供單機玩法,玩家可以與AI進行游戲等。
2)為游戲提供教程模塊,網(wǎng)絡(luò)異常時可以學習游戲技巧。
4.怎樣反外掛?對外掛的看法
游戲外掛的原理:外掛分為多種,比如模擬鍵盤的,鼠標的;修改數(shù)據(jù)包的;修改本地內(nèi)存的。
1)對于模擬用戶的鼠標鍵盤輸入的外掛,我們可以用網(wǎng)頁上常用的驗證碼的方式來對付。模擬鍵盤鼠標的外掛對游戲的影響比加速、修改封包、修改內(nèi)存、脫機等要小得多,因此被一些人稱為綠色外掛。
2)讓服務(wù)器不把在正常情況下玩家看不到的東西的數(shù)據(jù)傳送給客戶端。
3)把玩家操作記錄發(fā)到服務(wù)器進行模擬,如果和客戶端的計算結(jié)果偏差較大可以認為作弊。
5.你對跨平臺的了解。
跨平臺就是在一個熟悉的平臺上面開發(fā)的軟件或者程序,直接可以在其他平臺上正常的運行顯示而不需要對其原始文件或者原始代碼進行修改。
6.談?wù)勀銈児镜木W(wǎng)絡(luò)編程
在我們公司基本是由服務(wù)端人員開發(fā)的,我這邊只調(diào)用他們提供的客戶端SDK和服務(wù)器端通信。服務(wù)器端是公司用C++自行研發(fā)的。
7.會做數(shù)據(jù)庫嗎?有嵌套的數(shù)據(jù)庫能做么?
會。用過關(guān)系型數(shù)據(jù)庫mysql。能做,只是這方面之前在公司沒怎么負責這塊,有些生疏,稍微熟悉一下就能做。
8.了解代碼管理么?在開發(fā)中使用什么代碼管理工具?使用的接口多一點還是繼承多一點?
了解。使用SVN進行代碼管理。接口多一點。
9.公司內(nèi)部信息傳遞用的什么安全協(xié)議?
1、公司自定義的安全協(xié)議 或者 基于SSL/TLS協(xié)議 或者SSH協(xié)議
2、我們至少調(diào)用基于相關(guān)協(xié)議的SDK
3、SSL/TLS 協(xié)議
SSL/TLS協(xié)議(RFC2246 RFC4346)處于 TCP/IP 協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。
從協(xié)議內(nèi)部的功能層面上來看,SSL/TLS協(xié)議可分為兩層:
1. SSL/TLS記錄協(xié)議(SSL/TLS Record Protocol),它建立在可靠的傳輸層協(xié)議(如 TCP)之上,為上層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能。
2. SSL/TLS握手協(xié)議(SSL/TLS Handshake Protocol),它建立在 SSL/TLS 記錄協(xié)議之上,用于在實際的數(shù)據(jù)傳輸開始前,通訊雙方進行身份認證、協(xié)商加密算法、交換加密密鑰等初始化協(xié)商功能。
SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸?shù)臄?shù)據(jù)進行加密,這樣”中間人”這種攻擊方式就不可能實現(xiàn)了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸?shù)臄?shù)據(jù)是經(jīng)過壓縮的,所以可以加快傳輸?shù)乃俣取SH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個安全的”通道”。
10.原公司服務(wù)器怎么實現(xiàn)多人在線?
使用socket基于TCP協(xié)議開發(fā)的多人在線。公司有自行開發(fā)的服務(wù)端程序
11.項目問題,和美工想法沖突了怎么辦?
找項目主管協(xié)調(diào)處理
12.對unity的理解
可以做VR、手游、工藝仿真、端游、頁游跨平臺的游戲引擎
13.面試題:VR相關(guān)問題用了哪些設(shè)備?接入了哪些SDK?根據(jù)項目問如何實現(xiàn)手勢控制?
htc vive和oculus, htc vive用到的是steam vr 免費插件,Oculus早期有SDK,現(xiàn)在Unity原生支持
14.開過什么平臺?多線程的理解
PC、Android。
多線程是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計算機因有硬件支持而能夠在同一時間執(zhí)行多于一個線程,進而提升整體處理性能。
使用線程可以把占據(jù)時間長的程序中的任務(wù)放到后臺去處理
·用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進度條來顯示處理的進度
·程序的運行速度可能加快
·在一些等待的任務(wù)實現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。
15.怎樣實現(xiàn)植物的彎曲
1、max做骨骼動畫
2、修改Tree組件的Growth Angle的值
16.用過什么游戲框架?
SimpleFramework,基于ulua的框架,支持ugui和ngui的熱更新
17.模型導入Unity后怎么與數(shù)據(jù)庫產(chǎn)生聯(lián)系?類似打通程序和數(shù)據(jù)庫通道
例如mysql數(shù)據(jù)庫,需要導入兩個文件,就可以通過sql語句往數(shù)據(jù)庫寫數(shù)據(jù),數(shù)據(jù)可以是模型信息
18.用過什么傳輸協(xié)議,用什么語言
http,tcp(socket) 都是C# 語言編寫
19.都在什么平臺上開發(fā)過游戲或軟件用的什么框架
Android
20.會寫框架么
設(shè)計模式了解一些,但是沒寫過框架
21.請簡述在客戶端開發(fā)方面你最擅長的模塊系統(tǒng),以及你覺得哪些模塊會出現(xiàn)的問題
擅長UI模塊的制作,我認為熱更新模塊會出現(xiàn)問題,比如資源依賴不合理,導致資源包過大
22.如何實現(xiàn)背包系統(tǒng)、寵物系統(tǒng)、裝備系統(tǒng)的實時更新?
NGUI做界面,使用ulua做熱更新。之前公司使用的是SimpleFramework這樣的框架。
23.熱更新的解決方案(資源以及代碼)
ulua框架、simpleFramework框架 、bundle manager插件
數(shù)據(jù)結(jié)構(gòu)算法相關(guān)
24.對數(shù)據(jù)結(jié)構(gòu)了解嗎?說說你常用的數(shù)據(jù)結(jié)構(gòu)。
了解,數(shù)據(jù)結(jié)構(gòu)是每個程序員都要會一點的。鏈表、列表、散列表最常用,隊列和棧也經(jīng)常使用。二叉樹偶爾使用。
25.什么是狀態(tài)機,什么是行為樹
有限狀態(tài)機系統(tǒng):是指在不同階段會呈現(xiàn)出不同的運行狀態(tài)的系統(tǒng),這些狀態(tài)是有限的、不重疊的。這樣的系統(tǒng)在某一時刻一定會處于其所有狀態(tài)中的一個狀態(tài),此時它接收一部分允許的輸入,產(chǎn)生一部分可能的響應(yīng),并且遷移到一部分可能的狀態(tài)。
1.基本節(jié)點是狀態(tài):他包含了一系列運行在該狀態(tài)的行為以及離開這個狀態(tài)的條件。
2.狀態(tài)可以任意跳轉(zhuǎn),實現(xiàn)簡單,但是對于大的狀態(tài)機很難維護.狀態(tài)邏輯的重用性低.
3.每一個狀態(tài)的邏輯會隨著一些新狀態(tài)的增加而越來越復雜。維持狀態(tài)的數(shù)量和狀態(tài)邏輯復雜性是一個很大的難點。需要合理的分割以及重用狀態(tài)。
4.狀態(tài)機狀態(tài)的復用性很差,一旦一些因素變化導致這個環(huán)境發(fā)生變化。你只能新增一個狀態(tài),并且給這個新狀態(tài)添加連接他以及其他狀態(tài)的跳轉(zhuǎn)邏輯。
5.狀態(tài)機的跳轉(zhuǎn)條件一旦不滿足,就會一直卡在某一個狀態(tài)。
行為樹:一個流行的AI技術(shù),涵蓋了層次狀態(tài)機,事件調(diào)度,事件計劃,行為等一系列技術(shù)。
1.高度模塊化狀態(tài),去掉狀態(tài)中的跳轉(zhuǎn)邏輯,使得狀態(tài)變成一個“行為”。
2. “行為”和”行為”之間的跳轉(zhuǎn)是通過父節(jié)點的類型來決定的。比如并行處理兩個行為,在狀態(tài)機里面無法同時處理兩個狀態(tài)。
3.通過增加控制節(jié)點的類型,可以達到復用行為的目的。
4.可視化編輯。
26.對List的理解
有序的對象列表,屬于數(shù)據(jù)結(jié)構(gòu)的一種:順序結(jié)構(gòu)
泛型集合類,引入System.Collections.Generic命名空間,
常用操作有,Count屬性查看長度,Add()添加,Remove()去除,AddRange()添加集合,Clear()清空集合。
27.數(shù)組和List的核心區(qū)別
數(shù)組在C#中最早出現(xiàn)的。在內(nèi)存中是連續(xù)存儲的,所以它的索引速度非??欤屹x值與修改元素也很簡單。
數(shù)組存在一些不足的地方。在數(shù)組的兩個數(shù)據(jù)間插入數(shù)據(jù)是很麻煩的,而且在聲明數(shù)組的時候必須指定數(shù)組的長度,數(shù)組的長度過長,會造成內(nèi)存浪費,過段會造成數(shù)據(jù)溢出的錯誤。如果在聲明數(shù)組時我們不清楚數(shù)組的長度,就會變得很麻煩。
List是集合,集合元素的數(shù)量可以動態(tài)變化。增加、插入、刪除元素很方便。
28.數(shù)據(jù)結(jié)構(gòu)的看法
具有一定關(guān)系的數(shù)據(jù)元素集合,好的數(shù)據(jù)結(jié)構(gòu)有利于簡化算法的編寫
29.深度優(yōu)化會么
會一點,比如在代碼消耗上經(jīng)常使用StopWatch類去優(yōu)化算法,通常用IDisposable去顯式的釋放資源。
30.實現(xiàn)二分要什么條件
有序結(jié)構(gòu)
31.c++,socket網(wǎng)絡(luò)編程會不會
C++上學的時候?qū)W過,工作之后一直沒用過。
Socket就是一套實現(xiàn)雙向通信的API。使用過C#的TCP(面向連接、可靠)和UDP連接(面向非連接、不可靠)
32.二叉樹的所有遍歷方式的原理及優(yōu)缺點
前序遍歷,先訪問根節(jié)點在訪問左節(jié)點在訪問右節(jié)點。
中序遍歷,先訪問左節(jié)點在訪問根節(jié)點在訪問右節(jié)點。
后序遍歷,先訪問左節(jié)點在訪問右節(jié)點在訪問根節(jié)點。
前中后代表的是訪問根節(jié)點的時序。
這一點上沒有什么本質(zhì)上的優(yōu)缺點,要看實際需求決定采用何種遍歷方式
采用遞歸方式和非遞歸方式。前者優(yōu)點是直觀,編寫起來簡單,缺點是但其開銷也比較大。非遞歸形式開銷小,但編寫復雜。
33.數(shù)據(jù)結(jié)構(gòu)中數(shù)組和鏈表各有什么特點,什么場合下應(yīng)該使用數(shù)組,什么場合下應(yīng)該使用鏈表
二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
從邏輯結(jié)構(gòu)來看
1.數(shù)組必須事先定義固定的長度(元素個數(shù)),不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況。當數(shù)據(jù)增加時,可能超出原先定義的元素個數(shù);當數(shù)據(jù)減少時,造成內(nèi)存浪費;數(shù)組可以根據(jù)下標直接存取。
2.鏈表動態(tài)地進行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項。(數(shù)組中插入、刪除數(shù)據(jù)項時,需要移動其它數(shù)據(jù)項,非常繁瑣)鏈表必須根據(jù)next指針找到下一個元素
從內(nèi)存存儲來看
1. (靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但是自由度小
2.鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩
從上面的比較可以看出,如果需要快速訪問數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組;相反,如果需要經(jīng)常插入和刪除元素就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。
設(shè)計模式相關(guān)
34.用過哪些設(shè)計模式?談?wù)勛约罕容^熟悉的設(shè)計模式
1、工廠模式2、代理模式3、策略模式4、觀察者模式6、單例模式
工廠模式:
簡單工廠模式解決的問題是如何去實例化一個合適的對象。
簡單工廠模式的核心思想就是:有一個專門的類來負責創(chuàng)建實例的過程。凡是出現(xiàn)了大量的產(chǎn)品需要創(chuàng)建,并且具有共同的接口時,可以通過工廠方法模式進行創(chuàng)建。比如說寫技能是一系列類,那么就可以使用工廠模式創(chuàng)建。
代理模式:一個是真正的你要訪問的對象(目標類),一個是代理對象,真正對象與代理對象實現(xiàn)同一個接口,先訪問代理類再訪問真正要訪問的對象。
代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候回去找中介,為什么呢?因為你對該地區(qū)房屋的信息掌握的不夠全面,希望找一個更熟悉的人去幫你做,此處的代理就是這個意思。再如我們有的時候打官司,我們需要請律師,因為律師在法律方面有專長,可以替我們進行操作,表達我們的想法。
代理模式的應(yīng)用場景:
如果已有的方法在使用的時候需要對原有的方法進行改進,此時有兩種辦法:
1、修改原有的方法來適應(yīng)。這樣違反了“對擴展開放,對修改關(guān)閉”的原則。
2、就是采用一個代理類調(diào)用原有的方法,且對產(chǎn)生的結(jié)果進行控制。這種方法就是代理模式。
使用代理模式,可以將功能劃分的更加清晰,有助于后期維護!
策略模式:定義一系列算法,并將每個算法封裝起來,使他們可以相互替換,且算法的變化不會影響到使用算法的客戶。策略模式的決定權(quán)在用戶,系統(tǒng)本身提供不同算法的實現(xiàn),新增或者刪除算法,對各種算法做封裝。因此,策略模式多用在算法決策系統(tǒng)中,外部用戶只需要決定用哪個算法即可。
觀察者模式很好理解,類似于郵件訂閱和RSS訂閱,當我們?yōu)g覽一些博客或wiki時,經(jīng)常會看到RSS圖標,就這的意思是,當你訂閱了該文章,如果后續(xù)有更新,會及時通知你。其實,簡單來講就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,并且隨著變化!對象之間是一種一對多的關(guān)系。
單例對象(Singleton)是一種常用的設(shè)計模式。在C#應(yīng)用中,單例對象能保證在一個CLR中,該對象只有一個實例存在。這樣的模式有幾個好處:
1、某些類創(chuàng)建比較頻繁,對于一些大型的對象,這是一筆很大的系統(tǒng)開銷。
2、省去了new操作符,降低了系統(tǒng)內(nèi)存的使用頻率,減輕GC壓力。
3、有些類如交易所的核心交易引擎,控制著交易流程,如果該類可以創(chuàng)建多個的話,系統(tǒng)完全亂了。(比如一個軍隊出現(xiàn)了多個司令員同時指揮,肯定會亂成一團),所以只有使用單例模式,才能保證核心交易服務(wù)器獨立控制整個流程。
35.請說出4種面向?qū)ο蟮脑O(shè)計原則,并分別簡述它們的含義。
[if !supportLists]1)?[endif]單一職責原則(The Single Responsiblity Principle,簡稱
SRP):一個類,最好只做一件事,只有一個引起它的變化.
[if !supportLists]2)?[endif]開放-封閉原則(The Open-Close Principle,簡稱
OCP):對于擴展是開放的,對于更改是封閉的
[if !supportLists]3)?[endif]Liskov替換原則(The Liskov Substitution Principle,簡稱
LSP):子類必須能夠替換其基類
[if !supportLists]4)?[endif]依賴倒置原則(The Dependency Inversion Pricinple, 簡稱
DIP):依賴于抽象
[if !supportLists]5)?[endif]接口隔離原則(The Interface Segregation Principle,簡稱
ISP):使用多個小的專門的接口,而不要使用一個大的總接口。
36.設(shè)計一個狀態(tài)機類型,狀態(tài)值為int類型,要求:
擁有接口,獲取當前狀態(tài),切換狀態(tài)
外部可以監(jiān)聽狀態(tài)切換事件,參數(shù)為切換前狀態(tài)和切換后狀態(tài)(使用delete和event)//定義一個狀態(tài)
public abstract class IAction{
????public int StateName;
????public IAction(int stateName) {
????????this.StateName = stateName;
????}
????public int GetState(){
????????return StateName;
????}
????public abstract bool CanGetIn();
????public abstract void GetIn();
????public abstract void GetOut();
????public abstract void Update(float dt);
}
//定義一個狀態(tài)切換事件
public abstract class IEvent?{
????public int code;
????public IEvent(int code) {
????????this.code = code;
}
????public int GetCode(){
????????return code;
}
//當前狀態(tài)事件檢測
????public abstract bool Check();
}
public class AvatarStateMachine{
? //初始化狀態(tài)機
? public void InitStateMachine(){}
? //注冊一個狀態(tài)
? public void AddAction(int action) {}
? //注冊一個狀態(tài)切換事件
? public void AddEventTransition(int fromAction, int toAction, IEvent byEvent) {}
? //更新當前狀態(tài),檢測能否進入下一個狀態(tài)
? public void UpdateStateMachine(){}
? //強行切換狀態(tài)
? public void SwitchTo(int toState) {}
}
37.如何處理unity中界面資源,界面邏輯以及功能模塊三者之間耦合關(guān)系
這就是在Unity使用MVC時通常將功能模塊盡量脫離脫離MonoBehavior,同一個模塊內(nèi)M只用來操作數(shù)據(jù)并發(fā)送更新消息,V只用來接受消息并控制界面顯示跳轉(zhuǎn),使用C來處理界面與數(shù)據(jù)的頻繁操作。
38.觀察者模式的深入理解?
觀察者模式:一對多的關(guān)系,當被觀察這發(fā)生改變時會通知所有觀察者。讓雙方都依賴于抽象,使得各自變化不會影響另一方。
39.MVC模式
用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯。
圖形學相關(guān)
40..簡述四元數(shù)的作用,四元數(shù)對歐拉角的優(yōu)點?
四元數(shù)用于表示旋轉(zhuǎn)
A.四元數(shù)一般定義如下:q=w+xi+yj+zk 其中 w,x,y,z 是實數(shù)。同時,有: i*i=-1 j*j=-1 k*k=-1
B.四元數(shù)也可以表示為:q=[w,v] 有多種方式可表示旋轉(zhuǎn),如 axis/angle、歐拉角(Euler angles)、矩陣(matrix)、四元組等。 相對于其它方法,四元組有其本身的優(yōu)點:
a.四元數(shù)不會有歐拉角存在的 gimbal lock 問題[萬向節(jié)死鎖]
b.四元數(shù)由 4 個數(shù)組成,旋轉(zhuǎn)矩陣需要 9 個數(shù)
c.兩個四元數(shù)之間更容易插值
d.四元數(shù)、矩陣在多次運算后會積攢誤差,需要分別對其做規(guī)范化(normalize)和正交化 (orthogonalize),對四元數(shù)規(guī)范化更容易
e.與旋轉(zhuǎn)矩陣類似,兩個四元組相乘可表示兩次旋轉(zhuǎn)
41.向量的點乘、叉乘以及歸一化的意義?
1)點乘描述了兩個向量的相似程度,結(jié)果越大兩向量越相似,還可表示投影
2)叉乘得到的向量垂直于原來的兩個向量
3)標準化向量:用在只關(guān)系方向,不關(guān)心大小的時候
42.矩陣相乘的意義及注意點
用于表示線性變換:旋轉(zhuǎn)、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累
43.alpha blend工作原理
實際顯示顏色=前景顏色*Alpha/255 + 背景顏色*(255-Alpha)/255
44.寫光照計算中的diffuse的計算公式
實際光照強度I=環(huán)境光(Iambient) + 漫反射光(Idiffuse) + 鏡面高光(Ispecular);
環(huán)境光:Iambient= Aintensity* Acolor; (Aintensity表示環(huán)境光強度,Acolor 表示環(huán)境光顏色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;(Dintensity表示漫反射強度,Dcolor 表示漫反射光顏色,N 為該點的法向量,L 為光源向量)
鏡面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;(Sintensity表示鏡面光照強度,Scolor 表示鏡面光顏色,R 為光的反射向量,V 為觀察者向量,n 稱為鏡面光指數(shù))
45.兩種陰影判斷的方法工作原理
陰影由兩部分組成:本影與半影
本影:景物表面上那些沒有被光源直接照射的區(qū)域(全黑的輪廓分明的區(qū)域)
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的區(qū)域(半明半暗區(qū)域)
求陰影區(qū)域的方法:做兩次消隱過程
一次對每個光源進行消隱,求出對于光源而言不可見的區(qū)域L;
一次對視點的位置進行消隱,求出對于視點而言可見的面S;
shadow area = L∩ S
陰影分為兩種:自身陰影和投射陰影
自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設(shè)視點在點光源的位置。
投射陰影:因不透明物體遮擋光線使得場景中位于該物體后面的物體或區(qū)域受不到光照照射而形成的陰影
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然后再按視點位置對場景進行相應(yīng)處理得到所要求的視圖(利用空間換時間,每次只需依據(jù)視點位置進行一次陰影計算即可,省去了一次消隱過程)若是動態(tài)光源此方法就無效了。
46.Vertex Shader是什么?怎么計算?
頂點著色器是一段執(zhí)行在GPU上的程序,用來取代 fixed pipeline 中的 transformation和 lighting,Vertex Shader 主要操作頂點。
Vertex Shader對輸入頂點完成了從 local space 到 homogeneous space(齊次空間)的變換過程,homogeneous space 即 projection space 的下一個 space。在這其間共有 worldtransformation, view transformation 和 projection transformation 及 lighting 幾個過程。
47.什么是渲染管道?
是指在顯示器上為了顯示出圖像而經(jīng)過的一系列必要操作。渲染管道中的很多步驟,都要將幾何物體從一個坐標系中變換到另一個坐標系中去。主要步驟有:
本地坐標->視圖坐標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
48.怎么判斷兩個平面是否相交?不能用碰撞體,說出計算方法
對于兩個平面Ax+By+Cz+D=0與ax+by+cz+d=0,只要(A,B,C)與(a,b,c)不成比例,這兩個平面就是相交的。
49.法線貼圖、CG動畫
A.法線貼圖:是在原物體的凹凸表面的每個點上均作法線,通過 RGB 顏色通道來標記法線的方向, 你可以把它理解成與原凹凸表面平行的另一個不同的表面,但實際上它又只是一個光滑的平面。
B.CG動畫:原為 Computer Graphics 的英文縮寫。隨著以計算機為主要工具進行視覺設(shè)計和生產(chǎn)的一系列相關(guān)產(chǎn)業(yè)的形成,國際上習慣將利用計算機技術(shù)進行視覺設(shè)計和生產(chǎn)的領(lǐng)域通稱為 CG。它既包括技術(shù)也包括藝術(shù),幾乎囊括了當今電腦時代中所有的視覺藝術(shù)創(chuàng)作活動,如平面印刷品的設(shè)計、網(wǎng)頁設(shè)計、三維動畫、影視特效、多媒體技術(shù)、以計算機輔助設(shè)計為主的建筑設(shè)計及工業(yè)造型設(shè)計等。
50.什么是局部坐標,什么是世界坐標?
世界坐標是不會變的,一直以世界坐標軸的XYZ為標準。 局部坐標其實就是自身的坐標,會隨著物體的旋轉(zhuǎn)而變化的。
51.請描述MeshRender中 material 和 shader 的區(qū)別?
Shader(著色器)實際上就是一小段程序,它負責將輸入的 Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出。繪圖單元可以依據(jù)這個輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等,加上對應(yīng)的 Shader,以及對 Shader 的特定的參數(shù)設(shè)置,將這些內(nèi)容(Shader 及輸入?yún)?shù))打包存儲在一起,得到的就是一個 Material(材質(zhì))Shader 大體上可以分為兩類:表面著色器(Surface Shader) 、片段著色器(Fragment Shader)
52.什么是矢量圖
矢量圖:計算機中顯示的圖形一般可以分為兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數(shù)學公式計算獲得的。例如一幅花的矢量圖形實際上是由線段形成外框輪廓, 由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由于矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小。矢量圖形最大的優(yōu)點是無論放大、縮小或旋轉(zhuǎn)等不會失真;最大的缺點是難以表現(xiàn)色彩層次豐富的逼真圖像效果。
53.四元組是什么?
所謂四元數(shù),就是把4個實數(shù)組合起來的東西。4 個元素中,一個是實部,其余 3 個是虛部。
54.你對你的數(shù)學知識感覺如何?比如空間向量,圖形學
個人感覺還是不錯的,空間向量和圖形學之前有自學過。只是在實際工作中直接使用的機會比較少,底層的一些操作有些生疏了。
55.會寫shader么
了解一些,但是寫的不多
56.3D基礎(chǔ)相關(guān)
2 ?1 ?0 ??????1 ?0 ?1
1 ?0 ?1 ??× ??0 ?0 ?0
2 ?1 ?1 ??????1 ?1 ?1
上述兩個矩陣相乘的結(jié)果
2 ??0 ??2
2 ??1 ??2
3 ??1 ??3
57.什么是投影矩陣
投影矩陣是一個典型的縮放和透視矩陣。投影變換將視錐變換成一個直平行六面體的形狀。因為視錐的近處比遠處小,這樣就會對靠近攝像機的對象起到放大的作用,也就將透視應(yīng)用到了場景當中
58.什么是UV
UV坐標是指所有的圖象文件都是二維的一個平面。水平方向是U,垂直方向是V,通過這個平面的,二維的UV坐標系。我們可以定位圖象上的任意一個象素。
59.Cullback,cullfront,culloff區(qū)別
剔除背面、剔除前面、不剔除
60.什么是頂點程序和片段程序
頂點著色器是一組指令代碼,這組指令代碼在頂點被渲染時執(zhí)行。
片段著色器也是在GPU上運行的小程序。它們負責輸出每個呈現(xiàn)的三角形像素的最終像素顏色。基本而言,它的工作原理如下:片段著色器以輸入的形式收到頂點著色器通過管道傳遞的所有這些片段。
61.如何實現(xiàn)以下人物在樹叢中部分透明效果?
Shader "Custom/PlayerDiffuse" {
????Properties {
????????_NotVisibleColor ("NotVisibleColor (RGB)?", Color) = (0.3,0.3,0.3,1)
????????_MainTex ("Base (RGB)?", 2D) = "white"{}
????}
????SubShader {
????????Tags { "Queue"= "Geometry+500""RenderType"="Opaque"}
????????LOD 200
????????Pass {
????????????ZTest Greater
????????????Lighting Off
????????????ZWrite Off
??????????//Color [_NotVisibleColor]
????????????Blend SrcAlpha OneMinusSrcAlpha
????????????SetTexture [_MainTex] { ConstantColor [_NotVisibleColor] combine constant * texture }
????????}
????????Pass {
????????????ZTest LEqual
????????????Material {
????????????????Diffuse (1,1,1,1)
????????????????Ambient (1,1,1,1)
????????????}
????????????Lighting Off
????????????SetTexture [_MainTex] { combine texture }
????????}
????}
????FallBack "Diffuse"
}
62.簡述lightmap的使用
(此為帖子全文,請自己簡述)
Unity完全集成了光照貼圖,可以通過編輯器創(chuàng)建完整的光照貼圖,你完全不用擔心,所有材質(zhì)會自動獲得光照貼圖。光照貼圖的意思是,所有燈光的特性將被直接映射到Beast lightmapper并烘培到紋理,以此獲得更好的性能。UnityPro版擴展了全局光照功能,可以烘焙出真實而漂亮的光照,當然這就不能同時使用實時光照。此外,Unity專業(yè)版帶給你天光和發(fā)光材質(zhì),為你增加更有趣的場景照明。
在此頁中,你會發(fā)現(xiàn)更深入的描述,可以找到在Lightmapping窗口的所有屬性。從菜單中Window – Lightmapping打開Lightmapping窗口。
物體
物體的烘培設(shè)置:燈光、網(wǎng)格渲染和地形-取決于當前的選擇。
網(wǎng)格渲染器和地形:
·Static 靜態(tài)
可渲染網(wǎng)格和地形必須標記為靜態(tài)才能被烘培。
·Scale In Lightmap 光照圖比率
(只作用于可渲染網(wǎng)格)特別大的數(shù)值將分配給可渲染網(wǎng)格更大的分辨率。最終分辨率比例(光照圖縮放)*(物體世界坐標空間所占面積)*全局分辨率烘培設(shè)置)如果設(shè)置為0物體將不被烘培。(但是它依舊對其他的物體有影響)
·Lightmap Size 光照圖大小
(只作用于地形)光照貼圖尺寸是地形實例獨有的屬性,地形將不和其他物體共用圖集。地形光照貼圖將存貯在一個單獨的文件中。
·Atlas 圖集
圖集信息-如果Lock Atlas(鎖定圖集)選項沒有開啟那么這些參數(shù)將自動更新。如果Lock Atlas(鎖定圖集)選項開啟,這些參數(shù)將不會自動編輯。但是你可以手動設(shè)置他們。
·Lightmap Index 光照圖索引
光照貼圖序列中的索引。
·Tiling 平鋪
(只作用于可渲染網(wǎng)格)物體光照貼圖UVs平鋪。
·Offset 偏移
(只作用于可渲染網(wǎng)格)物體UVs的偏移。
Lights燈光:
·Lightmapping 光照貼圖
光照圖模式:僅實時模式,自動模式和僅烘培模式。查看下面Dual Lightmaps的描述。
·Color 顏色
燈光顏色。一些屬性只作用于實時光照。
·Intensity 光強度
燈光照明強度。一些屬性只作用于實時光照。
·Bounce Intensity 反彈強度
特定光源間接光照強度的倍增值。
·Baked Shadows 烘焙陰影
控制當前燈光是否產(chǎn)生陰影。(當選擇自動選項時同時影響實施陰影的產(chǎn)生)
·Shadow Radius 陰影半徑
(只作用于點光源和聚光燈)增加這個值將得到一個較柔和的陰影。增加這個值的大小影響陰影覆蓋面積范圍的計算(不會影響到燈光照射范圍)。
·Shadow Angle 陰影角度
(只影響平行光)增加這個值將會得到一個比較柔和的陰影-增加燈光陰影覆蓋角度范圍的計算。(不會影響到燈光照射范圍)
·Shadow Samples 陰影采樣
如果你將陰影半徑或者角度設(shè)置為大于0的值,增加陰影采樣值能得到一個比較好的結(jié)果。高采樣值將消除半影中中的噪點。
Bake烘焙
全局烘焙設(shè)置。
·Mode 模式
控制離線烘培和實時光照模式。在Dual Lightmaps模式下近端和遠端光照圖都將被烘培;只有延遲光照渲染方式式才能更好的支持雙重光照圖。Single Lightmaps 模式僅烘培遠端光照圖。在延遲渲染方式下也可以強制使用單光照圖模式。
·Use in forward rendering 使用正向渲染
(Dual lightmaps only)在正向渲染中啟用dual lightmaps。要注意的是這需要你創(chuàng)建自己的shader來達到目的。
·Quality 質(zhì)量
高質(zhì)量(比較好的效果)和低質(zhì)量(計算速度快)的預設(shè)值。它們將影響最終聚集光線數(shù)量和對比度的數(shù)值以及其他有關(guān)最終聚集和抗鋸齒的設(shè)置。
·Bounces 反彈
控制全局光照模擬中光線反彈的次數(shù)。如果想得到一個比較柔和的相對真實的光照至少需要將此數(shù)值設(shè)置為1.如果設(shè)置為0那么只會計算直接光照。
·Sky Light Color 天光顏色
天光是模擬從天球向所有方向發(fā)射光線照射場景-在烘培室外場景的時候開啟天光將得到一個非常好的效果。
·Sky Light Intensity 天光強度
天光的強度- 0代表禁用天光。
·Bounce Boost 反彈增強
增強間接光,可用來增加場景中渲染太快沒有烘焙出燈光的反彈量。
·Bounce Intensity 反彈強度
間接光照的強度倍增器。
·Final Gather Rays 最終聚集光線
控制從最終聚集點發(fā)射的光線數(shù)量-較高的數(shù)值能得到更好的效果 。
·Contrast Threshold
對比度閾值
顏色對比度根據(jù)采樣運算規(guī)則控制哪些最終聚集點被創(chuàng)建。較高的數(shù)值可以使Beast處理物體表面燈光照明時有很大的改善,從而得到一張平滑的光照貼圖但是會犧牲一些照明細節(jié)。較低的數(shù)值需要最終聚集光線數(shù)量要高于對比度閾值這樣被過濾掉的最終聚集點才能被創(chuàng)建出來。
·Interpolation 插值
控制最終聚集點顏色的插值。設(shè)置0為線性插值,設(shè)置1為基于梯度的高級插值。多數(shù)情況下推薦使用后者。
·Interpolation Points 插值點
設(shè)置最終聚集點顏色的插值的參考點。高數(shù)值可以獲得比較平滑的結(jié)果,但是會犧牲一些光照細節(jié)。
·Ambient Occlusion
環(huán)境光遮擋
烘培光照圖時產(chǎn)生一定數(shù)量的環(huán)境阻光。環(huán)境阻光計算物體每一點被一定距離內(nèi)的其他物體或者一定距離內(nèi)自身物體的遮擋程度(用來模擬物體表面環(huán)境光及陰影覆蓋的比例,達到全局光照的效果),所以和所有的燈光設(shè)置沒有太大關(guān)系。
·Max Distance 最大距離
Beyond this distance a ray is considered to be unoccluded. 0 stands for infinitely long rays.
超出這個距離的光線將不被遮擋。0表示無限長的光線。
·Contrast 對比度
控制完全阻光和不阻光之間的過度。
·Lock Atlas 鎖定圖集
當鎖定圖集被打開。自動圖集功能將不執(zhí)行,物體光照圖索引,平鋪和偏移將不能編輯。
·Resolution 分辨率
每世界單位中光照圖分辨率的大小。因此當設(shè)置分辨率為50的一個10單位乘以10單位的平面將產(chǎn)生一張500*500像素的光照貼圖。
Maps貼圖所有光照貼圖的可編輯數(shù)組。
·Compressed 壓縮
控制是否壓縮所有當前場景中的光照貼圖。
·Array Size 數(shù)組大小
光照貼圖數(shù)組的大?。?~254)。
·Lightmaps Array 光照貼圖數(shù)組
當前場景被烘培的所有光照圖的可編輯序列。沒有被指定的通道將被處理為黑色光照圖。索引相當于網(wǎng)格渲染和地形中所使用的光照圖編號。除非鎖定圖集被開啟否則序列將自動初始化并分配給你烘培的貼圖。
Lightmap Display光照貼圖顯示
在編輯器中控制光照圖如何顯示的工具。光照圖顯示是在場景視口中的一個子窗口。可見只要光照圖窗口可見。
·Use Lightmaps 使用光照貼圖
是否渲染光照圖。
·Shadow Distance 陰影距離
根據(jù)過度到只使用遠端光照圖時哪些設(shè)置為自動模式的燈光被關(guān)閉的距離。這里的設(shè)置覆蓋其他面板中相關(guān)設(shè)置。但是不能覆蓋質(zhì)量設(shè)置中的陰影距離設(shè)置。
·Show Resolution 顯示分辨率
切換在場景中是否顯示光照圖分辨率。開啟這項設(shè)置你可以在你的場景中直接預覽靜態(tài)物體光照圖的分辨率大小。
Details細節(jié)
Dual Lightmaps雙重光照貼圖
雙光照貼圖是Unity中的光照貼圖可以同高光貼圖,法線貼圖和適當混合的實時陰影一起渲染的工具。同時它也可以讓你的光照貼圖看起來效果更好,即使設(shè)置的光照分辨率較低。
雙光照貼圖默認情況下只能用于延遲光照渲染路徑。但通過編寫自定義著色器就可能讓雙光照貼圖用于前向渲染路徑中(使用dualforward表面著色指令)。
雙光照貼圖即意為使用兩套光照貼圖:
·遠 :包含全部照明
·近 :包含標記為自動模式的燈光所產(chǎn)生的的間接照明,和標記為僅烘焙模式的燈光,發(fā)光材質(zhì)和天光的所有照明。
設(shè)置為僅實時的燈光永遠不會被烘培。近端光照圖作用于質(zhì)量設(shè)置中的相對攝像機最小陰影距離范圍內(nèi)。
在這個距離范圍內(nèi),自動模式的燈光將實時渲染高光,凹凸和陰影,(它們的陰影與實時模式的等光的陰影融為一體),間接光則來自近端光照貼圖。若超出陰影距離自動模式燈光就不再進行實時渲染,而全部照明都由光照貼圖產(chǎn)生(僅實時模式燈光仍然產(chǎn)生照明,但不產(chǎn)生陰影)。
下面的場景包含一個默認設(shè)置為為自動模式的平行光,一些烘培完光照貼圖的靜態(tài)物體(建筑物,障礙物,其他靜態(tài)物體)和一些動態(tài)的移動或可移動物體(持槍的假人,桶)。該場景在雙重光照貼圖模式中烘焙和渲染:陰影距離以外的建筑物完全由光照貼圖產(chǎn)生照明,而兩個假人由實時燈光產(chǎn)生動態(tài)光照,但是不投射陰影;陰影距離范圍內(nèi)的建筑物和地面被即時光照亮并投下實時陰影,但柔和的間接光是來自于近端光照貼圖產(chǎn)生。
63.Shader的代碼實現(xiàn)?大概寫一下
Shader "Custom/NewSurfaceShader"{
Properties {
????????_Color ("Color", Color) = (1,1,1,1)
?? ??_MainTex ("Albedo (RGB)?", 2D) = "white"?{}
?? ??_Glossiness ("Smoothness", Range(0,1)) = 0.5
?? ??_Metallic ("Metallic", Range(0,1)) = 0.0
????}
????SubShader {
????????Tags { "RenderType"="Opaque"?}
????????LOD 200
????????CGPROGRAM
????????// Physically based Standard lighting model, and enable shadows on all light types
????????#pragma surface surf Standard fullforwardshadows
????????// Use shader model 3.0 target, to get nicer looking lighting
????????#pragma target 3.0
????????sampler2D _MainTex;
????????struct Input {
????????????float2 uv_MainTex;
????????};
????????half _Glossiness;
????????half _Metallic;
????????fixed4 _Color;
????????void surf (Input IN, inout SurfaceOutputStandard o) {
????????????// Albedo comes from a texture tinted by color
????????????fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
????????????o.Albedo = c.rgb;
????????????// Metallic and smoothness come from slider variables
????????????o.Metallic = _Metallic;
????????????o.Smoothness = _Glossiness;
????????????o.Alpha = c.a;
?????????}
?????????ENDCG
????}
????FallBack "Diffuse"
}
64.游戲中要怎么實現(xiàn)矩陣相乘?
//矩陣相乘
????public static float[][] Mul(float[][] a, float[][] b) {
//確保矩陣a的列數(shù)和b的行數(shù)相等
????????if(a[0].length != b.length) {
????????????return null;
????????}
//用來存放結(jié)果的矩陣,axb的結(jié)果為a的行數(shù)和b的列數(shù)
????????float[][] result = new float[a.length][b[0].length];
//對a的每行進行遍歷
????????for(int i=0; i
//對b的每列進行遍歷
????????????for(int j=0;j
//c為每一個點的值
????????????????float c = 0;
//第i行j列的值為a的第i行上的n個數(shù)和b的第j列上的n個數(shù)對應(yīng)相乘之和,其中n為a的列數(shù),也是b的行數(shù),a的列數(shù)和b的行數(shù)相等
????????????????for(int k=0; k
????????????????????c += (a[i][k]*b[k][j]);
????????????????}
????????????????result[i][j] = c;
????????????}
????????}
????????return result;
}