`
tiankefeng0520
  • 浏览: 143100 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习三十一:累积缓冲区

 
阅读更多

OpenGL除了颜色缓冲区、深度缓冲区、模板缓冲区之外,还有累积缓冲区。累积缓冲区允许你把渲染到颜色缓冲区的值,拷贝到累积缓冲区。在多次拷贝操作到累积缓冲区时,可以用不同方式的把颜色缓冲区内容和当前累积缓冲区的内容进行重复混合。当在累积缓冲区完成一幅图像之后,可以拷回颜色缓冲区,然后通过SwapBuffers显示到屏幕上。

累积缓冲区的操作通过void glAccum(GLenum op, GLfloat value);控制。第一个参数表示对累积缓冲区所进行的操作。第二个参数是浮点数用于指定缩放因子。

由于累积缓冲区会带来大内存的开销,所以在实时应用程序中比较少用。但在非实时的应用程序中,可以产生实时应用程序无法做到的效果。例如,你可以多次渲染场景,并在每次渲染时进行抖动零点几个像素,这样就可以产生整个场景的反走样的效果,比多重采样的效果还要好。还可以模糊前景或背景,然后清晰的渲染一个物体来模拟,照相机景深的效果

 

void DrawGemometry()
{
 glPushMatrix();
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 DrawGround();

 glColor3f(1.0f, 0.0f, 0.0f);
 glTranslatef(0.0f, 0.3f, -3.5f);
 glRotatef(-yRot*2.0f, 0.0f, 1.0f, 0.0f);
 glTranslatef(1.0f, 0.0f, 0.0f);
 glutSolidSphere(0.1f, 17, 13);
 glPopMatrix();
}
void RenderScene()
{
 yRot = 35.0f;
 pass = 10.0f;
 for ( i = 0; i < 2; ++i)
 { 
  yRot += 0.75f;
  DrawGemometry();

  //复制到累积缓冲区
  if (i == 0)
  {
   glAccum(GL_LOAD, 0.5f);// 1
  }
  else
  {
   //累加到累积缓冲区
   glAccum(GL_ACCUM, (0.5f * 1 / pass));//2
  }
 }
 glAccum(GL_RETURN, 1.0f);
 glutSwapBuffers();
}

在for循环10中,DrawGemometry将图元绘制到颜色缓冲区中,
glAccum(GL_LOAD, 0.5f);将颜色缓冲区的内容替换到累积缓冲区,
glAccum(GL_ACCUM, (0.5f * 1 / pass)) 将颜色缓冲区的内容添加到累积缓冲区,这样10次内容就都保存到了累积缓冲区。
glAccum(GL_RETURN, 1.0f);将累积缓冲区的内容拷贝到颜色缓冲区然后再进行翻页显示到屏幕上

 

void glAccum (GLenum op, GLfloat value);
op:GL_ACCUM,读取当前缓冲区中每个像素,把R,G,B,A值与value值相乘,然后把结果添加到累积缓冲区
GL_LOAD:于ACCUM功能基本相同,不同的是ACCUM是把结果添加到累积缓冲区,GL_LOAD是把结果替换到累积缓冲区
GL_RETURN从累积缓冲区接收值,把他们与value值相乘,然后把结果放入颜色缓冲区中
GL_ADD,把每个像素值与与value值相加,超出范围不会截取
GL_MULIT:把每个像素值与与value值相乘,范围控制在【-1,+1】

 

颜色通道屏蔽
void glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
例如,屏蔽R通道 glColorMask(GL_FALSE,GL_TRUE,GL_TRUE,GL_TRUE);

 

剔除操作
glEnalbe(GL_CULL_FACE) 开启剔除操作效果
glDisable(GL_CULL_FACE) 关闭剔除操作效果

glCullFace()参数包括GL_FRONT和GL_BACK。表示禁用多边形正面或者背面上的光照、阴影和颜色计算及操作,消除不必要的渲染计算。

例如某对象无论如何位置变化,我们都只能看到构成其组成的多边形的某一面时,可使用该函数。

 

抖动
抖动允许只有少量离散颜色的显示系统来模拟更宽范围的颜色。例如,灰色可以通过白点和黑点的混合来模拟。白点多于黑点呈现浅灰色,黑点多于白点呈现深灰色。这种技巧对于只支持8位和16位的显示系统非常有用。抖动的效果可以大幅度地改善低端颜色系统的图像质量。在默认情况下,抖动是打开的。可以通过glEnable(GL_DITHER)/glDisable(GL_DITHER)来打开或关闭它。在高颜色分辨率的显示系统中,OpenGL的实现可能不需要抖动,会禁用抖动来避免性能的开销。

 

#include "header.h"

GLfloat fLightPos[4] = { -100.0f, 100.0f, 50.0f, 1.0f };
GLfloat fNoLight[] = { 0.0f, 0.0f, 0.0f, 0.0f };
GLfloat fLowLight[] = { 0.25f, 0.25f, 0.25f, 1.0f };
GLfloat fBrightLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };

static GLfloat yRot;

void DrawGround()
{
	GLfloat fExtent = 20.0f;
	GLfloat y = -0.0f;
	GLfloat step = 0.5f;

	GLfloat x, z;
	int iColor = 0;
	glShadeModel(GL_FLAT);
	for (x = -fExtent; x <= fExtent; x += step)
	{
		glBegin(GL_TRIANGLE_STRIP);
		for (z = fExtent; z >= -fExtent; z -= step)
		{
			if ((iColor % 2) == 0)
			{
				glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
			}
			else
			{
				glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
			}
			glVertex3f(x, y, z);
			glVertex3f(x + step, y, z);

			iColor++;
		}
		glEnd();
	}
	glShadeModel(GL_SMOOTH);

}

void DrawGemometry()
{
	glPushMatrix();
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	DrawGround();

	glColor3f(1.0f, 0.0f, 0.0f);
	glTranslatef(0.0f, 0.3f, -3.5f);
	glRotatef(-yRot*2.0f, 0.0f, 1.0f, 0.0f);
	glTranslatef(1.0f, 0.0f, 0.0f);
	glutSolidSphere(0.1f, 17, 13);
	glPopMatrix();
}
	GLfloat pass = 10.0f;
	int i;
void RenderScene()
{
	yRot = 35.0f;
	pass = 10.0f;
	for ( i = 0; i < 20; ++i)
	{	
		yRot += 0.75f;
		DrawGemometry();

		//复制到累积缓冲区
		if (i == 0)
		{
			glAccum(GL_LOAD, 0.5f);
		}
		else
		{
			//累加到累积缓冲区
			glAccum(GL_ACCUM, (0.5f * 1 / pass));
		}
	}



	glAccum(GL_RETURN, 1.0f);
	glColorMask(GL_FALSE,GL_TRUE,GL_TRUE,GL_TRUE);
	glutSwapBuffers();

}
GLfloat faspect;
void ChangeSize(GLsizei w, GLsizei h)
{
	if (h == 0)
		h = 1;

	glViewport(0, 0, w, h);

	 faspect = (GLfloat)w/(GLfloat)h;

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(35.0f, faspect, 1.0f, 50.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(0.0f, -0.4f, 0.0f);

	glutPostRedisplay();
}

void SetupRC()
{
	glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
	glClearAccum(0,0,0,0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
	glCullFace(GL_BACK);
	glFrontFace(GL_CCW);

	//设置光照
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, fNoLight);
	glLightfv(GL_LIGHT0, GL_AMBIENT, fLowLight);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, fBrightLight);
	glLightfv(GL_LIGHT0, GL_SPECULAR, fBrightLight);
	glLightfv(GL_LIGHT0, GL_POSITION, fLightPos);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);

	//开启颜色追踪
	glEnable(GL_COLOR_MATERIAL);
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
	glMateriali(GL_FRONT, GL_SHININESS, 128);
}

int main(int args, char **argv)
{
	glutInit(&args, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE | GLUT_ACCUM);
	glutInitWindowSize(800, 600);
	glutCreateWindow("累积缓冲区");

	glutDisplayFunc(RenderScene);
	glutReshapeFunc(ChangeSize);

	SetupRC();

	glutMainLoop();
	return 0;
}

 

  • 大小: 20.4 KB
  • 大小: 11.3 KB
分享到:
评论

相关推荐

    现代OpenGL+Qt学习笔记之二:程序框架

    现代OpenGL+Qt学习笔记之二:程序框架http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77917697源码。

    OpenGL基础学习完整代码.zip

    对应的OpenGL学习博客:...此代码仅用于OpenGL入门学习。PS:可能会有点卡主要是因为:①使用的地面模型是高模(几十万个顶点)②使用的天空盒贴图是2040x2048的超大贴图6张;没办法只找到这些资源,所以只能将就着用了

    OpenGL模板缓冲区应用示例源代码

    OpenGL模板缓冲区应用示例源代码,代码比较简单,通过修改或注释模板缓冲区控制语句就可以明白其中奥秘。

    OpenGL新功能--顶点缓冲区 应用示例

    它展示了如何使用OpenGL的新功能──顶点缓冲区。相比旧式风格,这种用法可能还会显的复杂了些,但它带来的是速度的大幅度提升。就这一点儿,我们没有理由不使用它。  但请注意:此程序没有做功能检测,如果您的...

    OpenGL学习OpenGL学习

    OpenGL学习

    Opengl教程

    NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… ...怎样开始学习OpenGL

    现代OpenGL+Qt学习笔记之三:显示一个彩色三角形

    现代OpenGL+Qt学习笔记之三:显示一个彩色三角形http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77927876源码。

    OpenGL 学习资料大全

    收集到的OpenGL学习资料,内容包括: 1.OpenGL着色语言.rar 2.NEHE教程.pdf 3.openglapi.CHM 4.opengl编程与实例.pdf 5.openGL图像系统详解(英).pdf 6.vc下OpenGL开发框架与应用.pdf 7.北大 openGL 课程.pdf

    使用OpenGL画七条曲线: Bezier曲线 B样条曲线等

    使用OpenGL画七条曲线:Bezier曲线;3阶(2次)均匀B样条曲线;3阶(2次)准均匀B样条曲线;3阶(2次)分段B样条曲线;4阶(3次)均匀B样条曲线;4阶(3次)准均匀B样条曲线;4阶(3次)分段B样条曲线.rar

    openGL学习

    高级openGL教程,基于shader的openGL编程教程,快速上手

    opengl学习资料收集

    opengl学习资料收集,OpenGL中对数据类型的定义

    OpenGL ES 2 for Android A Quick-Start Guide

    OpenGL ES 2 for Android A Quick-Start Guide

    手动实现OpenGL部分功能:放缩、旋转、视角、缓冲区等等

    手动实现OpenGL部分功能:放缩、旋转、视角变换、操纵BMP文件、颜色缓冲区等等,写到这个程度就再没时间继续写下去了,总之给大家作为参考吧。

    qt+opengl实现帧缓冲

    qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl实现帧缓冲qt+opengl...

    基于C++OpenGL实现的小桌茶壶图形绘制.zip

    在模型变换实验的基础上,通过实现下述实验内容,掌握OpenGL中三维观察、透视投影、正交投影的参数设置,并能使用键盘移动观察相机,在透视投影和正交投影间切换,验证课程中三维观察的内容;进一步加深对OpenGL三维...

    OpenGL ES学习资料

    学习OpenGL ES的必备资料: 1.opengl和opengl_es的区别 2.OpenGL_ES基础入门 3.OpenGL+ES+2.0+编程指南+中文版 4.OpenGL+ES常用API 5.OpenGL_ES总结

    openGL双缓冲用法示例

    OpenGL双缓冲的示例 VC++环境源码

    OpenGL入门学习之十三——OpenGL是一个状态机.pdf

    OpenGL入门学习之十三——OpenGL是一个状态机.pdf

    opengl及相关学习资料

    opengl及相关学习资料,包含: OpenGL-programming-guide-6th-edition.pdf及源码 OpenGLProgrammingGuide7thEditionCHS.pdf及源码 OpenGL ES Game Development.2004.pdf OpenGL ES 2.0 Programming Guide.pdf Mobile...

    利用OpenGL绘制一个简单场景:比如球体、正方体

    利用OpenGL绘制一个简单场景:比如球体、正方体;加入灯光;实现交互操作:平移、缩放、旋转

Global site tag (gtag.js) - Google Analytics