步骤

1-初始化:

GLFW窗口,GLAD

2-计算球体顶点:

通过数学方法计算球体的每个顶点坐标

3-数据处理:

通过球体顶点坐标构造三角形网络,生成并绑定VAO&VBO&EBO(准备再GPU中进行处理),设置顶点属性指针(本质上就是告诉OpenGL如何处理数据)

4-着色器:

给出顶点和片段着色器,然后链接为着色器程序,渲染时使用着色器程序

5-渲染:

使用画线模式画圆,开启面剔除,剔除背面,使用线框模式画球,清空缓冲,交换缓冲区检查触发事件

6-结束:

释放资源

结果

填充模式和线框模式效果对比

开启面剔除和线框模式效果对比

只需要展示一个面,否则会有重合,此处剔除背面为例

代码

此处只给出main.cpp,具体工程参考评论中所对应课程的实验,拥有详细的实验步骤

main.cpp
/*
步骤:
1-初始化: GLFW窗口,GLAD
2-计算球体顶点:通过数学方法计算球体的每个顶点坐标
3-数据处理: 通过球体顶点坐标构造三角形网络,生成并绑定VAO&VBO&EBO(准备再GPU中进行处理),设置顶点属性指针(本质上就是告诉OpenGL如何处理数据)
4-着色器:给出顶点和片段着色器,然后链接为着色器程序,渲染时使用着色器程序
5-渲染:使用画线模式画圆,开启面剔除,剔除背面,使用线框模式画球,清空缓冲,交换缓冲区检查触发事件
6-结束:释放资源
*/
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include "Shader.h"
#include <iostream>
#include <math.h>
#include <vector>const unsigned int screen_width = 780;
const unsigned int screen_height = 780;
const GLfloat PI= 3.14159265358979323846f;
//将球横纵划分成50*50的网格
const int Y_SEGMENTS = 50;
const int X_SEGMENTS = 50;int main()
{/*1-初始化*///初始化GLFWglfwInit();//初始化GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//opengl版本号3.3glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 次版本号3glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式(无序向后兼容性)glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//如果使用的是Mac OS X系统,需加上这行glfwWindowHint(GLFW_RESIZABLE, false);//不可改变窗口大小//创建窗口(宽、高、窗口名称)auto window = glfwCreateWindow(screen_width, screen_height,"Sphere",nullptr,nullptr);//检测窗口是否创建成功if (window==nullptr){std::cout << "Failed to Create OpenGL Context" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);//将窗口的上下文设置为当前进程的主上下文//初始化GLAD,加载OpenGL指针地址的函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout<<"Failed to initialize GLAD"<<std::endl;return -1;}//指定当前视口尺寸(前两个参数为左下角位置,后两个参数是渲染窗口宽、高)glViewport(0, 0, screen_width, screen_height);std::vector<float> sphereVertices;std::vector<int> sphereIndices;/*2-计算球体顶点*///生成球的顶点for (int y=0;y<=Y_SEGMENTS;y++){for (int x=0;x<=X_SEGMENTS;x++){float xSegment = (float)x / (float)X_SEGMENTS;float ySegment = (float)y / (float)Y_SEGMENTS;float xPos = std::cos(xSegment * 2.0f * PI) * std::sin(ySegment * PI);float yPos = std::cos(ySegment * PI);float zPos = std::sin(xSegment * 2.0f * PI) * std::sin(ySegment * PI);sphereVertices.push_back(xPos);sphereVertices.push_back(yPos);sphereVertices.push_back(zPos);}}//生成球的Indicesfor (int i=0;i<Y_SEGMENTS;i++){for (int j=0;j<X_SEGMENTS;j++){sphereIndices.push_back(i * (X_SEGMENTS + 1) + j);sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j);sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j+1);sphereIndices.push_back(i* (X_SEGMENTS + 1) + j);sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j + 1);sphereIndices.push_back(i * (X_SEGMENTS + 1) + j + 1);}}/*3-数据处理*/unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);//生成并绑定球体的VAO和VBOglBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);//将顶点数据绑定至当前默认的缓冲中glBufferData(GL_ARRAY_BUFFER, sphereVertices.size() * sizeof(float), &sphereVertices[0], GL_STATIC_DRAW);GLuint element_buffer_object;//EBOglGenBuffers(1, &element_buffer_object);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer_object);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sphereIndices.size() * sizeof(int), &sphereIndices[0], GL_STATIC_DRAW);//设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);//解绑VAO和VBOglBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);/*4-着色器*/Shader shader("task3.vs", "task3.fs");/*5-渲染*///渲染循环while (!glfwWindowShouldClose(window)){//清空颜色缓冲glClearColor(0.0f, 0.34f, 0.57f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);shader.Use();//绘制球//开启面剔除(只需要展示一个面,否则会有重合)glEnable(GL_CULL_FACE);glCullFace(GL_BACK);glBindVertexArray(VAO);//使用线框模式绘制glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glDrawElements(GL_TRIANGLES, X_SEGMENTS * Y_SEGMENTS * 6, GL_UNSIGNED_INT, 0);//点阵模式绘制//glPointSize(5);//glDrawElements(GL_POINTS, X_SEGMENTS * Y_SEGMENTS * 6, GL_UNSIGNED_INT, 0);//交换缓冲并且检查是否有触发事件(比如键盘输入、鼠标移动)glfwSwapBuffers(window);glfwPollEvents();}/*6-结束*///删除VAO和VBO,EBOglDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteBuffers(1, &element_buffer_object);//清理所有的资源并正确退出程序glfwTerminate();return 0;}

【OpenGL】绘制球体相关推荐

  1. OpenGL绘制球体

    OpenGL绘制球体 于(0,0,0) 绘制一个半径R=1 的球体函数: sphere_entry void sphere_entry(int du, int dv){float gu = 3.141 ...

  2. OpenGL绘制球体模拟自由落体运动(基于Qt)

    自由落体的物理公式想必大家都清楚(y=vt+0.5gt^2). 但是用程序如何模拟这个过程呢? 1.其中比较关键的是设定一个计时器,在一个视觉暂留时间段(dt=0.02s)内根据小球的位置坐标绘制小球 ...

  3. Qt OpenGL(07)递归细分四面体法绘制球体

    文章目录 Qt OpenGL通过递归细分逼近球面 思路 下面就是绘制的代码: Widget.cpp 顶点着色器 片段着色器 Qt OpenGL通过递归细分逼近球面 在OpenGL中绘制球面,不是太简单 ...

  4. opengl绘制长方体线框_OpenGL绘图实例十之绘制3D机器人

    综述 通过上一节说的绘制3D图形基础,我们应该对绘制3D图形有了基本的认识,接下来我们就进行一个实例,绘制一个3D机器人. 本节我们要完成的任务有: 1.绘制一个仿真3D机器人(样式自选,参考例图), ...

  5. openGL绘制带纹理地球,并实现鼠标键盘控制

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.绘制球体 二.关键代码 球体类(Sphere) 主函数 顶点着色器 片元着色器 显示效果 源码下载 参考 前言 openGL绘制 ...

  6. python绘制球体_OpenGL三维球体数据生成与绘制【附源码】

    OpenGL三维球体数据生成与绘制源码: #include #include #include #include #include #include #include #include #includ ...

  7. OpenGL学习-球体和phong光照模型

    OpenGL学习-球体和phong光照模型 开发环境搭建参考:https://lexiaoyuan.blog.csdn.net/article/details/120059213 通用配置步骤 Vis ...

  8. openGL绘制带纹理太阳、地球、月亮,并且地球自转并且围绕太阳旋转。月亮自转也会围绕地球旋转

    openGL系列文章目录 前言 使用openGL绘制太阳.地球.月亮,太阳自转,地球自转并且围绕太阳旋转.月亮自转也会围绕地球旋转,其实月亮也会围绕太阳旋转的. 一.效果 还是有不满意的地方: 1.没 ...

  9. OpenGL绘制地球仪(包含环境配置)

    OpenGL绘制地球仪 文章目录 OpenGL绘制地球仪 环境配置 glut配置 glaux环境配置 源码 Main.cpp MyTexMgr.h MyTexMgr.cpp 资料下载 环境配置 使用软 ...

  10. 如何用 OpenGL 绘制雪花?

    作者 | 许向武 责编 | 张红月 出品 | CSDN博客 看冬奥才知道,阿勒泰不但是中国的"雪都",还是"人类滑雪起源地".这个说法是否成立,姑且不论,阿勒泰 ...

最新文章

  1. [Java工程师面试精选]Redis cluster集群模式的原理
  2. python tkinter 实现一个秒表 从0开始_Writeathon:从0开始实现的一个side project
  3. discuz“附件文件无法保存到远程服务器”故障的解决
  4. 在Heroku上创建node.js应用程序时,我应该将node_modules检入git吗?
  5. 关于大型网站技术演进的思考(一)--存储的瓶颈(上)
  6. Asp中一些FSO方面的函数
  7. Hibernate模糊查询
  8. 分割函数python_python strip() 函数和 split() 函数的详解及实例
  9. 普通程序员,光靠GitHub打赏就年入70万,要不你也试试
  10. 白领体检异常率连年走高,这5本书教你怎样科学养生
  11. LR mobile HTTP/HTML协议实战
  12. VMware Harbor 学习
  13. 安装SQL Server 2000 出现挂起文件,需要重启该如何解决?
  14. 计算机报名中的照片审核总不过,软考报名时,照片审核难通过怎么办?
  15. android hdmi 开发,Android TV HDMI开发
  16. 软件测试技术学习总结
  17. 让 Directory Opus 支持 Windows 10 的暗色主题
  18. Pixelmator for Mac(全能图像编辑软件)
  19. repo init 下载代码error.GitError: manifests ls-remote: usage: git ls-remote
  20. 【收藏】2018年不容错过的20大人工智能/机器学习/计算机视觉等顶会时间表

热门文章

  1. 百度作业帮网上收集的面试题
  2. 利用Unity和高通实现简单的AR功能
  3. 普通人在互联网时代的机会
  4. linux 学习网站
  5. 字节内部人手一份,超大指令集鼠标垫,我粉丝每人包邮送一块!
  6. java水果超市心得体会,水果超市社会实践总结
  7. linux安装testlink步骤,Linux下安装testlink
  8. qt barcode 生成一维条形码
  9. flexible wincc 弹窗,WinCC flexible 如何实现弹出窗口-工业支持中心-西门子中国
  10. Java岗面试必问!mysql视频教程百度云