opengles 2.0 点精灵 多边形偏移等备忘
opengl es 2.0只支持三種繪畫單元:
??? 三角形,直線和點精靈。
???
??? GL_TRIANGLES
??? GL_TRIANGLES_STRIP??? (指定n個頂點,繪制n-2個三角形)
??? GL_TRIANGLES_FAN??? (指定n個頂點,繪制n-2個三角形)
??? GL_LINES
??? GL_LINE_STRIP
??? GL_LINE_LOOP
??? GL_POINTS(這個是點精靈)
設置和獲得可以設置的直線的寬度:
??? void glLineWidth(GLfloat width);
??? GLfloat lw[2];
??? glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE,lw);
???
指定正面和背面:
??? void glFrontFace(GLenum dir)??? //GL_CW GL_CCW
???
??? void glEnable(GL_CULL_FACE);
??? void glCullFace(GL_FRONT GL_BACK GL_FRONT_AND_BACK);
點精靈:
???
??? 點精靈是一個與屏幕對齊的正方形,有position和radius。
??? 在shader里面有內建變量gl_PointSize,用來輸出點的半徑,由頂點shader輸出。
?? 得到允許的點精靈的大小:
??? GLfloat pointsizeRange[2];
??? glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE,pointsizeRange);
???
??? 注意opengles窗口的坐標范圍是:從左下角(原點)到右上角。
??? 而點精靈的原點是在左上角 坐標值 從0-1.
???
?? 如何設置點精靈的position和radius呢:
??? position當然是用頂點屬性來設置的。
??? radius在頂點shader里面設置,頂點shader里面有個內建的變量gl_PointSize用于設置
??? 點精靈的radius大小。
??? gl_PointCoord是片段shader的內建變量,vec2類型,mediump精度。
??? 在shader里面繪制點精靈的例子:
???
??? uniform sampler2D s_texSprite;
??? void main(void)
??? {
??????? gl_FragColor = texture2D(s_texSprite,gl_PointCoord);
??? }
?
基元處理流程:
???
??? 物體的坐標點 根據基元的類型跟視見體做裁剪,去掉看不到的部分
???????
??? 跟modelviewprojection相乘,然后再x/w, y/w, z/w得到normalized設備坐標(-1.0到1.0)。
??? 視口轉換階段:
??? 用到兩個函數:
??? glViewport(x,y,w,h)和glDepthRange(near, far);???
??? 利用這個(x/w, y/w, z/w)坐標,在根據視口的尺寸,就可以得到物體在屏幕上的x,y坐標。
??? 根據z/w和glDepthRange()指定的near和far深度值。
??? 具體計算方式請看
多邊形偏移:
???
??? 當繪制兩個完全重疊的物體時,渲染出來的效果會出現相互滲透的現象,
??? 這是由于精度有限的緣故,這種現象如果光靠提高精度
??? 是不能完全解決的,所以需要使用多邊形偏移技術,
??? 若開啟多邊形偏移,在做深度測試和深度寫入之前,給片段的深度值加
??? 一個delta,然后用這個值進行深度測試,如果深度測試通過,
??? 則會寫入原本的深度值,而不是depth+delta。
??? glEnable(GL_POLYGON_OFFSET_FILL);
??? glDisable(GL_POLYGON_OFFSET_FILL);
??? void glPolygonOffset(GLfloat factor, GLfloat units);
???
??????? depth offset = m*factor+r*units;
??? 書上個了個例子,factor=-1.0f,units=-2.0f。
轉載于:https://www.cnblogs.com/firstldp/p/3471714.html
總結
以上是生活随笔為你收集整理的opengles 2.0 点精灵 多边形偏移等备忘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何复制图文消息封面图片?正文没显示
- 下一篇: 汉诺塔解析附上代码