应用场景:加亮物体的边缘。
深度缓存会记录场景中物体与视点的距离。深度缓存主要用途是隐藏表面的消除。
void glPolygonOffset(GLfloat factor, GLfloat units);//设定偏移值
void glPolygonMode();//设定多边形的光栅化方式。
/*
GL_POLYGON_FILL /LINE /POINT
*/
offset = m * factor +r *units;
m 为多边形的最大斜率,r 为两个不同的深度之间可识别的最小差值。
m 计算方法为
m=(∂z∂x)2+(∂z∂y)2−−−−−−−−−−−−−−−√
或是
m=max(∂z∂x,∂z∂y)
未设置偏移的效果:
设置偏移效果:
void Basic::draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
CHECK_GL_ERROR();
GLboolean bDepth = glIsEnabled(GL_DEPTH_TEST);
glEnable(GL_DEPTH_TEST);
CHECK_GL_ERROR();
glClear(GL_COLOR_BUFFER_BIT);
CHECK_GL_ERROR();
const float position[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f,
};
float color0[] = {
1.0f,0.0f,0.0f,1.0f,
1.0f,0.0f,0.0f,1.0f,
1.0f,0.0f,0.0f,1.0f,
1.0f,0.0f,0.0f,1.0f};
glVertexAttribPointer(posIndex, 2, GL_FLOAT, false, 2 * sizeof(float), position);
glEnableVertexAttribArray(posIndex);
glVertexAttribPointer(colorIndex, 4, GL_FLOAT, false, 4* sizeof(float), color0);
glEnableVertexAttribArray(colorIndex);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
float color1[] = {
1.0f,1.0f,0.0f,1.0f,
1.0f,1.0f,0.0f,1.0f,
1.0f,1.0f,0.0f,1.0f,
1.0f,1.0f,0.0f,1.0f };
glVertexAttribPointer(colorIndex, 4, GL_FLOAT, false, 4 * sizeof(float), color1);
glEnable(GL_POLYGON_OFFSET_LINE);
glPolygonMode(GL_FRONT, GL_LINE);
glPolygonOffset(-1.0, -1.0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_POLYGON_OFFSET_LINE);
glDisableVertexAttribArray(posIndex);
glDisableVertexAttribArray(colorIndex);
glDisable(GL_DEPTH_TEST);
glPolygonMode(GL_FRONT, GL_FILL);
}