国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android OpenGL ES 學(xué)習(xí)(四) -- 正交投影

這篇具有很好參考價(jià)值的文章主要介紹了Android OpenGL ES 學(xué)習(xí)(四) -- 正交投影。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

OpenGL 學(xué)習(xí)教程
Android OpenGL ES 學(xué)習(xí)(一) – 基本概念
Android OpenGL ES 學(xué)習(xí)(二) – 圖形渲染管線和GLSL
Android OpenGL ES 學(xué)習(xí)(三) – 繪制平面圖形
Android OpenGL ES 學(xué)習(xí)(四) – 正交投屏
Android OpenGL ES 學(xué)習(xí)(五) – 漸變色
Android OpenGL ES 學(xué)習(xí)(六) – 使用 VBO、VAO 和 EBO/IBO 優(yōu)化程序
Android OpenGL ES 學(xué)習(xí)(七) – 紋理
代碼工程地址: https://github.com/LillteZheng/OpenGLDemo.git

這里的內(nèi)容基本參考于 https://www.jianshu.com/p/51a405bc52ed ,這里再補(bǔ)充些矩陣相關(guān)的知識(shí)。

這里先簡(jiǎn)單解決變形的問(wèn)題,關(guān)于 OpenGL 更多圖形矩陣變換,等后面再詳細(xì)講。

一. 歸一化設(shè)備坐標(biāo)

在OpenGL中,我們要渲染的所有物體都要映射到x軸、y軸、z軸上的[-1, 1]范圍內(nèi),這個(gè)范圍內(nèi)的坐標(biāo)被稱為歸一化設(shè)備坐標(biāo),其獨(dú)立于屏幕的實(shí)際尺寸或者形狀。
OpenGL 的坐標(biāo) 它是個(gè)正方形的:
opengl 正交投影,Android 音視頻,音視頻,OpenGL

而手機(jī)屏幕是長(zhǎng)方形的,橫豎屏的效果都不一樣。同樣的比例,視覺(jué)上是不一樣的,比如繪制一個(gè)半徑為 0.5 的圓,效果卻是一個(gè)橢圓:
opengl 正交投影,Android 音視頻,音視頻,OpenGL

二. 解決方案

解決此問(wèn)題,可以把一個(gè)物品的坐標(biāo),通過(guò)平移,縮放的方式,塞到到這個(gè)歸一化坐標(biāo)里面就可以了。
可以使用 正交投屏 來(lái)處理變形的問(wèn)題,因?yàn)檎煌队?,沒(méi)有遠(yuǎn)近距離的關(guān)系。

opengl 正交投影,Android 音視頻,音視頻,OpenGL

比如一個(gè)手機(jī)是豎屏,分辨率 1920x1080 ,怎么樣把它放到 [-1,1] 里面?
有兩個(gè)步驟

  1. 以短邊為基準(zhǔn),比如 1080,取值為 [-1,1],那邊長(zhǎng)邊縮放后 n = 長(zhǎng)/寬 就是 [-n,n],比如 1920/1080 ≈ 1.78
  2. 頂點(diǎn)著色器,在設(shè)置坐標(biāo)位置的時(shí)候,從 [-n,n] 換算到 [-1,1] 范圍內(nèi)即可。

三. 代碼實(shí)現(xiàn)

上面的步驟中,第一步比較好實(shí)現(xiàn),在內(nèi)容變化后,以短邊為基準(zhǔn),拿到寬高的比例。
第二步如何實(shí)現(xiàn)?
在 OpenGL 中,我們使用 vec4 ,即4分量,圖形的變量,使用的是矩陣,而OpenGL中使用的是列向量,如[xyzw]T,所以與矩陣相乘時(shí),矩陣在前,向量在后。

