ldpzgz

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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。

posted on 2013-12-12 17:58  ldpzgz  阅读(1267)  评论(0编辑  收藏  举报