欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGL 入门

程序员文章站 2023-12-27 10:25:57
...

OpenGL vs2019环境配置

OpenGL vs2019环境配置
注意每次新开项目都要 在“项目”中,选择“管理NuGet程序包”,并在浏览中搜索“nupengl",两个都要安装。

实验内容熟悉:显示一个茶壶

关于glNewList() OpenGL显示列表
OpenGL glViewport()函数

#include <stdlib.h>
#include <GL/glut.h>

void init();
void display();
void reshape(GLsizei , GLsizei );

int main(int argc, char** argv) {

	//初始化工具包
	glutInit(&argc, argv);

	//设置显示模式
	  //GLUT_SINGLE 设置为单缓存,一般是渲染一张图片,如果是动画的话就需要双缓存
	  //GLUT_RGB设置颜色模式
	  //GLUT_DEPTH设置景深模式	
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	
	//设置窗口属性
	  //设置窗口在屏幕上位置
	glutInitWindowPosition(0, 0);
	  //设置窗口大小
	glutInitWindowSize(500, 500);
	  //打开屏幕窗口
	glutCreateWindow("My first test");

	//调用绘图函数,回调函数,不间断监听
	glutReshapeFunc(reshape);
	glutDisplayFunc(display);

	init();//必要的其他初始化函数
	glutMainLoop();//进入循环

	return 0;
}

//初始化函数
void init() {

	glEnable(GL_DEPTH_TEST);// 用来开启更新深度缓冲区的功能,也就是,如果通过比较后深度值发生变化了,会进行更新深度缓冲区的操作。启动它,OpenGL就可以跟踪再Z轴上的像素,这样,它只会再那个像素前方没有东西时,才会绘画这个像素。	在做绘画3D时,这个功能最好启动,视觉效果比较真实。

	//光照系统
	 //设置一组位置信息,作为光源位置,前三个参数是xyz坐标,最后一个设为0是设定在无限远处,1则在屏幕前
	GLfloat posistion[] = { 1.0,1.0,1.0,0.0 };
	 //设置光源属性 光照系统有8个光源,这里采用的是0号光源GL_LIGHT0
	 //属性光源位置 GL_POSITION(可以替换成别的属性),传入position;
	glLightfv(GL_LIGHT0, GL_POSITION, posistion);//这两行相当于设置了一个太阳光
	//开启光照模式
	glEnable(GL_LIGHTING);
	//开启0号光源
	glEnable(GL_LIGHT0);

	//材质
	GLfloat ambient[] = { 0.0,0.0,0.0,1.0 };
	GLfloat diffuse[] = { 0.95,0.05,0.95,1.0 };
	GLfloat specular[] = { 1.0,1.0,1.0,1.0 };
	glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);//环境反射
	glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);//漫反射
	glMaterialfv(GL_FRONT, GL_SPECULAR, specular);//镜面反射
	glMaterialf(GL_FRONT, GL_SHININESS, 50.0);//镜面反射率,控制光斑大小


}

void display() {
	//glClearColor函数设置好清除颜色,即设定背景色
	glClearColor(0.75f, 0.75f, 0.75f, 1.0f);
	//glClear利用glClearColor函数设置好的当前清除颜色设置窗口颜色,即启动背景色
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	//你需要在glNewList()和glEndList()块之间存储OpenGL命令到显示列表中来优先渲染。这个过程叫做编译。glNewList()需要两个参数,第一个参数是glGenLists()函数返回的索引值,第二个参数是指定模式:是只编译还是编译并执行,GL_COMPLILE,GL_COMPLILE_AND_EXECUTE。
	 // 编译一个显示列表,存储一个茶壶
	glNewList(1, GL_COMPILE);
	  //绘制茶壶
    glutSolidTeapot(0.5);//void glutWireTeapot(GLdouble size);
	glEndList();
	 //绘制显示列表
	glCallList(1);

	//gLFlush()作用是将前面写入缓冲区中的指令(无论是否为满)立刻送给图形硬件执行,发送完立即返回;
	glFlush();

}

void reshape(GLsizei w, GLsizei h) {

	//当更改窗口大小时,可使视口会进行相应变换
	glViewport(0, 0, w, h);//w ,h 在设置窗口大小的的时候会传到这里

	//将3d坐标投影成2d坐标
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	//裁剪视口(x min,x max,y min,y max,z min,z max),默认茶壶是初始化在(0,0,0)
	glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

	//将当前所选中的模型视图矩阵置为单位矩阵,即抛弃之前的更改
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

}

OpenGL 入门

上一篇:

下一篇: