Opengl es2.0 學習筆記(五)圖元裝配
阿新 • • 發佈:2018-12-21
文章目錄
一、圖元型別
#define GL_POINTS 0x0000點 #define GL_LINES 0x0001線 #define GL_LINE_LOOP 0x0002閉合線 #define GL_LINE_STRIP 0x0003不閉合曲線 #define GL_TRIANGLES 0x0004三角形 #define GL_TRIANGLE_STRIP 0x0005臨近點三角形 #define GL_TRIANGLE_FAN 0x0006扇形三角形,主要是為畫圓的三角形
二、API
//傳入shader常量,正交投影 glUniformMatrix4fv(_shader._MVP, 1, false, screenProj.data()); //傳入shader常量顏色 glUniform4f(_shader._color,1,0,0,1); //指定頂點屬性Attribute //GLboolean normalized是否規格化 **規格化又叫做規格化數,是一種表示浮點數的規格化的表示方法,還可以通過修改階碼並同時移動尾數的方法使其滿足這種規範。** glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) //畫圖形 //引數mode 是圖元型別 //first 開始點 //數量 glDrawArrays (GLenum mode, GLint first, GLsizei count);
三、注意
1.畫線必須是2的整數倍2.shader的變數需要關聯
3.需要開啟和關閉頂點屬性
4.shader用完了也要關閉
5.傳入頂點屬性,建議使用偏移
四、虛擬碼
//頂點shader const char* vs = { "precision lowp float; " "uniform mat4 _MVP;" "attribute vec2 _position;" "void main()" "{" " vec4 pos = vec4(_position,0,1);" " gl_Position = _MVP * pos;" //正交矩陣乘以頂點座標 "}" }; //畫素shader const char* ps = { "precision lowp float; " "uniform vec4 _color;" "void main()" "{" " gl_FragColor = _color;" "}" }; namespace CELL { typedef tvec2<float> float2; template <typename T> struct tvec2 { typedef T value_type; typedef std::size_t size_type; typedef tvec2<T> type; value_type x; value_type y; tvec2(value_type const & s1, value_type const & s2) : x(s1), y(s2) {} } template <typename valType> tmat4x4<valType> ortho ( valType left, valType right, valType bottom, valType top, valType zNear, valType zFar ) { tmat4x4<valType> res(1); res[0][0] = valType(2) / (right - left); res[1][1] = valType(2) / (top - bottom); res[2][2] = - valType(2) / (zFar - zNear); res[3][0] = - (right + left) / (right - left); res[3][1] = - (top + bottom) / (top - bottom); res[3][2] = - (zFar + zNear) / (zFar - zNear); return res; } } //正交投影 CELL::matrix4 screenProj = CELL::ortho<float>(0,float(_width),float(_height),0,-100.0f,100); //頂點座標 CELL::float2 pos[] = { CELL::float2(x,y), CELL::float2(x + w,y), CELL::float2(y,y + h), CELL::float2(x + w, y + h), }; //此處省略shader的建立,編譯,連結,使用shader //開啟頂點屬性,Uniform是定量不用開啟 //傳入mvp矩陣 glUniformMatrix4fv(_shader._MVP, 1, false, screenProj.data()); //傳入顏色 glUniform4f(_shader._color,1,0,0,1); //傳入頂點座標 glVertexAttribPointer(_shader._position,2,GL_FLOAT,false,sizeof(CELL::float2),pos); //畫正方形 glDrawArrays(GL_TRIANGLE_STRIP,0,4); //關閉頂點屬性,關閉shader ~~~C++