opengles繪製點精靈
阿新 • • 發佈:2019-02-14
什麼是點精靈
opengl圖形由頂點構成,所謂點精靈就是對點進行紋理對映,簡單說就是把一副紋理貼在一個點上
原來4個頂點構成一個矩形,現在一個頂點就完成了,典型的如粒子效果,雲霧,水流火花都可以用點精靈來實現
,這樣減少了3個頂點的計算,效率很高。下面看例子 我們把 這個圖片貼到4個頂點上面
shader實現
virtual void initialize() { //gl_PointSize 表示點的大小 const char* vs = { "precision lowp float;\n" "uniform mat4 _MVP;\n" "uniform float _pointSize;\n" "attribute vec2 _position;\n" "attribute vec4 _color;\n" "varying vec4 _outColor;\n" "void main()\n" "{" " vec4 pos = vec4(_position,0,1);\n" " _outColor = _color;\n" " gl_Position = _MVP * pos;\n" " gl_PointSize= _pointSize;\n" "}" }; //gl_PointCoord 點精靈的二維空間座標範圍在(0.0,0.0)到(1.0,1.0)之間,僅用於點圖元和點精靈開啟的情況下 const char* ps = { "precision lowp float;\n" "uniform sampler2D _texture;\n" "varying vec4 _outColor;\n" "void main()\n" "{\n" " vec4 texColor= texture2D( _texture, gl_PointCoord );\n" " gl_FragColor = _outColor * texColor;" "}" };
渲染函式:
virtual void render() { struct Vertex { CELL::float2 pos; CELL::Rgba4Byte color; }; //! 清空緩衝區 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); //! 視口,在Windows視窗指定的位置和大小上繪製OpenGL內容 glViewport(0, 0, _width, _height); //! 建立一個投影矩陣 CELL::matrix4 screenProj = CELL::ortho<float>(0, float(_width), float(_height), 0, -100.0f, 100); _shader.begin(); { float x = 100; float y = 100; float w = 300; float h = 300; Vertex vertex[] = { CELL::float2(x, y), CELL::Rgba4Byte(255, 0, 0, 255), CELL::float2(x + w, y), CELL::Rgba4Byte(0, 255, 0, 255), CELL::float2(x, y + h), CELL::Rgba4Byte(0, 0, 255, 255), CELL::float2(x + w, y + h), CELL::Rgba4Byte(255, 255, 255, 255), }; glBindTexture(GL_TEXTURE_2D, _sprit); glUniform1i(_shader._texture, 0); glUniform1f(_shader._pointSize, 64); glUniformMatrix4fv(_shader._MVP, 1, false, screenProj.data()); glVertexAttribPointer(_shader._position, 2, GL_FLOAT, false, sizeof(Vertex), vertex); glVertexAttribPointer(_shader._color, 4, GL_UNSIGNED_BYTE, true, sizeof(Vertex), &vertex[0].color); glDrawArrays(GL_POINTS, 0, 4); } _shader.end(); }
完整專案下載地址:http://download.csdn.net/detail/hb707934728/9845362