缓存
1)颜色缓存:多重采样技术,动画中采用了双重缓冲技术
深度缓存:每个像素保留一个深度值,可以用来判断3维空间中物体的可见性
模板缓存:限制屏幕特定区域的绘制
2)缓存掩码:glDepthMask(GL_TRUE)则深度缓存可以写入, 此操作在将数据写入颜色、深度或者模板缓存区之前。
设置顶点的颜色和位置
void Initialize( )
{
glGenVertexArrays( NumVAOs, VAOs );
glBindVertexArray( VAOs[Triangles] );
struct VertexData {
GLubyte color[4];
GLfloat position[4];
};
VertexData vertices[NumVertices] = {
{{ 255, 0, 0, 255 }, { -0.90f, -0.90f }}, // Triangle 1
{{ 0, 255, 0, 255 }, { 0.85f, -0.90f }},
{{ 0, 0, 255, 255 }, { -0.90f, 0.85f }},
{{ 10, 10, 10, 255 }, { 0.90f, -0.85f }}, // Triangle 2
{{ 100, 100, 100, 255 }, { 0.90f, 0.90f }},
{{ 255, 255, 255, 255 }, { -0.85f, 0.90f }}
};
glGenBuffers( NumBuffers, Buffers );
glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );
glBufferData( GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW );
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "media/shaders/gouraud/gouraud.vert" },
{ GL_FRAGMENT_SHADER, "media/shaders/gouraud/gouraud.frag" },
{ GL_NONE, NULL }
};
GLuint program = LoadShaders( shaders );
glUseProgram( program );
glVertexAttribPointer(
vColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VertexData), BUFFER_OFFSET(0) );
glVertexAttribPointer(
vPosition, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(sizeof(vertices[0].color)) );
glEnableVertexAttribArray( vColor );
glEnableVertexAttribArray( vPosition );
}
多重采样
glEnable(GL_MULTISAMPLE) //只是对几何图元边缘的平滑技术
1) glGetIntegerv() 来查询多重采样的缓存,以判断是否请求成功glGetMultisamplefv() 查询样本位置信息
2)在片元着色器中用sample in vec4 color;来声明
如果不能用sample关键字来修改片元着色器,通过使用采样着色的方式
glEnable(GL_SAMPLE_SHADING)
glMinSampleShading(0.5) //设置最小采样着色的比率
片元测试
剪切测试: glEnable(GL_SCISSOR_TEST) glScissor(x, y, width, height)
多重采样: glEnable(GL_SAMPLE_COVERAGE) glSampleCoverage()
模板测试: glEnable(GL_STANCIL_TEST) glStencilFunc() glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP) //没通过
深度测试: glEnable(GL_DEPTH_TEST) glDepthFunc(GL_NEVER) //GL_LESS
融混测试: glEnable(GL_BLEDN) glBlendFunc() glBlendFuncSeparate()
抖动: glEnable(GL_DITHER) 提升颜色的分辨率
逻辑: glEnable(GL_COLOR_LOGIC_OP) glLogicOp(GL_COPY)
注意:深度测试一般会涉及到多边形偏移问题,可设置多边形光栅化方式。
遮挡查询
在深度测试之后,用来判断一系列复杂的集合物体的可见性,它不需要渲染全部的几何信息,而是先渲染它的包围体,这样降低了渲染资源的消耗
glGenQueries(1, &v);
glBeginQueries(GL_SAMPLES_PASSED, Query);
glDrawArrays();
glEndQuery(GL_SAMPLES_PASSED);
glGetQueryObjectiv(); //获取查询结果
...
glBeginConditionalRender(); //条件渲染,用来判断遮挡查询是否得到了有效的片元
glDrawArrays()
gnEndConditionalRender()
图元反走样(抗锯齿)
glEnable(GL_LINE_SMOOTH)
glHint(GL_LINE_SOOTH_HINT,GL_FASTEST); 线段的反走样
GL_POLYGON_SMOOTH_HINT GL_NICEST
GL_TEXTURE_COMPRESSION_HINT GL_DONT_CARE
GL_FRAGMENT_SHADER_DERIVATIVE_HINT
仅仅简述,自己查找
帧缓存、渲染缓存
帧缓存将数据的拷贝消耗最小化,同时对性能进行优化。
渲染缓存中的数据只有关联到一个帧缓存对象之后才有意义,用于存储格式化的图像数据,缓存的格式和要求渲染的格式必须同
glGenRenderbuffers() //先创建渲染缓存对象
glBindRenderbuffer()
glRenderbufferStorage()
glGenFramebuffers() //再创建帧缓存对象
glBindFramebuffers()
glFramebufferRenderbuffer() //绑定