OpenGL入门(二)

背景

上一篇文章我们已经初步介绍了OpenGL的基本概念,准确来说OpenGL只是一个规范,基于这个规范提供了库去实现图像编程。OpenGL的很多操作都是基于一个窗口,今天我们就来实现创建一个简单的窗口,talk is cheap,show me your code。

环境配置

工欲善其事, 必先利其器,在正式开发之前还需要搭建一下环境,这里仅仅以个人的环境为例,不同的平台可以去google一下,有很多相关的文章,我自己使用的是Mac,为了方便编辑器使用的是VS Code。
step1:
在正式开始之前需要先安装GLFW,GLFW是一个C语言写的库,符合OpenGLd的标准,使用GLFW可以创建一个OpenGL的context,创建并定义一个窗口的参数以及处理用户的输入,安装后其安装位置要记住,之后需要使用。

brew install glfw

step2:

下载glad,可以去下载页面下载,使用一下配置即可:

glad配置
glad配置

然后点击下面的生成按钮并且下载。然后新建一个文件夹将解压后的include和src文件夹复制到新建的文件夹。 这个glad是一个开源库,正如之前我们所提到的OpenGL只是一个标准,具体的实现是有各个显卡厂商完成的, 所以显卡驱动的版本有很多种类,虽然都是基于OpenGL标准,实现的函数和最终的效果是一样的,但是函数的位置在编译期是无法知道的,且需要在运行时检索这些函数,然后将这些函数的位置存储在函数指针中以便之后使用,而这个检索函数的过程又是与操作系统高度相关的,而glad就是用来帮助开发者完成这些繁琐的过程。

step3:

新建CMakeList.txt文件,其内容如下,记得替换GLFW_H和GLFW_LINK的地址,在安装GLFW完成时会提示安装的位置。

cmake_minimum_required(VERSION 3.0.0)
project(HelloGL VERSION 0.1.0)

# 使用 C++ 11 标准
set(CMAKE_CXX_STANDARD 11)

# 添加头文件
set(GLAD_H ${PROJECT_SOURCE_DIR}/include)
set(GLFW_H /usr/local/include)
include_directories(${GLAD_H} ${GLFW_H}</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用OpenGL绘制地球,可以按照以下步骤进行: 1.创建一个OpenGL窗口和环境。 2.加载地球的纹理图像,并将其映射到一个球体上。 3.创建一个球体的顶点缓冲区,并将其绑定到OpenGL上下文中。 4.编写着色器程序来绘制球体,并将其绑定到OpenGL上下文中。 5.使用OpenGL命令来绘制球体,并将其显示在OpenGL窗口中。 以下是一个简单的OpenGL绘制球体的代码示例: ```c++ #include <GL/glut.h> #include <iostream> #include <cmath> using namespace std; #define PI 3.14159265358979323846 // 地球半径 const double EARTH_RADIUS = 6378.137; // 角度转弧度 double Angle2Radian(double angle) { return angle * PI / 180.0; } // 绘制球体 void DrawSphere(double r) { const int n = 50; const int m = 50; double angle1, angle2; double x1, y1, z1, x2, y2, z2; double step1 = PI / n; double step2 = 2 * PI / m; for (int i = 0; i < n; i++) { angle1 = i * step1; angle2 = angle1 + step1; glBegin(GL_TRIANGLE_STRIP); for (int j = 0; j <= m; j++) { x1 = r * sin(angle1) * cos(j * step2); y1 = r * sin(angle1) * sin(j * step2); z1 = r * cos(angle1); x2 = r * sin(angle2) * cos(j * step2); y2 = r * sin(angle2) * sin(j * step2); z2 = r * cos(angle2); // 绘制三角形 glVertex3d(x1, y1, z1); glVertex3d(x2, y2, z2); } glEnd(); } } // 显示回调函数 void Display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制球体 DrawSphere(EARTH_RADIUS); glFlush(); } // 窗口大小变化回调函数 void Reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)w / (double)h, 1.0, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 1000, 0, 0, 0, 0, 1, 0); } // 初始化函数 void Init() { glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); // 加载地球纹理图像 GLuint tex = 0; glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); // 设置材质属性 GLfloat mat_ambient[] = {0.0, 0.0, 0.0, 1.0}; GLfloat mat_diffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat mat_shininess[] = {100.0}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); // 设置光源属性 GLfloat light_position[] = {0.0, 0.0, 500.0, 1.0}; GLfloat light_ambient[] = {0.0, 0.0, 0.0, 1.0}; GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0}; glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); } // 主函数 int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Sphere"); glutDisplayFunc(Display); glutReshapeFunc(Reshape); Init(); glutMainLoop(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值