日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android OpenGL ES 开发 (二)】渲染管线与Shader

發布時間:2023/12/3 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android OpenGL ES 开发 (二)】渲染管线与Shader 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

計算出每一幀耗費的時間

1.在頭文件中加入time.h,cpp中實現如下計算時間接口

float GetFrameTime(){static unsigned long long lastTime=0,currentTime=0;timeval current;gettimeofday(&current, nullptr);//取當前時間currentTime = current.tv_sec * 1000 + current.tv_usec/1000; //s to ms and vs to msunsigned long long frameTime = lastTime==0?0:currentTime - lastTime;lastTime = currentTime;return float (frameTime)/1000.0f; //輸出結果為s }

引入外部的數學庫

1.cpp文件中加入GLM的數學庫,頭文件中加入如下頭文件

//引入數學庫

#include "Glm/glm.hpp"

#include "Glm/ext.hpp"

齊次坐標與缺省的3D坐標系

1.普通坐標 x,y,z表示[1,2,3],齊次坐標是[1,2,3,1] ,x/w y/w z/w 是真正的3D坐標表示

2.OpenGL坐標系中心為(0, 0, 0)為坐標系原點,其中x,y的坐標方向遵循笛卡爾坐標系,z軸坐標從屏幕原點指向我們,方向為正,想要顯示需要推到原點的后面,所以z坐標取負值。

3.CPP中點的初始化定義

struct Vectice{float mPosition[4];//x,y,z,w };//頂點初始化部分Vectice vertices[3];//CPU -> GPUvertices[0].mPosition[0]=0.5f; //xvertices[0].mPosition[1]=0.5f; //yvertices[0].mPosition[2]=2.0f; //zvertices[0].mPosition[3]=1.0f; //wvertices[1].mPosition[0]=0.5f;vertices[1].mPosition[1]=0.5f;vertices[1].mPosition[2]=2.0f;vertices[1].mPosition[3]=1.0f;vertices[2].mPosition[0]=0.0f;vertices[2].mPosition[1]=0.5f;vertices[2].mPosition[2]=2.0f;vertices[2].mPosition[3]=1.0f;

渲染時的正反面(CCW與CW)的定義

1.CCW逆時針表示圖形正面 ; CW順時針表示圖像反面

2.圖元都是基于三角形

詳解VBO(VertexBufferObject)

1.用來存放vertex 頂點坐標,作為gpu的一段換從空間,可以把cpu上面的數據緩存到次數,gpu執行的時候可以在此讀取不需要進行多次cpu->gpu的拷貝操作

GLuint vbo;//vertex buffer object 存放頂點緩沖區的對象glGenBuffers(1,&vbo);//需要1個VBO,把vbo寫入到顯卡進去,供后續操作glBindBuffer(GL_ARRAY_BUFFER,vbo);//把vbo設置到卡槽上//glBufferData(GL_ARRAY_BUFFER,sizeof(Vectice)*3, nullptr,GL_STATIC_DRAW);//只在GPU上開辟內存不傳數據//glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(Vectice)*3,vertices);//加入數組,0指vbo偏移位置glBufferData(GL_ARRAY_BUFFER,sizeof(Vectice)*3,vertices,GL_STATIC_DRAW);//cpu -> gpu,向GL_ARRAY_BUFFER加入數據glBindBuffer(GL_ARRAY_BUFFER,0);//卡槽重新綁定,防止誤操作

詳解GPU的工作流程

1.shader通常稱為著色器,作用是把CPU上的點渲染出來。

2.shader是并行的。

3.流程:數據data (頂點數據) ----->VS(輸入:data的頂點數據,輸出:gl_Position的 vec4 頂點數據)----->光柵化處理(顯卡自動負責,把點連成生成面,其中包括一定像素)------>FS(輸入:光柵器的輸出的像素,輸出畫面);注意VS和FS點會同時被并行執行,多個點可以同時處理。

最簡單的Shader代碼

1.Vertext shader (頂點著色器)

/*vec4是齊次坐標 vector.xyzw 其中xyzw 可以任意組合 vector.rgba 其中rgba 可以任意組合 vector.stpq 其中rgba 可以任意組合 */ attribute vec4 position; //vec4是齊次坐標 uniform mat4 U_ModelMatrix; //mat4是4x4矩陣 ,模型矩陣需要從C++傳遞過來 uniform mat4 U_ViewMatrix; //視口矩陣需要從C++傳遞過來 uniform mat4 U_ProjectionMatrix; //投影矩陣需要從C++傳遞過來 void main(){//自右向左,模型空間下的點-》世界坐標系-》視口矩陣轉到視口空間,攝像機看到的帶你-》屏幕空間gl_Position = U_ProjectionMatrix * U_ViewMatrix * U_ModelMatrix * position; }

2.Fragment shader (片元著色器)

void main(){gl_FragColor = vec4(1.0,1.0,1.0,1.0); //gl_FragColor是輸出點的顏色 }

詳解Attribute和Uniform關鍵字

1Uniform,使用的一些變量都是一樣的使用Uniform。?

2.Attribute,隨著屬性組變化使用Attribute。

4.varying ,主要負責在vertex 和 fragment 之間傳遞變量。

3. OPenGLES2.0最多支持8個屬性組,3.0支持16個。

更多相關參考

詳解3D渲染管線

1.MVP(M,模型矩陣;V,視口矩陣;P,投影矩陣)

自右向左,世界坐標系----------》模型空間下的點-----》視口矩陣轉到視口空間,攝像機看到的帶你---------》屏幕空間

總結

以上是生活随笔為你收集整理的【Android OpenGL ES 开发 (二)】渲染管线与Shader的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。