知道了原理之后,我們代碼實(shí)現(xiàn)上需要解決以下幾個(gè)問(wèn)題:

  1. 如何獲得一個(gè)矩陣,可以把坐標(biāo)范圍從[-N,N]換算為[-1,1]的范圍內(nèi)
  2. 如何將矩陣傳遞到GLSL中
  • 對(duì)于問(wèn)題1,Android提供了Matrix.orthoM這個(gè)方法來(lái)處理矩陣。
  • 對(duì)于問(wèn)題2,與獲取頂點(diǎn)索引類似,可以再GLSL中聲明一個(gè)mat4類型的矩陣變量,獲取其索引,再傳遞值給它

在之前多邊形的代碼中,修改頂點(diǎn)代碼如下,增加一個(gè)矩陣變量:

        /**
         * 頂點(diǎn)著色器:之后定義的每個(gè)都會(huì)傳1次給頂點(diǎn)著色器
         * 修改頂部著色器的坐標(biāo)值,即增加個(gè)舉證x向量
         */
        private const val VERTEX_SHADER = """#version 300 es
                layout(location = 0) in vec4 a_Position;
                // mat4:4×4的矩陣
                uniform mat4 u_Matrix;
                void main()
                {
                 // 矩陣與向量相乘得到最終的位置
                    gl_Position = u_Matrix * a_Position;
                    gl_PointSize = 30.0;
                     
                }
        """
        private const val U_COLOR = "u_Color"
        private const val U_MATRIX = "u_Matrix"
        //單位矩陣,單位矩陣乘以任何數(shù)都等于乘數(shù)本身
        private val UnitMatrix = floatArrayOf(
            1f, 0f, 0f, 0f,
            0f, 1f, 0f, 0f,
            0f, 0f, 1f, 0f,
            0f, 0f, 0f, 1f
        )
      override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES30.glClearColor(1f, 1f, 1f, 1f)
       	....
        uMatrix = getUniform(U_MATRIX)

    }

在 gl 變化時(shí),設(shè)置矩陣

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES30.glViewport(0, 0, width, height)
        val aspectRatio = if (width > height) {
            width.toFloat() / height
        } else {
            height.toFloat() / width
        }
        // 1. 矩陣數(shù)組
        // 2. 結(jié)果矩陣起始的偏移量
        // 3. left:x的最小值
        // 4. right:x的最大值
        // 5. bottom:y的最小值
        // 6. top:y的最大值
        // 7. near:z的最小值
        // 8. far:z的最大值
        // 由于是正交矩陣,所以偏移量為0,near 和 far 也不起作用
        if (width > height){
           Matrix.orthoM(UnitMatrix,0,-aspectRatio,aspectRatio,-1f,1f,-1f,1f)
        }else{
            Matrix.orthoM(UnitMatrix,0,-1f,1f,-aspectRatio,aspectRatio,-1f,1f)
        }
        //更新 matrix 的值,即把 UnitMatrix 值,更新到 uMatrix 這個(gè)索引
        GLES30.glUniformMatrix4fv(uMatrix,1,false, UnitMatrix,0)
    }

near 和 far 這里,可以直接參考正交投影的公式
opengl 正交投影,Android 音視頻,音視頻,OpenGL
任何出現(xiàn)在近平面之前或遠(yuǎn)平面之后的坐標(biāo)都會(huì)被裁剪掉,所以,這里的 near =-1,far =1,表示這個(gè)坐標(biāo)的范圍在 [-1,1] 這個(gè)區(qū)間內(nèi)

參考:
嗶哩嗶哩 視頻:https://www.bilibili.com/video/BV12t4y1c7zd/?spm_id_from=333.337.search-card.all.click
https://www.jianshu.com/p/51a405bc52ed文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-540416.html

