`
sunlong
  • 浏览: 86050 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

使用深度缓冲区进行三维混合代码

阅读更多
#include <GLUT.H>
#include <stdio.h>
#include <tchar.h>

GLuint sphereList, cubeList;

static float solidZ = 8.0;
static float transparentZ = -8.0;
#define ZINC 0.4

void init()
{
	GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 0.15f};
	GLfloat mat_shininess[] = {100.0};
	
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

	GLfloat position[] = {0.5f, 0.5f, 1.0f, 0.0};
	glLightfv(GL_LIGHT0, GL_POSITION, position);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);

	sphereList = glGenLists(1);
	glNewList(sphereList, GL_COMPILE);
	glutSolidSphere(0.4, 16, 16);
	glEndList();

	cubeList = glGenLists(1);
	glNewList(cubeList, GL_COMPILE);
	glutSolidCube(0.6);
	glEndList();
	//glEnable(GL_POLYGON_SMOOTH);
}

void display()
{	
	GLfloat mat_solid[] = {0.75, 0.75, 0.0, 1.0};
	GLfloat mat_zero[] = {0.0, 0.0, 0.0, 1.0};
	GLfloat mat_transparent[] = {0.0, 0.8, 0.8, 0.6};
	GLfloat mat_emission[] = {0.0, 0.3, 0.3, 0.6};

	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glPushMatrix();
		glTranslatef(-0.15, -0.15, solidZ);
		glMaterialfv(GL_FRONT, GL_EMISSION, mat_zero);
		glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_solid);
		glCallList(sphereList);
	glPopMatrix();

	glPushMatrix();
		glTranslatef(0.15, 0.15, transparentZ);
		glRotatef(15.0, 1.0, 1.0, 0.0);
		glRotatef(30.0, 0.0, 1.0, 0.0);
		glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
		glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_transparent);
		glEnable(GL_BLEND);
		glDepthMask(GL_FALSE);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE);
		glCallList(cubeList);
		glDepthMask(GL_TRUE);
		glDisable(GL_BLEND);
	glPopMatrix();
	
	glutSwapBuffers();
	glFlush();
}
void idleFunc()
{
	if(solidZ<=-8.0 || transparentZ>=8.0)
	{
		glutIdleFunc(NULL);
	}
	else
	{
		solidZ -= ZINC;
		transparentZ += ZINC;
		glutPostRedisplay();
	}	
}
void reshape(int width, int height)
{
	glViewport(0, 0, width, height);
	float ratio = (float)width/(float)height;
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//glFrustum(-ratio, ratio, -1, 1, 1, 100);
	if(width<= height)
		glOrtho(-1.5, 1.5, -1.5*(GLfloat)height/(GLfloat)width,
			1.5*(GLfloat)height/(GLfloat)width, -10.0, 10.0);
	else
		glOrtho(-1.5*(GLfloat)width/(GLfloat)height, 1.5*(GLfloat)width/(GLfloat)height, -1.5, 1.5, -10.0, 10.0);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
	switch(key)
	{
	case 'r':
		solidZ = 8.0;
		transparentZ = -8.0;
		glutPostRedisplay();
		break;
	case 'a':
		solidZ = 8.0;
		transparentZ = -8.0;
		glutIdleFunc(idleFunc);
		break;
	case 27: exit(0);
	default: break;
	}
	
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(600, 600);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	//glutIdleFunc(idleFunc);
	glutKeyboardFunc(keyboard);
	glutMainLoop();
	return 0;
}
 
分享到:
评论

相关推荐

    一个用VC开发的三维管线的源代码

    在本文中,我们将深入探讨如何使用Microsoft Visual C++(简称VC)进行三维管线的开发,以及这个源代码包中可能包含的关键元素。三维管线是计算机图形学中的核心概念,它负责将几何数据转换为屏幕上可见的像素。在...

    Android OpenGL ES 绘制三维/空间坐标系透明

    1. **设置颜色缓冲区和深度缓冲区**:在开始绘制前,我们需要启用深度测试,以确保正确处理多个图元的前后关系。这可以通过调用`glEnable(GL_DEPTH_TEST)`完成。同时,设置颜色缓冲区以支持透明效果,使用`...

    opengl 三维代码图

    7. **深度测试**:为了正确绘制重叠的3D物体,OpenGL提供了深度缓冲区,根据物体的远近决定哪些像素应该被绘制。 8. **状态机**:OpenGL是一个状态机,许多设置(如颜色、深度测试、混合模式等)一旦设定,就会持续...

    简单渲染生成真实三维图形 纹理贴图

    6. **颜色混合**:将计算出的颜色值与帧缓冲区已有颜色进行混合,生成最终的像素颜色。 接下来,我们关注物体表面材质属性的编辑。材质属性包括颜色、反射率、透明度等,它们影响物体对光的反应。例如,金属材质...

    Visual C++ OpenGL DirectX 三维动画编程宝典源代码

    此资源旨在帮助开发者掌握在Windows环境下使用Visual C++进行高效、高质量的三维图形编程。 OpenGL是跨平台的图形库,它为开发人员提供了直接控制硬件的能力,用于创建复杂的3D场景和动画。在源代码中,`newogl`...

    OpenGL 动态的三维人脸图形的Delphi源程序.rar

    9. **缓冲区(Buffers)**:OpenGL使用各种缓冲区,如颜色缓冲区、深度缓冲区等,来优化渲染过程。 10. **状态机(State Machine)**:OpenGL维护了一系列的状态,如颜色、深度测试、混合模式等,程序员可以设置...

    c#导入三维动画

    设备初始化涉及设置窗口模式、呈现目标、深度缓冲区等参数。 2. **顶点缓冲区**:3D模型由多个顶点组成,顶点缓冲区用于存储这些顶点数据,包括位置、颜色、法线向量等信息。C#代码可以通过` SharpDX.Direct3D9....

    OpenGl三维图形设计

    3. **深度测试**:在3D场景中,为了正确地绘制物体,OpenGL使用深度缓冲区进行深度测试。它比较新绘制的像素与已存在的像素的深度值,以确定哪个应该出现在前面。 4. **光照与着色**:OpenGL支持多种光照模型,如...

    利用OpenGL实现三维绘图

    7. 清除缓冲区:在每一帧开始时,清除颜色和深度缓冲区,以便绘制新图像。 8. 主循环:持续处理输入,更新模型,渲染新的帧,并重复上述步骤。 三、OpenGL函数库 1. gl函数:基础的OpenGL函数,如`glBegin`和`glEnd...

    三维流水管线

    三维流水管线是计算机图形学中的一个重要概念,尤其是在游戏开发和实时渲染领域中广泛使用。它是一种将复杂的3D模型转化为2D屏幕上可见图像的过程模型,有效地优化了计算资源的分配和利用,使得实时渲染成为可能。这...

    计算机图形学 三维管线

    处理过的像素颜色被写入帧缓冲区,最终通过显示器显示出来。在此过程中,可能会涉及到抗锯齿、后期处理特效等优化操作。 在使用VC6.0进行图形学编程时,需要了解OpenGL或Direct3D API的用法,以及如何配置编译环境...

    三维点云数据的读取和模型显示-源码

    点云数据是通过激光雷达、深度相机等设备采集到的真实世界表面的离散采样点集合,每个点包含三维坐标(X、Y、Z)以及可能的额外信息,如颜色、法线方向等。读取点云数据首先需要理解数据格式,常见的有.ply、.las、....

    OpenGL三维图形编程指南.zip_OpenGL书_opengl 三维_opengl三维_opengl三维图形_图形编程

    10. **帧缓冲区(Framebuffer)**:定义了OpenGL渲染的目标,可以扩展到多个颜色或深度缓冲区。 通过学习和实践,开发者能够利用OpenGL创建复杂的3D应用程序,如游戏、模拟器、虚拟现实环境等。"opengl最好的书...

    使用Visual C++2008的OpenGL三维动画制作

    在本教程中,我们将深入探讨如何使用Visual C++2008结合OpenGL库来创建令人惊叹的三维动画。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D图形,它允许程序员直接控制硬件,从而实现高效且高质量的图形渲染...

    基于OpenGL和ODE的三维物理仿真模型的设计

    OpenGL的渲染管线是一系列处理图形数据的步骤,包括顶点着色、裁剪、栅格化、深度测试、混合和输出到帧缓冲区等。 OpenGL通过使用着色器语言GLSL(OpenGL Shading Language)提供了高级的图形渲染能力,开发者可以...

    visual.c_opengl_directx三维动画编程宝典.rar

    5. **深度测试**:理解深度缓冲区的工作原理,解决遮挡问题。 6. **光照与材质**:学习光照模型和材质参数,模拟真实世界的光照效果。 7. **纹理映射**:使用纹理图像装饰3D模型,增加真实感。 8. **着色器编程**:...

    在对话框的控件中实现OpenGl三维绘图

    在Windows编程环境中,使用OpenGL进行三维图形绘制通常涉及到多个步骤和技术。OpenGL是一个强大的跨语言、跨平台的图形库,用于渲染2D、3D矢量图形。在这个场景中,我们讨论的是如何在对话框(Dialog)这样的用户...

    VC++使用OpenGL绘制三维图形的实例.rar

    为了创建三维效果,可以使用`glRotatef()`来旋转物体,`glTranslatef()`进行平移,`glScalef()`进行缩放。此外,还可以使用`glColor3f()`设置顶点颜色,`glLineWidth()`设定线条宽度,`glPolygonMode()`选择填充模式...

    利用Opengl显示复杂三维图形的一种方法

    6. 渲染:调用`glClear`清除屏幕和深度缓冲区,然后使用`glDrawArrays`或`glDrawElements`进行实际的绘制。 7. 深度测试和混合:确保正确的绘制顺序和透明效果。 8. 刷新和交换缓冲区:调用`glSwapBuffers`,将渲染...

    OpenGL.rar_opengl 三维软件

    OpenGL是计算机图形学领域广泛应用的一种跨语言、跨平台的编程接口,它允许程序员直接控制显卡硬件进行高性能的三维图形渲染。本资源“OpenGL.rar”包含了一份关于OpenGL的详细帮助文档,特别适用于C++环境下的三维...

Global site tag (gtag.js) - Google Analytics