【Android OpenGL ES 开发 (二)】渲染管线与Shader
計算出每一幀耗費的時間
1.在頭文件中加入time.h,cpp中實現如下計算時間接口
float GetFrameTime(){static unsigned long long lastTime=0,currentTime=0;timeval current;gettimeofday(¤t, 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在电脑上玩手机游戏电脑如何玩手机游戏
- 下一篇: 【Android OpenGL ES 开