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();
}