服務(wù)器數(shù)據(jù)庫等雜項(xiàng)
1.Unity連接數(shù)據(jù)庫
需要得到Mono.Data.Sqlite.dll文件與 System.Data.dll 文件
2.如何與服務(wù)器交互
做游戲冰评,基本上都避免不了與服務(wù)器端交互甲雅,與服務(wù)器端交互的方式也有幾種抛人,總結(jié)起來就是長連接模式(Socket)與短鏈接模式(Http)。
3.如何處理網(wǎng)絡(luò)異常下的可玩性
1)為游戲增加單機(jī)模式:比如故事模塊绝页,網(wǎng)絡(luò)異常時(shí)可以閱讀游戲的故事抒寂;豐富的技能或卡牌屈芜,網(wǎng)絡(luò)異常時(shí)可以了解技能和卡牌井佑;提供單機(jī)玩法,玩家可以與AI進(jìn)行游戲等盒发。
2)為游戲提供教程模塊宁舰,網(wǎng)絡(luò)異常時(shí)可以學(xué)習(xí)游戲技巧蛮艰。
4.怎樣反外掛即寡?對外掛的看法
游戲外掛的原理:外掛分為多種聪富,比如模擬鍵盤的善涨,鼠標(biāo)的钢拧;修改數(shù)據(jù)包的;修改本地內(nèi)存的膜钓。
1)對于模擬用戶的鼠標(biāo)鍵盤輸入的外掛颂斜,我們可以用網(wǎng)頁上常用的驗(yàn)證碼的方式來對付沃疮。模擬鍵盤鼠標(biāo)的外掛對游戲的影響比加速、修改封包俊啼、修改內(nèi)存授帕、脫機(jī)等要小得多泉手,因此被一些人稱為綠色外掛。
2)讓服務(wù)器不把在正常情況下玩家看不到的東西的數(shù)據(jù)傳送給客戶端屏轰。
3)把玩家操作記錄發(fā)到服務(wù)器進(jìn)行模擬,如果和客戶端的計(jì)算結(jié)果偏差較大可以認(rèn)為作弊唁盏。
5.你對跨平臺的了解厘擂。
跨平臺就是在一個(gè)熟悉的平臺上面開發(fā)的軟件或者程序,直接可以在其他平臺上正常的運(yùn)行顯示而不需要對其原始文件或者原始代碼進(jìn)行修改舞萄。
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。能做咒精,只是這方面之前在公司沒怎么負(fù)責(zé)這塊模叙,有些生疏,稍微熟悉一下就能做渠啊。
8.了解代碼管理么昭抒?在開發(fā)中使用什么代碼管理工具?使用的接口多一點(diǎn)還是繼承多一點(diǎn)熙含?
了解。使用SVN進(jìn)行代碼管理蚓聘。接口多一點(diǎn)夜牡。
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í)際的數(shù)據(jù)傳輸開始前船万,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法舱呻、交換加密密鑰等初始化協(xié)商功能。
SSH是英文Secure Shell的簡寫形式茬高。通過使用SSH,你可以把所有傳輸?shù)臄?shù)據(jù)進(jìn)行加密熏瞄,這樣”中間人”這種攻擊方式就不可能實(shí)現(xiàn)了,而且也能夠防止DNS欺騙和IP欺騙蛉签。使用SSH胡陪,還有一個(gè)額外的好處就是傳輸?shù)臄?shù)據(jù)是經(jīng)過壓縮的,所以可以加快傳輸?shù)乃俣劝帷SH有很多功能柠座,它既可以代替Telnet,又可以為FTP片橡、Pop、甚至為PPP提供一個(gè)安全的”通道”。
10.原公司服務(wù)器怎么實(shí)現(xiàn)多人在線吹泡?
使用socket基于TCP協(xié)議開發(fā)的多人在線骤星。公司有自行開發(fā)的服務(wù)端程序
11.項(xiàng)目問題,和美工想法沖突了怎么辦爆哑?
找項(xiàng)目主管協(xié)調(diào)處理
12.對unity的理解
可以做VR洞难、手游、工藝仿真揭朝、端游队贱、頁游跨平臺的游戲引擎
13.面試題:VR相關(guān)問題用了哪些設(shè)備?接入了哪些SDK潭袱?根據(jù)項(xiàng)目問如何實(shí)現(xiàn)手勢控制柱嫌?
htc vive和oculus, htc vive用到的是steam vr 免費(fèi)插件屯换,Oculus早期有SDK编丘,現(xiàn)在Unity原生支持
14.開過什么平臺?多線程的理解
PC趟径、Android瘪吏。
多線程是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計(jì)算機(jī)因有硬件支持而能夠在同一時(shí)間執(zhí)行多于一個(gè)線程蜗巧,進(jìn)而提升整體處理性能。
使用線程可以把占據(jù)時(shí)間長的程序中的任務(wù)放到后臺去處理
·用戶界面可以更加吸引人蕾盯,這樣比如用戶點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理幕屹,可以彈出一個(gè)進(jìn)度條來顯示處理的進(jìn)度
·程序的運(yùn)行速度可能加快
·在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等级遭,線程就比較有用了望拖。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。
15.怎樣實(shí)現(xiàn)植物的彎曲
1挫鸽、max做骨骼動畫
2说敏、修改Tree組件的Growth Angle的值
16.用過什么游戲框架?
SimpleFramework,基于ulua的框架丢郊,支持ugui和ngui的熱更新
17.模型導(dǎo)入U(xiǎn)nity后怎么與數(shù)據(jù)庫產(chǎn)生聯(lián)系盔沫?類似打通程序和數(shù)據(jù)庫通道
例如mysql數(shù)據(jù)庫,需要導(dǎo)入兩個(gè)文件枫匾,就可以通過sql語句往數(shù)據(jù)庫寫數(shù)據(jù)架诞,數(shù)據(jù)可以是模型信息
18.用過什么傳輸協(xié)議,用什么語言
http干茉,tcp(socket) 都是C# 語言編寫
19.都在什么平臺上開發(fā)過游戲或軟件用的什么框架
Android
20.會寫框架么
設(shè)計(jì)模式了解一些谴忧,但是沒寫過框架
21.請簡述在客戶端開發(fā)方面你最擅長的模塊系統(tǒng),以及你覺得哪些模塊會出現(xiàn)的問題
擅長UI模塊的制作,我認(rèn)為熱更新模塊會出現(xiàn)問題沾谓,比如資源依賴不合理委造,導(dǎo)致資源包過大
22.如何實(shí)現(xiàn)背包系統(tǒng)、寵物系統(tǒng)均驶、裝備系統(tǒng)的實(shí)時(shí)更新昏兆?
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)是每個(gè)程序員都要會一點(diǎn)的继蜡。鏈表、列表逛腿、散列表最常用稀并,隊(duì)列和棧也經(jīng)常使用。二叉樹偶爾使用单默。
25.什么是狀態(tài)機(jī)碘举,什么是行為樹
有限狀態(tài)機(jī)系統(tǒng):是指在不同階段會呈現(xiàn)出不同的運(yùn)行狀態(tài)的系統(tǒng),這些狀態(tài)是有限的搁廓、不重疊的引颈。這樣的系統(tǒng)在某一時(shí)刻一定會處于其所有狀態(tài)中的一個(gè)狀態(tài),此時(shí)它接收一部分允許的輸入境蜕,產(chǎn)生一部分可能的響應(yīng)蝙场,并且遷移到一部分可能的狀態(tài)。
1.基本節(jié)點(diǎn)是狀態(tài):他包含了一系列運(yùn)行在該狀態(tài)的行為以及離開這個(gè)狀態(tài)的條件粱年。
2.狀態(tài)可以任意跳轉(zhuǎn),實(shí)現(xiàn)簡單,但是對于大的狀態(tài)機(jī)很難維護(hù).狀態(tài)邏輯的重用性低.
3.每一個(gè)狀態(tài)的邏輯會隨著一些新狀態(tài)的增加而越來越復(fù)雜售滤。維持狀態(tài)的數(shù)量和狀態(tài)邏輯復(fù)雜性是一個(gè)很大的難點(diǎn)。需要合理的分割以及重用狀態(tài)台诗。
4.狀態(tài)機(jī)狀態(tài)的復(fù)用性很差完箩,一旦一些因素變化導(dǎo)致這個(gè)環(huán)境發(fā)生變化。你只能新增一個(gè)狀態(tài)拉庶,并且給這個(gè)新狀態(tài)添加連接他以及其他狀態(tài)的跳轉(zhuǎn)邏輯嗜憔。
5.狀態(tài)機(jī)的跳轉(zhuǎn)條件一旦不滿足,就會一直卡在某一個(gè)狀態(tài)氏仗。
行為樹:一個(gè)流行的AI技術(shù)吉捶,涵蓋了層次狀態(tài)機(jī)夺鲜,事件調(diào)度,事件計(jì)劃呐舔,行為等一系列技術(shù)币励。
1.高度模塊化狀態(tài),去掉狀態(tài)中的跳轉(zhuǎn)邏輯珊拼,使得狀態(tài)變成一個(gè)“行為”食呻。
2. “行為”和”行為”之間的跳轉(zhuǎn)是通過父節(jié)點(diǎn)的類型來決定的。比如并行處理兩個(gè)行為澎现,在狀態(tài)機(jī)里面無法同時(shí)處理兩個(gè)狀態(tài)仅胞。
3.通過增加控制節(jié)點(diǎn)的類型,可以達(dá)到復(fù)用行為的目的剑辫。
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ù)存儲的产园,所以它的索引速度非成桶耄快,而且賦值與修改元素也很簡單淆两。
數(shù)組存在一些不足的地方。在數(shù)組的兩個(gè)數(shù)據(jù)間插入數(shù)據(jù)是很麻煩的拂酣,而且在聲明數(shù)組的時(shí)候必須指定數(shù)組的長度秋冰,數(shù)組的長度過長,會造成內(nèi)存浪費(fèi)婶熬,過段會造成數(shù)據(jù)溢出的錯(cuò)誤剑勾。如果在聲明數(shù)組時(shí)我們不清楚數(shù)組的長度,就會變得很麻煩赵颅。
List是集合虽另,集合元素的數(shù)量可以動態(tài)變化。增加饺谬、插入捂刺、刪除元素很方便。
28.數(shù)據(jù)結(jié)構(gòu)的看法
具有一定關(guān)系的數(shù)據(jù)元素集合,好的數(shù)據(jù)結(jié)構(gòu)有利于簡化算法的編寫
29.深度優(yōu)化會么
會一點(diǎn)族展,比如在代碼消耗上經(jīng)常使用StopWatch類去優(yōu)化算法森缠,通常用IDisposable去顯式的釋放資源。
30.實(shí)現(xiàn)二分要什么條件
有序結(jié)構(gòu)
31.c++仪缸,socket網(wǎng)絡(luò)編程會不會
C++上學(xué)的時(shí)候?qū)W過贵涵,工作之后一直沒用過。
Socket就是一套實(shí)現(xiàn)雙向通信的API恰画。使用過C#的TCP(面向連接宾茂、可靠)和UDP連接(面向非連接、不可靠)
32.二叉樹的所有遍歷方式的原理及優(yōu)缺點(diǎn)
前序遍歷拴还,先訪問根節(jié)點(diǎn)在訪問左節(jié)點(diǎn)在訪問右節(jié)點(diǎn)跨晴。
中序遍歷,先訪問左節(jié)點(diǎn)在訪問根節(jié)點(diǎn)在訪問右節(jié)點(diǎn)自沧。
后序遍歷坟奥,先訪問左節(jié)點(diǎn)在訪問右節(jié)點(diǎn)在訪問根節(jié)點(diǎn)。
前中后代表的是訪問根節(jié)點(diǎn)的時(shí)序拇厢。
這一點(diǎn)上沒有什么本質(zhì)上的優(yōu)缺點(diǎn)爱谁,要看實(shí)際需求決定采用何種遍歷方式
采用遞歸方式和非遞歸方式。前者優(yōu)點(diǎn)是直觀孝偎,編寫起來簡單访敌,缺點(diǎn)是但其開銷也比較大。非遞歸形式開銷小衣盾,但編寫復(fù)雜寺旺。
33.數(shù)據(jù)結(jié)構(gòu)中數(shù)組和鏈表各有什么特點(diǎn),什么場合下應(yīng)該使用數(shù)組势决,什么場合下應(yīng)該使用鏈表
二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
從邏輯結(jié)構(gòu)來看
1.數(shù)組必須事先定義固定的長度(元素個(gè)數(shù))阻塑,不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況。當(dāng)數(shù)據(jù)增加時(shí),可能超出原先定義的元素個(gè)數(shù);當(dāng)數(shù)據(jù)減少時(shí)汗捡,造成內(nèi)存浪費(fèi);數(shù)組可以根據(jù)下標(biāo)直接存取走搁。
2.鏈表動態(tài)地進(jìn)行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況迈窟,且可以方便地插入私植、刪除數(shù)據(jù)項(xiàng)。(數(shù)組中插入车酣、刪除數(shù)據(jù)項(xiàng)時(shí)曲稼,需要移動其它數(shù)據(jù)項(xiàng)索绪,非常繁瑣)鏈表必須根據(jù)next指針找到下一個(gè)元素
從內(nèi)存存儲來看
1. (靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但是自由度小
2.鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩
從上面的比較可以看出,如果需要快速訪問數(shù)據(jù)躯肌,很少或不插入和刪除元素者春,就應(yīng)該用數(shù)組;相反清女,如果需要經(jīng)常插入和刪除元素就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了钱烟。
設(shè)計(jì)模式相關(guān)
34.用過哪些設(shè)計(jì)模式?談?wù)勛约罕容^熟悉的設(shè)計(jì)模式
1嫡丙、工廠模式2拴袭、代理模式3、策略模式4曙博、觀察者模式6拥刻、單例模式
工廠模式:
簡單工廠模式解決的問題是如何去實(shí)例化一個(gè)合適的對象。
簡單工廠模式的核心思想就是:有一個(gè)專門的類來負(fù)責(zé)創(chuàng)建實(shí)例的過程父泳。凡是出現(xiàn)了大量的產(chǎn)品需要?jiǎng)?chuàng)建般哼,并且具有共同的接口時(shí),可以通過工廠方法模式進(jìn)行創(chuàng)建惠窄。比如說寫技能是一系列類蒸眠,那么就可以使用工廠模式創(chuàng)建。
代理模式:一個(gè)是真正的你要訪問的對象(目標(biāo)類)杆融,一個(gè)是代理對象,真正對象與代理對象實(shí)現(xiàn)同一個(gè)接口,先訪問代理類再訪問真正要訪問的對象楞卡。
代理模式就是多一個(gè)代理類出來,替原對象進(jìn)行一些操作脾歇,比如我們在租房子的時(shí)候回去找中介蒋腮,為什么呢?因?yàn)槟銓υ摰貐^(qū)房屋的信息掌握的不夠全面藕各,希望找一個(gè)更熟悉的人去幫你做池摧,此處的代理就是這個(gè)意思。再如我們有的時(shí)候打官司激况,我們需要請律師险绘,因?yàn)槁蓭熢诜煞矫嬗袑iL,可以替我們進(jìn)行操作誉碴,表達(dá)我們的想法。
代理模式的應(yīng)用場景:
如果已有的方法在使用的時(shí)候需要對原有的方法進(jìn)行改進(jìn)瓣距,此時(shí)有兩種辦法:
1黔帕、修改原有的方法來適應(yīng)。這樣違反了“對擴(kuò)展開放蹈丸,對修改關(guān)閉”的原則成黄。
2呐芥、就是采用一個(gè)代理類調(diào)用原有的方法,且對產(chǎn)生的結(jié)果進(jìn)行控制奋岁。這種方法就是代理模式思瘟。
使用代理模式,可以將功能劃分的更加清晰闻伶,有助于后期維護(hù)滨攻!
策略模式:定義一系列算法,并將每個(gè)算法封裝起來蓝翰,使他們可以相互替換光绕,且算法的變化不會影響到使用算法的客戶。策略模式的決定權(quán)在用戶畜份,系統(tǒng)本身提供不同算法的實(shí)現(xiàn)诞帐,新增或者刪除算法,對各種算法做封裝爆雹。因此停蕉,策略模式多用在算法決策系統(tǒng)中,外部用戶只需要決定用哪個(gè)算法即可钙态。
觀察者模式很好理解慧起,類似于郵件訂閱和RSS訂閱,當(dāng)我們?yōu)g覽一些博客或wiki時(shí)驯绎,經(jīng)常會看到RSS圖標(biāo)完慧,就這的意思是,當(dāng)你訂閱了該文章剩失,如果后續(xù)有更新屈尼,會及時(shí)通知你。其實(shí)拴孤,簡單來講就一句話:當(dāng)一個(gè)對象變化時(shí)脾歧,其它依賴該對象的對象都會收到通知,并且隨著變化演熟!對象之間是一種一對多的關(guān)系鞭执。
單例對象(Singleton)是一種常用的設(shè)計(jì)模式。在C#應(yīng)用中芒粹,單例對象能保證在一個(gè)CLR中兄纺,該對象只有一個(gè)實(shí)例存在。這樣的模式有幾個(gè)好處:
1化漆、某些類創(chuàng)建比較頻繁估脆,對于一些大型的對象,這是一筆很大的系統(tǒng)開銷座云。
2疙赠、省去了new操作符付材,降低了系統(tǒng)內(nèi)存的使用頻率,減輕GC壓力圃阳。
3厌衔、有些類如交易所的核心交易引擎,控制著交易流程捍岳,如果該類可以創(chuàng)建多個(gè)的話富寿,系統(tǒng)完全亂了。(比如一個(gè)軍隊(duì)出現(xiàn)了多個(gè)司令員同時(shí)指揮祟同,肯定會亂成一團(tuán))作喘,所以只有使用單例模式,才能保證核心交易服務(wù)器獨(dú)立控制整個(gè)流程晕城。
35.請說出4種面向?qū)ο蟮脑O(shè)計(jì)原則泞坦,并分別簡述它們的含義。
[if !supportLists]1)?[endif]單一職責(zé)原則(The Single Responsiblity Principle砖顷,簡稱
SRP):一個(gè)類贰锁,最好只做一件事,只有一個(gè)引起它的變化.
[if !supportLists]2)?[endif]開放-封閉原則(The Open-Close Principle滤蝠,簡稱
OCP):對于擴(kuò)展是開放的豌熄,對于更改是封閉的
[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):使用多個(gè)小的專門的接口锣险,而不要使用一個(gè)大的總接口。
36.設(shè)計(jì)一個(gè)狀態(tài)機(jī)類型览闰,狀態(tài)值為int類型芯肤,要求:
擁有接口,獲取當(dāng)前狀態(tài)压鉴,切換狀態(tài)
外部可以監(jiān)聽狀態(tài)切換事件崖咨,參數(shù)為切換前狀態(tài)和切換后狀態(tài)(使用delete和event)//定義一個(gè)狀態(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);
}
//定義一個(gè)狀態(tài)切換事件
public abstract class IEvent?{
????public int code;
????public IEvent(int code) {
????????this.code = code;
}
????public int GetCode(){
????????return code;
}
//當(dāng)前狀態(tài)事件檢測
????public abstract bool Check();
}
public class AvatarStateMachine{
? //初始化狀態(tài)機(jī)
? public void InitStateMachine(){}
? //注冊一個(gè)狀態(tài)
? public void AddAction(int action) {}
? //注冊一個(gè)狀態(tài)切換事件
? public void AddEventTransition(int fromAction, int toAction, IEvent byEvent) {}
? //更新當(dāng)前狀態(tài),檢測能否進(jìn)入下一個(gè)狀態(tài)
? public void UpdateStateMachine(){}
? //強(qiáng)行切換狀態(tài)
? public void SwitchTo(int toState) {}
}
37.如何處理unity中界面資源油吭,界面邏輯以及功能模塊三者之間耦合關(guān)系
這就是在Unity使用MVC時(shí)通常將功能模塊盡量脫離脫離MonoBehavior击蹲,同一個(gè)模塊內(nèi)M只用來操作數(shù)據(jù)并發(fā)送更新消息,V只用來接受消息并控制界面顯示跳轉(zhuǎn)婉宰,使用C來處理界面與數(shù)據(jù)的頻繁操作歌豺。
38.觀察者模式的深入理解?
觀察者模式:一對多的關(guān)系心包,當(dāng)被觀察這發(fā)生改變時(shí)會通知所有觀察者世曾。讓雙方都依賴于抽象,使得各自變化不會影響另一方。
39.MVC模式
用一種業(yè)務(wù)邏輯轮听、數(shù)據(jù)、界面顯示分離的方法組織代碼岭佳,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面血巍,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫業(yè)務(wù)邏輯珊随。
圖形學(xué)相關(guān)
40..簡述四元數(shù)的作用述寡,四元數(shù)對歐拉角的優(yōu)點(diǎn)?
四元數(shù)用于表示旋轉(zhuǎn)
A.四元數(shù)一般定義如下:q=w+xi+yj+zk 其中 w,x,y,z 是實(shí)數(shù)叶洞。同時(shí)鲫凶,有: i*i=-1 j*j=-1 k*k=-1
B.四元數(shù)也可以表示為:q=[w,v] 有多種方式可表示旋轉(zhuǎn),如 axis/angle衩辟、歐拉角(Euler angles)螟炫、矩陣(matrix)、四元組等艺晴。 相對于其它方法昼钻,四元組有其本身的優(yōu)點(diǎn):
a.四元數(shù)不會有歐拉角存在的 gimbal lock 問題[萬向節(jié)死鎖]
b.四元數(shù)由 4 個(gè)數(shù)組成,旋轉(zhuǎn)矩陣需要 9 個(gè)數(shù)
c.兩個(gè)四元數(shù)之間更容易插值
d.四元數(shù)封寞、矩陣在多次運(yùn)算后會積攢誤差然评,需要分別對其做規(guī)范化(normalize)和正交化 (orthogonalize),對四元數(shù)規(guī)范化更容易
e.與旋轉(zhuǎn)矩陣類似狈究,兩個(gè)四元組相乘可表示兩次旋轉(zhuǎn)
41.向量的點(diǎn)乘碗淌、叉乘以及歸一化的意義?
1)點(diǎn)乘描述了兩個(gè)向量的相似程度抖锥,結(jié)果越大兩向量越相似亿眠,還可表示投影
2)叉乘得到的向量垂直于原來的兩個(gè)向量
3)標(biāo)準(zhǔn)化向量:用在只關(guān)系方向,不關(guān)心大小的時(shí)候
42.矩陣相乘的意義及注意點(diǎn)
用于表示線性變換:旋轉(zhuǎn)宁改、縮放缕探、投影、平移还蹲、仿射
注意矩陣的蠕變:誤差的積累
43.alpha blend工作原理
實(shí)際顯示顏色=前景顏色*Alpha/255 + 背景顏色*(255-Alpha)/255
44.寫光照計(jì)算中的diffuse的計(jì)算公式
實(shí)際光照強(qiáng)度I=環(huán)境光(Iambient) + 漫反射光(Idiffuse) + 鏡面高光(Ispecular);
環(huán)境光:Iambient= Aintensity* Acolor; (Aintensity表示環(huán)境光強(qiáng)度爹耗,Acolor 表示環(huán)境光顏色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;(Dintensity表示漫反射強(qiáng)度,Dcolor 表示漫反射光顏色谜喊,N 為該點(diǎn)的法向量潭兽,L 為光源向量)
鏡面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;(Sintensity表示鏡面光照強(qiáng)度,Scolor 表示鏡面光顏色斗遏,R 為光的反射向量山卦,V 為觀察者向量,n 稱為鏡面光指數(shù))
45.兩種陰影判斷的方法工作原理
陰影由兩部分組成:本影與半影
本影:景物表面上那些沒有被光源直接照射的區(qū)域(全黑的輪廓分明的區(qū)域)
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的區(qū)域(半明半暗區(qū)域)
求陰影區(qū)域的方法:做兩次消隱過程
一次對每個(gè)光源進(jìn)行消隱诵次,求出對于光源而言不可見的區(qū)域L账蓉;
一次對視點(diǎn)的位置進(jìn)行消隱枚碗,求出對于視點(diǎn)而言可見的面S;
shadow area = L∩ S
陰影分為兩種:自身陰影和投射陰影
自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出铸本,即假設(shè)視點(diǎn)在點(diǎn)光源的位置肮雨。
投射陰影:因不透明物體遮擋光線使得場景中位于該物體后面的物體或區(qū)域受不到光照照射而形成的陰影
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面箱玷,再將這些投影面與場景中的其他平面求交得出陰影多邊形怨规,保存這些陰影多邊形信息,然后再按視點(diǎn)位置對場景進(jìn)行相應(yīng)處理得到所要求的視圖(利用空間換時(shí)間锡足,每次只需依據(jù)視點(diǎn)位置進(jìn)行一次陰影計(jì)算即可波丰,省去了一次消隱過程)若是動態(tài)光源此方法就無效了。
46.Vertex Shader是什么舶得?怎么計(jì)算掰烟?
頂點(diǎn)著色器是一段執(zhí)行在GPU上的程序,用來取代 fixed pipeline 中的 transformation和 lighting扩灯,Vertex Shader 主要操作頂點(diǎn)媚赖。
Vertex Shader對輸入頂點(diǎn)完成了從 local space 到 homogeneous space(齊次空間)的變換過程,homogeneous space 即 projection space 的下一個(gè) space珠插。在這其間共有 worldtransformation, view transformation 和 projection transformation 及 lighting 幾個(gè)過程惧磺。
47.什么是渲染管道?
是指在顯示器上為了顯示出圖像而經(jīng)過的一系列必要操作捻撑。渲染管道中的很多步驟磨隘,都要將幾何物體從一個(gè)坐標(biāo)系中變換到另一個(gè)坐標(biāo)系中去。主要步驟有:
本地坐標(biāo)->視圖坐標(biāo)->背面裁剪->光照->裁剪->投影->視圖變換->光柵化顾患。
48.怎么判斷兩個(gè)平面是否相交?不能用碰撞體,說出計(jì)算方法
對于兩個(gè)平面Ax+By+Cz+D=0與ax+by+cz+d=0番捂,只要(A,B,C)與(a,b,c)不成比例,這兩個(gè)平面就是相交的江解。
49.法線貼圖设预、CG動畫
A.法線貼圖:是在原物體的凹凸表面的每個(gè)點(diǎn)上均作法線,通過 RGB 顏色通道來標(biāo)記法線的方向犁河, 你可以把它理解成與原凹凸表面平行的另一個(gè)不同的表面鳖枕,但實(shí)際上它又只是一個(gè)光滑的平面。
B.CG動畫:原為 Computer Graphics 的英文縮寫桨螺。隨著以計(jì)算機(jī)為主要工具進(jìn)行視覺設(shè)計(jì)和生產(chǎn)的一系列相關(guān)產(chǎn)業(yè)的形成,國際上習(xí)慣將利用計(jì)算機(jī)技術(shù)進(jìn)行視覺設(shè)計(jì)和生產(chǎn)的領(lǐng)域通稱為 CG宾符。它既包括技術(shù)也包括藝術(shù),幾乎囊括了當(dāng)今電腦時(shí)代中所有的視覺藝術(shù)創(chuàng)作活動灭翔,如平面印刷品的設(shè)計(jì)魏烫、網(wǎng)頁設(shè)計(jì)、三維動畫、影視特效哄褒、多媒體技術(shù)稀蟋、以計(jì)算機(jī)輔助設(shè)計(jì)為主的建筑設(shè)計(jì)及工業(yè)造型設(shè)計(jì)等。
50.什么是局部坐標(biāo)呐赡,什么是世界坐標(biāo)糊治?
世界坐標(biāo)是不會變的,一直以世界坐標(biāo)軸的XYZ為標(biāo)準(zhǔn)罚舱。 局部坐標(biāo)其實(shí)就是自身的坐標(biāo),會隨著物體的旋轉(zhuǎn)而變化的绎谦。
51.請描述MeshRender中 material 和 shader 的區(qū)別管闷?
Shader(著色器)實(shí)際上就是一小段程序,它負(fù)責(zé)將輸入的 Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或者顏色等組合作用窃肠,然后輸出包个。繪圖單元可以依據(jù)這個(gè)輸出來將圖像繪制到屏幕上。輸入的貼圖或者顏色等冤留,加上對應(yīng)的 Shader碧囊,以及對 Shader 的特定的參數(shù)設(shè)置,將這些內(nèi)容(Shader 及輸入?yún)?shù))打包存儲在一起纤怒,得到的就是一個(gè) Material(材質(zhì))Shader 大體上可以分為兩類:表面著色器(Surface Shader) 糯而、片段著色器(Fragment Shader)
52.什么是矢量圖
矢量圖:計(jì)算機(jī)中顯示的圖形一般可以分為兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形泊窘,這些圖形的元素是一些點(diǎn)熄驼、線、矩形烘豹、多邊形瓜贾、圓和弧線等等,它們都是通過數(shù)學(xué)公式計(jì)算獲得的携悯。例如一幅花的矢量圖形實(shí)際上是由線段形成外框輪廓祭芦, 由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由于矢量圖形可通過公式計(jì)算獲得憔鬼,所以矢量圖形文件體積一般較小龟劲。矢量圖形最大的優(yōu)點(diǎn)是無論放大、縮小或旋轉(zhuǎn)等不會失真逊彭;最大的缺點(diǎn)是難以表現(xiàn)色彩層次豐富的逼真圖像效果咸灿。
53.四元組是什么?
所謂四元數(shù),就是把4個(gè)實(shí)數(shù)組合起來的東西侮叮。4 個(gè)元素中避矢,一個(gè)是實(shí)部,其余 3 個(gè)是虛部。
54.你對你的數(shù)學(xué)知識感覺如何审胸?比如空間向量亥宿,圖形學(xué)
個(gè)人感覺還是不錯(cuò)的,空間向量和圖形學(xué)之前有自學(xué)過砂沛。只是在實(shí)際工作中直接使用的機(jī)會比較少烫扼,底層的一些操作有些生疏了。
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
上述兩個(gè)矩陣相乘的結(jié)果
2 ??0 ??2
2 ??1 ??2
3 ??1 ??3
57.什么是投影矩陣
投影矩陣是一個(gè)典型的縮放和透視矩陣映企。投影變換將視錐變換成一個(gè)直平行六面體的形狀。因?yàn)橐曞F的近處比遠(yuǎn)處小静浴,這樣就會對靠近攝像機(jī)的對象起到放大的作用堰氓,也就將透視應(yīng)用到了場景當(dāng)中
58.什么是UV
UV坐標(biāo)是指所有的圖象文件都是二維的一個(gè)平面。水平方向是U苹享,垂直方向是V双絮,通過這個(gè)平面的,二維的UV坐標(biāo)系得问。我們可以定位圖象上的任意一個(gè)象素囤攀。
59.Cullback,cullfront宫纬,culloff區(qū)別
剔除背面焚挠、剔除前面、不剔除
60.什么是頂點(diǎn)程序和片段程序
頂點(diǎn)著色器是一組指令代碼哪怔,這組指令代碼在頂點(diǎn)被渲染時(shí)執(zhí)行宣蔚。
片段著色器也是在GPU上運(yùn)行的小程序。它們負(fù)責(zé)輸出每個(gè)呈現(xiàn)的三角形像素的最終像素顏色认境∨呶基本而言,它的工作原理如下:片段著色器以輸入的形式收到頂點(diǎn)著色器通過管道傳遞的所有這些片段叉信。
61.如何實(shí)現(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)建完整的光照貼圖硼身,你完全不用擔(dān)心硅急,所有材質(zhì)會自動獲得光照貼圖。光照貼圖的意思是佳遂,所有燈光的特性將被直接映射到Beast lightmapper并烘培到紋理营袜,以此獲得更好的性能。UnityPro版擴(kuò)展了全局光照功能丑罪,可以烘焙出真實(shí)而漂亮的光照荚板,當(dāng)然這就不能同時(shí)使用實(shí)時(shí)光照凤壁。此外,Unity專業(yè)版帶給你天光和發(fā)光材質(zhì)跪另,為你增加更有趣的場景照明拧抖。
在此頁中,你會發(fā)現(xiàn)更深入的描述免绿,可以找到在Lightmapping窗口的所有屬性唧席。從菜單中Window – Lightmapping打開Lightmapping窗口。
物體
物體的烘培設(shè)置:燈光嘲驾、網(wǎng)格渲染和地形-取決于當(dāng)前的選擇淌哟。
網(wǎng)格渲染器和地形:
·Static 靜態(tài)
可渲染網(wǎng)格和地形必須標(biāo)記為靜態(tài)才能被烘培。
·Scale In Lightmap 光照圖比率
(只作用于可渲染網(wǎng)格)特別大的數(shù)值將分配給可渲染網(wǎng)格更大的分辨率辽故。最終分辨率比例(光照圖縮放)*(物體世界坐標(biāo)空間所占面積)*全局分辨率烘培設(shè)置)如果設(shè)置為0物體將不被烘培绞绒。(但是它依舊對其他的物體有影響)
·Lightmap Size 光照圖大小
(只作用于地形)光照貼圖尺寸是地形實(shí)例獨(dú)有的屬性,地形將不和其他物體共用圖集榕暇。地形光照貼圖將存貯在一個(gè)單獨(dú)的文件中。
·Atlas 圖集
圖集信息-如果Lock Atlas(鎖定圖集)選項(xiàng)沒有開啟那么這些參數(shù)將自動更新喻杈。如果Lock Atlas(鎖定圖集)選項(xiàng)開啟彤枢,這些參數(shù)將不會自動編輯。但是你可以手動設(shè)置他們筒饰。
·Lightmap Index 光照圖索引
光照貼圖序列中的索引缴啡。
·Tiling 平鋪
(只作用于可渲染網(wǎng)格)物體光照貼圖UVs平鋪。
·Offset 偏移
(只作用于可渲染網(wǎng)格)物體UVs的偏移瓷们。
Lights燈光:
·Lightmapping 光照貼圖
光照圖模式:僅實(shí)時(shí)模式业栅,自動模式和僅烘培模式。查看下面Dual Lightmaps的描述谬晕。
·Color 顏色
燈光顏色碘裕。一些屬性只作用于實(shí)時(shí)光照。
·Intensity 光強(qiáng)度
燈光照明強(qiáng)度攒钳。一些屬性只作用于實(shí)時(shí)光照帮孔。
·Bounce Intensity 反彈強(qiáng)度
特定光源間接光照強(qiáng)度的倍增值。
·Baked Shadows 烘焙陰影
控制當(dāng)前燈光是否產(chǎn)生陰影不撑。(當(dāng)選擇自動選項(xiàng)時(shí)同時(shí)影響實(shí)施陰影的產(chǎn)生)
·Shadow Radius 陰影半徑
(只作用于點(diǎn)光源和聚光燈)增加這個(gè)值將得到一個(gè)較柔和的陰影文兢。增加這個(gè)值的大小影響陰影覆蓋面積范圍的計(jì)算(不會影響到燈光照射范圍)。
·Shadow Angle 陰影角度
(只影響平行光)增加這個(gè)值將會得到一個(gè)比較柔和的陰影-增加燈光陰影覆蓋角度范圍的計(jì)算焕檬。(不會影響到燈光照射范圍)
·Shadow Samples 陰影采樣
如果你將陰影半徑或者角度設(shè)置為大于0的值姆坚,增加陰影采樣值能得到一個(gè)比較好的結(jié)果。高采樣值將消除半影中中的噪點(diǎn)实愚。
Bake烘焙
全局烘焙設(shè)置兼呵。
·Mode 模式
控制離線烘培和實(shí)時(shí)光照模式兔辅。在Dual Lightmaps模式下近端和遠(yuǎn)端光照圖都將被烘培;只有延遲光照渲染方式式才能更好的支持雙重光照圖萍程。Single Lightmaps 模式僅烘培遠(yuǎn)端光照圖幢妄。在延遲渲染方式下也可以強(qiáng)制使用單光照圖模式。
·Use in forward rendering 使用正向渲染
(Dual lightmaps only)在正向渲染中啟用dual lightmaps茫负。要注意的是這需要你創(chuàng)建自己的shader來達(dá)到目的蕉鸳。
·Quality 質(zhì)量
高質(zhì)量(比較好的效果)和低質(zhì)量(計(jì)算速度快)的預(yù)設(shè)值。它們將影響最終聚集光線數(shù)量和對比度的數(shù)值以及其他有關(guān)最終聚集和抗鋸齒的設(shè)置忍法。
·Bounces 反彈
控制全局光照模擬中光線反彈的次數(shù)潮尝。如果想得到一個(gè)比較柔和的相對真實(shí)的光照至少需要將此數(shù)值設(shè)置為1.如果設(shè)置為0那么只會計(jì)算直接光照。
·Sky Light Color 天光顏色
天光是模擬從天球向所有方向發(fā)射光線照射場景-在烘培室外場景的時(shí)候開啟天光將得到一個(gè)非常好的效果饿序。
·Sky Light Intensity 天光強(qiáng)度
天光的強(qiáng)度- 0代表禁用天光勉失。
·Bounce Boost 反彈增強(qiáng)
增強(qiáng)間接光,可用來增加場景中渲染太快沒有烘焙出燈光的反彈量原探。
·Bounce Intensity 反彈強(qiáng)度
間接光照的強(qiáng)度倍增器乱凿。
·Final Gather Rays 最終聚集光線
控制從最終聚集點(diǎn)發(fā)射的光線數(shù)量-較高的數(shù)值能得到更好的效果 。
·Contrast Threshold
對比度閾值
顏色對比度根據(jù)采樣運(yùn)算規(guī)則控制哪些最終聚集點(diǎn)被創(chuàng)建咽弦。較高的數(shù)值可以使Beast處理物體表面燈光照明時(shí)有很大的改善徒蟆,從而得到一張平滑的光照貼圖但是會犧牲一些照明細(xì)節(jié)。較低的數(shù)值需要最終聚集光線數(shù)量要高于對比度閾值這樣被過濾掉的最終聚集點(diǎn)才能被創(chuàng)建出來型型。
·Interpolation 插值
控制最終聚集點(diǎn)顏色的插值段审。設(shè)置0為線性插值,設(shè)置1為基于梯度的高級插值闹蒜。多數(shù)情況下推薦使用后者寺枉。
·Interpolation Points 插值點(diǎn)
設(shè)置最終聚集點(diǎn)顏色的插值的參考點(diǎn)。高數(shù)值可以獲得比較平滑的結(jié)果绷落,但是會犧牲一些光照細(xì)節(jié)姥闪。
·Ambient Occlusion
環(huán)境光遮擋
烘培光照圖時(shí)產(chǎn)生一定數(shù)量的環(huán)境阻光。環(huán)境阻光計(jì)算物體每一點(diǎn)被一定距離內(nèi)的其他物體或者一定距離內(nèi)自身物體的遮擋程度(用來模擬物體表面環(huán)境光及陰影覆蓋的比例,達(dá)到全局光照的效果),所以和所有的燈光設(shè)置沒有太大關(guān)系晒屎。
·Max Distance 最大距離
Beyond this distance a ray is considered to be unoccluded. 0 stands for infinitely long rays.
超出這個(gè)距離的光線將不被遮擋鉴腻。0表示無限長的光線。
·Contrast 對比度
控制完全阻光和不阻光之間的過度。
·Lock Atlas 鎖定圖集
當(dāng)鎖定圖集被打開。自動圖集功能將不執(zhí)行,物體光照圖索引槐脏,平鋪和偏移將不能編輯。
·Resolution 分辨率
每世界單位中光照圖分辨率的大小撇寞。因此當(dāng)設(shè)置分辨率為50的一個(gè)10單位乘以10單位的平面將產(chǎn)生一張500*500像素的光照貼圖顿天。
Maps貼圖所有光照貼圖的可編輯數(shù)組堂氯。
·Compressed 壓縮
控制是否壓縮所有當(dāng)前場景中的光照貼圖。
·Array Size 數(shù)組大小
光照貼圖數(shù)組的大信品稀(0~254)咽白。
·Lightmaps Array 光照貼圖數(shù)組
當(dāng)前場景被烘培的所有光照圖的可編輯序列。沒有被指定的通道將被處理為黑色光照圖鸟缕。索引相當(dāng)于網(wǎng)格渲染和地形中所使用的光照圖編號晶框。除非鎖定圖集被開啟否則序列將自動初始化并分配給你烘培的貼圖。
Lightmap Display光照貼圖顯示
在編輯器中控制光照圖如何顯示的工具懂从。光照圖顯示是在場景視口中的一個(gè)子窗口授段。可見只要光照圖窗口可見番甩。
·Use Lightmaps 使用光照貼圖
是否渲染光照圖侵贵。
·Shadow Distance 陰影距離
根據(jù)過度到只使用遠(yuǎn)端光照圖時(shí)哪些設(shè)置為自動模式的燈光被關(guān)閉的距離。這里的設(shè)置覆蓋其他面板中相關(guān)設(shè)置缘薛。但是不能覆蓋質(zhì)量設(shè)置中的陰影距離設(shè)置窍育。
·Show Resolution 顯示分辨率
切換在場景中是否顯示光照圖分辨率。開啟這項(xiàng)設(shè)置你可以在你的場景中直接預(yù)覽靜態(tài)物體光照圖的分辨率大小宴胧。
Details細(xì)節(jié)
Dual Lightmaps雙重光照貼圖
雙光照貼圖是Unity中的光照貼圖可以同高光貼圖蔫骂,法線貼圖和適當(dāng)混合的實(shí)時(shí)陰影一起渲染的工具。同時(shí)它也可以讓你的光照貼圖看起來效果更好牺汤,即使設(shè)置的光照分辨率較低。
雙光照貼圖默認(rèn)情況下只能用于延遲光照渲染路徑浩嫌。但通過編寫自定義著色器就可能讓雙光照貼圖用于前向渲染路徑中(使用dualforward表面著色指令)檐迟。
雙光照貼圖即意為使用兩套光照貼圖:
·遠(yuǎn) :包含全部照明
·近 :包含標(biāo)記為自動模式的燈光所產(chǎn)生的的間接照明,和標(biāo)記為僅烘焙模式的燈光码耐,發(fā)光材質(zhì)和天光的所有照明追迟。
設(shè)置為僅實(shí)時(shí)的燈光永遠(yuǎn)不會被烘培。近端光照圖作用于質(zhì)量設(shè)置中的相對攝像機(jī)最小陰影距離范圍內(nèi)骚腥。
在這個(gè)距離范圍內(nèi)敦间,自動模式的燈光將實(shí)時(shí)渲染高光,凹凸和陰影束铭,(它們的陰影與實(shí)時(shí)模式的等光的陰影融為一體)廓块,間接光則來自近端光照貼圖。若超出陰影距離自動模式燈光就不再進(jìn)行實(shí)時(shí)渲染契沫,而全部照明都由光照貼圖產(chǎn)生(僅實(shí)時(shí)模式燈光仍然產(chǎn)生照明带猴,但不產(chǎn)生陰影)。
下面的場景包含一個(gè)默認(rèn)設(shè)置為為自動模式的平行光懈万,一些烘培完光照貼圖的靜態(tài)物體(建筑物拴清,障礙物靶病,其他靜態(tài)物體)和一些動態(tài)的移動或可移動物體(持槍的假人,桶)口予。該場景在雙重光照貼圖模式中烘焙和渲染:陰影距離以外的建筑物完全由光照貼圖產(chǎn)生照明娄周,而兩個(gè)假人由實(shí)時(shí)燈光產(chǎn)生動態(tài)光照,但是不投射陰影;陰影距離范圍內(nèi)的建筑物和地面被即時(shí)光照亮并投下實(shí)時(shí)陰影沪停,但柔和的間接光是來自于近端光照貼圖產(chǎn)生煤辨。
63.Shader的代碼實(shí)現(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.游戲中要怎么實(shí)現(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的每行進(jìn)行遍歷
????????for(int i=0; i
//對b的每列進(jìn)行遍歷
????????????for(int j=0;j
//c為每一個(gè)點(diǎn)的值
????????????????float c = 0;
//第i行j列的值為a的第i行上的n個(gè)數(shù)和b的第j列上的n個(gè)數(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;
}