到了這里,關(guān)于Android OpenGL ES 學(xué)習(xí)(四) -- 正交投影的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android OpenGL ES 學(xué)習(xí)(一) -- 基本概念

    Android OpenGL ES 學(xué)習(xí)(一) -- 基本概念

    OpenGL 學(xué)習(xí)教程 Android OpenGL ES 學(xué)習(xí)(一) – 基本概念 Android OpenGL ES 學(xué)習(xí)(二) – 圖形渲染管線和GLSL Android OpenGL ES 學(xué)習(xí)(三) – 繪制平面圖形 Android OpenGL ES 學(xué)習(xí)(四) – 正交投屏 Android OpenGL ES 學(xué)習(xí)(五) – 漸變色 Android OpenGL ES 學(xué)習(xí)(六) – 使用 VBO、VAO 和 EBO/IBO 優(yōu)化程序 Android OpenG

    2024年01月23日
    瀏覽(28)
  • Android OpenGL ES 學(xué)習(xí)(八) –矩陣變換

    Android OpenGL ES 學(xué)習(xí)(八) –矩陣變換

    OpenGL 學(xué)習(xí)教程 Android OpenGL ES 學(xué)習(xí)(一) – 基本概念 Android OpenGL ES 學(xué)習(xí)(二) – 圖形渲染管線和GLSL Android OpenGL ES 學(xué)習(xí)(三) – 繪制平面圖形 Android OpenGL ES 學(xué)習(xí)(四) – 正交投影 Android OpenGL ES 學(xué)習(xí)(五) – 漸變色 Android OpenGL ES 學(xué)習(xí)(六) – 使用 VBO、VAO 和 EBO/IBO 優(yōu)化程序 Android OpenG

    2023年04月08日
    瀏覽(19)
  • Android OpenGL ES 學(xué)習(xí)(五) -- 漸變色

    Android OpenGL ES 學(xué)習(xí)(五) -- 漸變色

    OpenGL 學(xué)習(xí)教程 Android OpenGL ES 學(xué)習(xí)(一) – 基本概念 Android OpenGL ES 學(xué)習(xí)(二) – 圖形渲染管線和GLSL Android OpenGL ES 學(xué)習(xí)(三) – 繪制平面圖形 Android OpenGL ES 學(xué)習(xí)(四) – 正交投屏 Android OpenGL ES 學(xué)習(xí)(五) – 漸變色 Android OpenGL ES 學(xué)習(xí)(六) – 使用 VBO、VAO 和 EBO/IBO 優(yōu)化程序 Android OpenG

    2024年02月07日
    瀏覽(21)
  • Android OpenGL ES 學(xué)習(xí)(九) – 坐標(biāo)系統(tǒng)和實(shí)現(xiàn)3D效果

    Android OpenGL ES 學(xué)習(xí)(九) – 坐標(biāo)系統(tǒng)和實(shí)現(xiàn)3D效果

    OpenGL 學(xué)習(xí)教程 Android OpenGL ES 學(xué)習(xí)(一) – 基本概念 Android OpenGL ES 學(xué)習(xí)(二) – 圖形渲染管線和GLSL Android OpenGL ES 學(xué)習(xí)(三) – 繪制平面圖形 Android OpenGL ES 學(xué)習(xí)(四) – 正交投影 Android OpenGL ES 學(xué)習(xí)(五) – 漸變色 Android OpenGL ES 學(xué)習(xí)(六) – 使用 VBO、VAO 和 EBO/IBO 優(yōu)化程序 Android OpenG

    2024年01月25日
    瀏覽(23)
  • Android OpenGL ES 學(xué)習(xí)(十) – GLSurfaceView 源碼解析GL線程以及自定義 EGL

    Android OpenGL ES 學(xué)習(xí)(十) – GLSurfaceView 源碼解析GL線程以及自定義 EGL

    OpenGL 學(xué)習(xí)教程 Android OpenGL ES 學(xué)習(xí)(一) – 基本概念 Android OpenGL ES 學(xué)習(xí)(二) – 圖形渲染管線和GLSL Android OpenGL ES 學(xué)習(xí)(三) – 繪制平面圖形 Android OpenGL ES 學(xué)習(xí)(四) – 正交投影 Android OpenGL ES 學(xué)習(xí)(五) – 漸變色 Android OpenGL ES 學(xué)習(xí)(六) – 使用 VBO、VAO 和 EBO/IBO 優(yōu)化程序 Android OpenG

    2024年02月05日
    瀏覽(20)
  • Android OpenGL ES 學(xué)習(xí)(十三) -離屏渲染FBO(截圖)RBO, OES轉(zhuǎn) FBO

    Android OpenGL ES 學(xué)習(xí)(十三) -離屏渲染FBO(截圖)RBO, OES轉(zhuǎn) FBO

    Android OpenGL ES 學(xué)習(xí)(一) – 基本概念 Android OpenGL ES 學(xué)習(xí)(二) – 圖形渲染管線和GLSL Android OpenGL ES 學(xué)習(xí)(三) – 繪制平面圖形 Android OpenGL ES 學(xué)習(xí)(四) – 正交投屏 Android OpenGL ES 學(xué)習(xí)(五) – 漸變色 Android OpenGL ES 學(xué)習(xí)(六) – 使用 VBO、VAO 和 EBO/IBO 優(yōu)化程序 Android OpenGL ES 學(xué)習(xí)(七) –

    2024年02月12日
    瀏覽(20)
  • 【Android OpenGL開(kāi)發(fā)】OpenGL ES與EGL介紹

    【Android OpenGL開(kāi)發(fā)】OpenGL ES與EGL介紹

    OpenGL(Open Graphics Library)是一個(gè)跨編程語(yǔ)言、跨平臺(tái)的編程圖形程序接口,主要用于圖像的渲染。 Android提供了簡(jiǎn)化版的OpenGL接口,即OpenGL ES。 早先定義 OpenGL ES 是 OpenGL 的嵌入式設(shè)備版本,用于移動(dòng)端平臺(tái)(Android、iOS),但由于嵌入式設(shè)備要求的是高性能,所以一些其它純

    2024年02月04日
    瀏覽(17)
  • OpenGL-ES 學(xué)習(xí)(4)---- OpenGL-ES 坐標(biāo)體系

    OpenGL-ES 學(xué)習(xí)(4)---- OpenGL-ES 坐標(biāo)體系

    坐標(biāo)體系 我們知道 OpenGL -ES 坐標(biāo)系中每個(gè)頂點(diǎn)的 x,y,z 坐標(biāo)都應(yīng)該在 -1.0 到 1.0 之間,超出這個(gè)坐標(biāo)范圍的頂點(diǎn)都將不可見(jiàn)。 將一個(gè)物體(圖像)渲染到屏幕上,通常經(jīng)過(guò)將物體坐標(biāo)轉(zhuǎn)換為標(biāo)準(zhǔn)化設(shè)備坐標(biāo),然后再將標(biāo)準(zhǔn)化設(shè)備坐標(biāo)轉(zhuǎn)化為屏幕坐標(biāo)的過(guò)程。 ( 將物體坐標(biāo)轉(zhuǎn)

    2024年02月19日
    瀏覽(20)
  • Android 短視頻直播特效,音視頻圖像處理 FFmepg OpenGLES OpenCV開(kāi)發(fā)詳細(xì)內(nèi)容
  • Android OpenGL ES實(shí)現(xiàn)簡(jiǎn)單綠幕摳圖

    Android OpenGL ES實(shí)現(xiàn)簡(jiǎn)單綠幕摳圖

    目錄 正文 OES Filter BlendShader Filter 最后的效果 缺陷 實(shí)現(xiàn)綠幕摳圖,其實(shí)想法很簡(jiǎn)單。 這里簡(jiǎn)單粗暴的使用著色器替換。 OES Filter 直接實(shí)現(xiàn)在相機(jī)預(yù)覽上的Shader ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #extension GL_OES_EGL_image_external : require precision mediump float ; ???????

    2024年02月13日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包