Google Filament學(xué)習(xí)-從Android官方項目分析2

前一節(jié)分析了一部分官方項目瞧哟,包括如何引入Filament庫、如何使用Filament庫和Filament的渲染過程三個部分枪向。
Filament分析-從Android官方項目分析1

接下來接續(xù)分析Android中使用Filament勤揩。

一、初始化

//編舞者
        choreographer = Choreographer.getInstance()
//利用UiHelper初始化渲染窗口
        setupSurfaceView()
//初始化Filament秘蛔,包括engine/renderer/view/scene/camera
        setupFilament()
//初始化view(filament的view陨亡,不是android的view)
        setupView()
//初始化scene
        setupScene()

初始化scene。

//加載渲染材質(zhì)
        loadMaterial()
//設(shè)置渲染材質(zhì)
        setupMaterial()
//初始化mesh
        createMesh()
//生成材質(zhì)類深员,
    private fun loadMaterial() {
        readUncompressedAsset("materials/lit.filamat").let {
            material = Material.Builder().payload(it, it.remaining()).build(engine)
        }
    }

//由材質(zhì)類生成材質(zhì)實例
    private fun setupMaterial() {
        materialInstance = material.createInstance()
        materialInstance.setParameter("baseColor", Colors.RgbType.SRGB, 1.0f, 0.85f, 0.57f)
        materialInstance.setParameter("roughness", 0.3f)
    }

在readUncompressedAsset()方法中负蠕,將生成的材質(zhì)文件lit.filamat轉(zhuǎn)換為ByteBuffer,傳遞給native層倦畅,native層又調(diào)用了NioUtils.h里的方法遮糖,將ByteBuffer轉(zhuǎn)換為byte[],而轉(zhuǎn)換方式又調(diào)用了java層的NioUtils類提供的方法叠赐。

設(shè)置材質(zhì)時欲账,提供了幾個參數(shù):

materialInstance = material.createInstance()
materialInstance.setParameter("baseColor", Colors.RgbType.SRGB, 1.0f, 0.85f, 0.57f)
materialInstance.setParameter("roughness", 0.3f)

其中baseColor和roughness是在lit.mat里設(shè)定的。

    // List of parameters exposed by this material
    parameters : [
        // The color must be passed in linear space, not sRGB
        {
            type : float3,
            name : baseColor
        },
        {
            type : float,
            name : roughness
        },
        {
            type : samplerExternal,
            name : videoTexture
        },
        {
            type : mat4,
            name : textureTransform
        }
    ],

關(guān)于材質(zhì)之后會單獨分析芭概。

二赛不、Mesh

分析創(chuàng)建網(wǎng)格化的代碼:

    private fun createMesh() {
        val floatSize = 4
        val shortSize = 2
        // A vertex is a position + a tangent frame:
        // 3 floats for XYZ position, 4 floats for normal+tangents (quaternion)
        val vertexSize = 3 * floatSize + 4 * floatSize
        ....
}

filament的頂點由2個部分組成,位置和正切值(法線+正切組成的四元數(shù))谈山。
位置:x/y/z 三個float
正切:四元數(shù)俄删,4個float

為此,建立了一個頂點類Vertex奏路,并增加了ByteBuffer的臨時方法畴椰,存放頂點數(shù)據(jù)。

        // Define a vertex and a function to put a vertex in a ByteBuffer
        @Suppress("ArrayInDataClass")
        data class Vertex(val x: Float, val y: Float, val z: Float, val tangents: FloatArray)

        fun ByteBuffer.put(v: Vertex): ByteBuffer {
            putFloat(v.x)
            putFloat(v.y)
            putFloat(v.z)
            v.tangents.forEach { putFloat(it) }
            return this
        }

為什么用法線+正切組成的四元數(shù)存儲頂點呢鸽粉?
這是用于切線空間Tangent Space用的斜脂,可以參考一下文章:
切線空間
法線紋理

接下來有多個api調(diào)用,包括VertexBuffer触机、IndexBuffer帚戳,都是渲染引擎里的概念玷或,可以參考OpenGL里的概念。
除了渲染材質(zhì)RenderableManager外片任,還用上了光照LightManager偏友、轉(zhuǎn)換TransformManager。

TransformManager is used to add transform components to entities.
LightManager allows to create a light source in the scene, such as a sun or street lights.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末对供,一起剝皮案震驚了整個濱河市位他,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌产场,老刑警劉巖鹅髓,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異京景,居然都是意外死亡窿冯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門确徙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醒串,“玉大人,你說我怎么就攤上這事鄙皇∠梅铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵育苟,是天一觀的道長。 經(jīng)常有香客問我椎木,道長违柏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任香椎,我火速辦了婚禮漱竖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘畜伐。我一直安慰自己馍惹,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布玛界。 她就那樣靜靜地躺著万矾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慎框。 梳的紋絲不亂的頭發(fā)上良狈,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音笨枯,去河邊找鬼薪丁。 笑死遇西,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的严嗜。 我是一名探鬼主播粱檀,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漫玄!你這毒婦竟也來了茄蚯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤称近,失蹤者是張志新(化名)和其女友劉穎第队,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刨秆,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡凳谦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衡未。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尸执。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缓醋,靈堂內(nèi)的尸體忽然破棺而出如失,到底是詐尸還是另有隱情,我是刑警寧澤送粱,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布褪贵,位于F島的核電站,受9級特大地震影響抗俄,放射性物質(zhì)發(fā)生泄漏脆丁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一动雹、第九天 我趴在偏房一處隱蔽的房頂上張望槽卫。 院中可真熱鬧,春花似錦胰蝠、人聲如沸歼培。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躲庄。三九已至,卻和暖如春钾虐,著一層夾襖步出監(jiān)牢的瞬間读跷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工禾唁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留效览,地道東北人无切。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像丐枉,于是被迫代替她去往敵國和親哆键。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348