#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;
}
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Microsoft Visual C++(简称VC)进行三维管线的开发,以及这个源代码包中可能包含的关键元素。三维管线是计算机图形学中的核心概念,它负责将几何数据转换为屏幕上可见的像素。在...
1. **设置颜色缓冲区和深度缓冲区**:在开始绘制前,我们需要启用深度测试,以确保正确处理多个图元的前后关系。这可以通过调用`glEnable(GL_DEPTH_TEST)`完成。同时,设置颜色缓冲区以支持透明效果,使用`...
7. **深度测试**:为了正确绘制重叠的3D物体,OpenGL提供了深度缓冲区,根据物体的远近决定哪些像素应该被绘制。 8. **状态机**:OpenGL是一个状态机,许多设置(如颜色、深度测试、混合模式等)一旦设定,就会持续...
6. **颜色混合**:将计算出的颜色值与帧缓冲区已有颜色进行混合,生成最终的像素颜色。 接下来,我们关注物体表面材质属性的编辑。材质属性包括颜色、反射率、透明度等,它们影响物体对光的反应。例如,金属材质...
此资源旨在帮助开发者掌握在Windows环境下使用Visual C++进行高效、高质量的三维图形编程。 OpenGL是跨平台的图形库,它为开发人员提供了直接控制硬件的能力,用于创建复杂的3D场景和动画。在源代码中,`newogl`...
9. **缓冲区(Buffers)**:OpenGL使用各种缓冲区,如颜色缓冲区、深度缓冲区等,来优化渲染过程。 10. **状态机(State Machine)**:OpenGL维护了一系列的状态,如颜色、深度测试、混合模式等,程序员可以设置...
设备初始化涉及设置窗口模式、呈现目标、深度缓冲区等参数。 2. **顶点缓冲区**:3D模型由多个顶点组成,顶点缓冲区用于存储这些顶点数据,包括位置、颜色、法线向量等信息。C#代码可以通过` SharpDX.Direct3D9....
3. **深度测试**:在3D场景中,为了正确地绘制物体,OpenGL使用深度缓冲区进行深度测试。它比较新绘制的像素与已存在的像素的深度值,以确定哪个应该出现在前面。 4. **光照与着色**:OpenGL支持多种光照模型,如...
7. 清除缓冲区:在每一帧开始时,清除颜色和深度缓冲区,以便绘制新图像。 8. 主循环:持续处理输入,更新模型,渲染新的帧,并重复上述步骤。 三、OpenGL函数库 1. gl函数:基础的OpenGL函数,如`glBegin`和`glEnd...
三维流水管线是计算机图形学中的一个重要概念,尤其是在游戏开发和实时渲染领域中广泛使用。它是一种将复杂的3D模型转化为2D屏幕上可见图像的过程模型,有效地优化了计算资源的分配和利用,使得实时渲染成为可能。这...
处理过的像素颜色被写入帧缓冲区,最终通过显示器显示出来。在此过程中,可能会涉及到抗锯齿、后期处理特效等优化操作。 在使用VC6.0进行图形学编程时,需要了解OpenGL或Direct3D API的用法,以及如何配置编译环境...
点云数据是通过激光雷达、深度相机等设备采集到的真实世界表面的离散采样点集合,每个点包含三维坐标(X、Y、Z)以及可能的额外信息,如颜色、法线方向等。读取点云数据首先需要理解数据格式,常见的有.ply、.las、....
10. **帧缓冲区(Framebuffer)**:定义了OpenGL渲染的目标,可以扩展到多个颜色或深度缓冲区。 通过学习和实践,开发者能够利用OpenGL创建复杂的3D应用程序,如游戏、模拟器、虚拟现实环境等。"opengl最好的书...
在本教程中,我们将深入探讨如何使用Visual C++2008结合OpenGL库来创建令人惊叹的三维动画。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D图形,它允许程序员直接控制硬件,从而实现高效且高质量的图形渲染...
OpenGL的渲染管线是一系列处理图形数据的步骤,包括顶点着色、裁剪、栅格化、深度测试、混合和输出到帧缓冲区等。 OpenGL通过使用着色器语言GLSL(OpenGL Shading Language)提供了高级的图形渲染能力,开发者可以...
5. **深度测试**:理解深度缓冲区的工作原理,解决遮挡问题。 6. **光照与材质**:学习光照模型和材质参数,模拟真实世界的光照效果。 7. **纹理映射**:使用纹理图像装饰3D模型,增加真实感。 8. **着色器编程**:...
在Windows编程环境中,使用OpenGL进行三维图形绘制通常涉及到多个步骤和技术。OpenGL是一个强大的跨语言、跨平台的图形库,用于渲染2D、3D矢量图形。在这个场景中,我们讨论的是如何在对话框(Dialog)这样的用户...
为了创建三维效果,可以使用`glRotatef()`来旋转物体,`glTranslatef()`进行平移,`glScalef()`进行缩放。此外,还可以使用`glColor3f()`设置顶点颜色,`glLineWidth()`设定线条宽度,`glPolygonMode()`选择填充模式...
6. 渲染:调用`glClear`清除屏幕和深度缓冲区,然后使用`glDrawArrays`或`glDrawElements`进行实际的绘制。 7. 深度测试和混合:确保正确的绘制顺序和透明效果。 8. 刷新和交换缓冲区:调用`glSwapBuffers`,将渲染...
OpenGL是计算机图形学领域广泛应用的一种跨语言、跨平台的编程接口,它允许程序员直接控制显卡硬件进行高性能的三维图形渲染。本资源“OpenGL.rar”包含了一份关于OpenGL的详细帮助文档,特别适用于C++环境下的三维...