opengles绘画单元和光栅化

opengl es 2.0只支持三种绘画单元:
三角形,直线和点精灵。

GL_TRIANGLES
GL_TRIANGLES_STRIP
GL_TRIANGLES_FAN


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 glDrawArrays(
GLenum mode, //GL_TRIANGLES
GLint first, //在顶点数组里面的第一个顶点的索引
GLsizei count //有几个索引
)
(GL_TRIANGLES,0,6)表示画两个三角形
(GL_TRIANGLE_STRIP,0,5)表示画3个三角形(0,1,2),(2,1,3),(2,3,4)
由于这个函数没有使用索引,因此他的顶点数组里面的顶点需要是排好序的。




void glDrawElements(
GLenum mode, //GL_TRIANGLES等。
GLsizei count, //索引个数
GLenum type, //索引数据的数据类型,
const GLvoid* indices //数据指针
)
索引数据的类型有:
GL_UNSIGNED_BYTE
GL_UNSIGNED_SHORT
GL_UNSIGNED_INT(这个不一定支持,需要OES_element_index_uint扩展)


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);
得到允许的点精灵的大小。


注意窗口的坐标表示是(0,0)到(left,bottom)。
而点精灵的坐标原点是:(left,top)。



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。


























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值