【OpenGL实践-09】用图元作图笔记

文章目录

  • 一、说明
  • 二、下列程序使用库
  • 三、OpenGL图元盘点
  • 四、图元解析
    • 4.1 线段
    • 4.2 表面surface
    • 4.3 三角形表面surface
  • 五、图元作图示例
    • 5.1 三角链和圆环GL_TRIANGLE_STRIP
    • 5.2 三角链和圆环
  • 六、三维物体渲染
    • 6.1 直纹面
    • 6.2 旋转面
  • 七、GLSL程序优化代码
    • 7.1 顶点着色器
    • 7.2 几何着色器
    • 7.2 片段着色器

一、说明

在OPenGL的图元设计中,已经包含一定的算法,仔细研究,我们就会发现,一些对象的生成方式,就是通过灵活运用图元完成的。本文将按照图元的给定方法,渲染出若干物体对象。

二、下列程序使用库

在我们的 OpenGL 程序中使用了以下三组软件库:

  • OpenGL 核心库(GL):包含数以百计的函数,以 “gl”开头(例如:glColor,glVertex, glTranslate,glRotate)。OpenGL 核心库通过一组几何图元(例如点,线,多边形)来进行建模。
  • OpenGL 实用程序库(GLU):基于 OpenGL 核心构建,提供一些重要的实用程序(例如:设置摄像机以及投影),以 “glu”开头(例如:gluLookAt,gluPerspective)。
  • OpenGL 实用工具包(GLUT):OpenGL 被设计为独立于操作系统。因此我们需要 GLUT 来与操作系统进行交互(例如:创建窗口,处理键盘和鼠标输入),其提供的函数以 “glut” 开头(例如:glutCreatewindow,glutMouseFunc)。GLUT 是平台无关的,其基于平台相关的 OpenGL 扩展构建,例如对于 X Window 是 GLX,对于 Windows 系统是 WGL,对于 Mac OS 则是 AGL,CGL 或者 Cocoa。

三、OpenGL图元盘点

共有10种图元,这10个基本图元能较为方便地生成各自的曲线和曲面模型,如下图标所示。
在这里插入图片描述

四、图元解析

4.1 线段

  • GL_LINES:这是纯线段图像的图元,比如网格。或Frame这正是恰挡应用。也可以是机械制图作品描述。
  • GL_LINE_STRIP:这是外观复杂,但基本可以直线段描述的区域表述。
  • GL_LINE_LOOP:适应于以角度为参数的图形。圆周、椭圆,双曲线等。

4.2 表面surface

  • GL_POLYGON:多边形面,适应于大面积的面描述。
  • GL_QUARDS:适应于小面的拼接表述,如球面中经纬度相交后区域。
  • GL_QUARD_STRIP:条形或带形物体描述,球面也可。

4.3 三角形表面surface

  • GL_TRIGANLE:此适应任何复杂表面拼接。
  • GL_TRIANGLE_STRIP:绘制环面区域,条带等。
  • GL_TRIANGLE_FAN:对于锥体,直平面一类的有效。

复杂图像只能是线段渲染,如图:

在这里插入图片描述

五、图元作图示例

5.1 三角链和圆环GL_TRIANGLE_STRIP

GL_TRIANGLE_STRIP则稍微有点复杂。如:顶点序列是【1,2,3,4,5,6,7,8】那么,三角形链的三角形分别是:

Δ1,2,3
Δ2,3,4
Δ 3,4,5
Δ4,5,6
Δ5,6,7
Δ6,7,8

其规律是:
在这里插入图片描述

5.2 三角链和圆环

数据结构,有两个数列:inroop=【0,1,2,,,,11】;outroop=【0,1,2,,,,11】
将两个序列进行合并:
outroop【0】=1;inroop【0】=2;outroop【1】=3;inroop【1】=4;
outroop【2】=5;inroop【2】=6;outroop【3】=7;inroop【3】=8;

这样组成的三角形,将构成圆环。如图:

在这里插入图片描述
我们按照上面算法,其渲染效果如下:
在这里插入图片描述

当我们把内圆的直径收缩到接近0后,渲染出一个红太阳。
在这里插入图片描述

六、三维物体渲染

6.1 直纹面

指纹面相对来说是较容易实现的曲面渲染。直纹面的实现方法也是多样的,用GL_TRIGANLE就可以实现。

在这里插入图片描述

6.2 旋转面

旋转面相对较难完成。它的实现方法需要在三维立体上建立面模型。

在这里插入图片描述
这个漂亮的救生圈,是我们应用微分几何的《曲面论》结合OpenGL的着色器完成,具体代码见XXX地址。

七、GLSL程序优化代码

这是一个灵活使用着色器的代码,可以优化上述程序,具有很大参考意义。

7.1 顶点着色器

坐标之转换:
1)模型坐标转世界坐标
2)世界坐标转视觉坐标
3) 视觉坐标转屏幕坐标。

Vertex Shader

#version 150
in vec4 gxl3d_Position;
void main()
{
  gl_Position = gxl3d_Position;
}

7.2 几何着色器

几何着色器可以优化,剔除顶点。

Geometry Shader

#version 150
layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;
uniform mat4 gxl3d_ModelViewProjectionMatrix; // GeeXLab auto uniform
uniform vec2 WIN_SCALE;

out vec3 dist;

void main()
{
  vec4 p0_3d = gl_in[0].gl_Position;
  vec4 p1_3d = gl_in[1].gl_Position;
  vec4 p2_3d = gl_in[2].gl_Position;

  // Compute the vertex position in the usual fashion. 
  p0_3d = gxl3d_ModelViewProjectionMatrix * p0_3d;  
  // 2D position
  vec2 p0 = p0_3d.xy / p0_3d.w; 

  // Compute the vertex position in the usual fashion. 
  p1_3d = gxl3d_ModelViewProjectionMatrix * p1_3d;  
  // 2D position
  vec2 p1 = p1_3d.xy / p1_3d.w; 

  // Compute the vertex position in the usual fashion. 
  p2_3d = gxl3d_ModelViewProjectionMatrix * p2_3d;  
  // 2D position
  vec2 p2 = p2_3d.xy / p2_3d.w; 
  
  
  
  //--------------------------------
  // Project p1 and p2 and compute the vectors v1 = p1-p0
  // and v2 = p2-p0                                  
  vec2 v10 = WIN_SCALE*(p1 - p0);   
  vec2 v20 = WIN_SCALE*(p2 - p0);   
  
  // Compute 2D area of triangle.
  float area0 = abs(v10.x*v20.y - v10.y*v20.x);
  
  // Compute distance from vertex to line in 2D coords
  float h0 = area0/length(v10-v20); 
  
  dist = vec3(h0, 0.0, 0.0);
  
  // Quick fix to defy perspective correction
  dist *= p0_3d.w;
  
  gl_Position = p0_3d;
  EmitVertex();
  


  //--------------------------------
  // Project p0 and p2 and compute the vectors v01 = p0-p1
  // and v21 = p2-p1                                  
  vec2 v01 = WIN_SCALE*(p0 - p1);   
  vec2 v21 = WIN_SCALE*(p2 - p1);   
  
  // Compute 2D area of triangle.
  float area1 = abs(v01.x*v21.y - v01.y*v21.x);
  
  // Compute distance from vertex to line in 2D coords
  float h1 = area1/length(v01-v21); 
  
  
  dist = vec3(0.0, h1, 0.0);
  
  // Quick fix to defy perspective correction
  dist *= p1_3d.w;
  
  gl_Position = p1_3d;
  EmitVertex();
  


  //--------------------------------
  // Project p0 and p1 and compute the vectors v02 = p0-p2
  // and v12 = p1-p2                                  
  vec2 v02 = WIN_SCALE*(p0 - p2);   
  vec2 v12 = WIN_SCALE*(p1 - p2);   
  
  // Compute 2D area of triangle.
  float area2 = abs(v02.x*v12.y - v02.y*v12.x);
  
  // Compute distance from vertex to line in 2D coords
  float h2 = area2/length(v02-v12); 
  
  dist = vec3(0.0, 0.0, h2);

  // Quick fix to defy perspective correction
  dist *= p2_3d.w;
  
  gl_Position = p2_3d;
  EmitVertex();

  //--------------------------------
  EndPrimitive();
  
}

7.2 片段着色器

可以实现颜色blend等具体功能。


Pixel Shader

#version 150
uniform vec3 WIRE_COL;
uniform vec3 FILL_COL;
in vec3 dist;
out vec4 FragColor;
void main()
{
  // Undo perspective correction.      
  //vec3 dist_vec = dist * gl_FragCoord.w;
  
  // Wireframe rendering is better like this:
  vec3 dist_vec = dist;
  
  // Compute the shortest distance to the edge
  float d = min(dist_vec[0], min(dist_vec[1], dist_vec[2]));

  // Compute line intensity and then fragment color
  float I = exp2(-2.0*d*d);

  FragColor.rgb = I*WIRE_COL + (1.0 - I)*FILL_COL; 
  FragColor.a = 1.0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/639972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI视频教程下载:全面掌握ChatGPT和LangChain开发AI应用(附源代码)

这是一门深入的课程,涉及ChatGPT、LangChain和Python。打造专注于现实世界AI集成的AI应用,课件附有每一节涉及到的源代码。 **你将学到什么:** - 将ChatGPT集成到LangChain的生产风格应用中 - 使用LangChain组件构建复杂的文本生成管道 - …

AI助力农田作物智能化激光除草,基于轻量级YOLOv8n开发构建农田作物场景下常见20种杂草检测识别分析系统

随着科技的飞速发展,人工智能(AI)技术在各个领域的应用愈发广泛,其中农业领域也不例外。近年来,AI助力农田作物场景下智能激光除草的技术成为了农业领域的一大亮点,它代表着农业智能化、自动化的新趋势。智…

【小tips】当机器里面有多个版本的gcc时,该如何切换当前的gcc版本?

背景切换gcc版本 背景 有时候因为项目需求,可能不同的项目需要不同的gcc版本,所以机器上会安装多个版本的gcc,那我们如何切换到想要使用的版本? 切换gcc版本 比如我的机器上有两个版本的gcc: 我当前的版本是gcc-4…

node版本管理nvm详细教程

安装 nvm 之前先清理node相关的所有配置,如环境变量、.npmrc文件、node_cache、node_global 等 一、下载nvm 任选一处下载即可 官网:Releases coreybutler/nvm-windows (github.com) 码云:nvm下载仓库: nvm下载仓库 百度网盘&#xff1…

strcpy函数及其模拟实现

1. 前言 在本文中,我将带着各位读者从了解strcpy函数,到会用strcpy函数去实现我们编程时的需求,最后再来自己模拟实现一个strcpy函数。 “毕竟只有自己做的,自己才敢放心食用“😂😂😂 2. strc…

开源网页视频会议,WebRTC音视频功能比较

1. 概述 OpenAI 发布了新一代旗舰生成模型 GPT-4o,这是一款真正的多模态大模型,可以「实时对音频、视觉和文本进行推理」。 支持与 AI 实时语音对话,且响应时间达到毫秒级;交互中可识别人类情绪并以相应的情感做出回应;多语言能力的提升,WebRTC 成为大模型关键能力。 视频会议…

系统架构师-考试-基础题-错题集锦2

108.总线-全双工、半双工: 109.软件配置管理-产品配置: 产品配置:指一个产品在其生命周期各个阶段所产生的各种形式和各种版本的文档、计算机程序、部件及数据的集合。 注意:选项中的需求规格说明、设计说明等均可归属于文档。 …

远动通讯屏柜的组成及各装置的作用

远动通讯屏柜的组成及各装置的作用 远动通讯屏是基于公共电网安全而投入的远方监控遥控设备;主要由远动装置、通讯管理机、交换机、调制解调器、GPS对时装置、数字通道防雷器、模拟通道防雷器、插线板、空气开关、屏柜及附件等设备组成、标配尺寸2260*800*600&…

软考之信息系统管理知识点(3)

流水线:是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的,它们可同时为多条指令的不同部分进行工作,以提高各部件的利用率和指令的平均执行速度。 编译得过程 关系数据库是表的集合 …

初步学习pygame,使用pygame搭建简单的窗口效果

在VSCode上使用pygame 第一步:创建 Python 虚拟环境 打开 VSCode 中的 Terminal(在菜单栏中选择 View > Terminal)使用 cd 命令切换到你的项目文件夹输入以下命令来创建一个新的虚拟环境: python3 -m venv env这将在你的项目…

计算机毕业设计hadoop+spark微博舆情大数据分析 微博爬虫可视化 微博数据分析 微博采集分析平台 机器学习(大屏+LSTM情感分析+爬虫)

电商数据建模 一、分析背景与目的 1.1 背景介绍 电商平台数据分析是最为典型的一个数据分析赛道,且电商数据分析有着比较成熟的数据分析模型,比如:人货场模型。此文中我将通过分析国内最大的电商平台——淘宝的用户行为,来巩固数…

element ui 的密码输入框点击显示隐藏密码时,图标随之改变

场景图&#xff1a; 原理&#xff1a; 通过修改el-input框的type属性&#xff0c;来设置显示或者隐藏。从而改变图标地址。 <el-input class"passwordinput" :type"pwdObj.pwdType" ref"pwdInput" placeholder"密码"v-model"…

Unity LayerMask避坑笔记

今天使用Physics2D.OverlapAreaNonAlloc进行物理检测时候&#xff0c;通过LayerMask.NameToLayer传入了int值的LayerMask&#xff0c;结果一直识别不到&#xff0c;经过Debug才找到问题&#xff0c;竟是LayerMask的“值”传输有问题&#xff0c;记录一下。 直接贴代码输出结果&…

蓝桥杯Web开发【模拟题三】15届

1.创意广告牌 在"绮幻山谷"的历史和"梦幻海湾"的繁华交汇之处&#xff0c;一块创意广告牌傲然矗立。它以木质纹理的背景勾勒出古朴氛围&#xff0c;上方倾斜的牌子写着"绮幻山谷的风吹到了梦幻海湾"&#xff0c;瞬间串联了过去与现在&#xff0…

AI爆文写作:关注热点,提前埋伏好关键词,吃系统的热点推荐,吃搜索流量,让你的文章直接爆了!

做内容&#xff0c;要对热点敏感。 小米汽车的发布会时间&#xff0c;我们是不是提前就知道&#xff0c;发布会前&#xff0c;大家最关注的就是价格。 你看这个相关关键词搜索&#xff0c;10W太多了。 我看到有博主在发布会前&#xff0c;埋伏了一篇&#xff0c;公众号也有推…

玩机社区 - 2024年最美社区源码开源

玩机社区 - 2024年最美社区源码开源 教程源码文档都内置到压缩包了 https://pan.baidu.com/s/1xwcscTne-JMbmKEntiuAuA?pwd78oi

python实用系列:按顺序重命名文件

啊&#xff0c;好久没更博客了&#xff0c;今天偶然想换个桌面壁纸&#xff0c;于是上网搜了两个比较满意的桌面壁纸&#xff0c;都是压缩包&#xff1a; 当我想要给他们放到我的桌面壁纸文件里的时候患了难&#xff0c;因为他们的名字有相同的&#xff1a; anime文件夹里边&a…

如何在 Ubuntu 24.04 (桌面版) 上配置静态IP地址 ?

如果你想在你的 Ubuntu 24.04 桌面有一个持久的 IP 地址&#xff0c;那么你必须配置一个静态 IP 地址。当我们安装 Ubuntu 时&#xff0c;默认情况下 DHCP 是启用的&#xff0c;如果网络上可用&#xff0c;它会尝试从 DHCP 服务器获取 IP 地址。 在本文中&#xff0c;我们将向…

VUE3 学习笔记(十)查看vue版本

命令&#xff1a; npm list vue(空) (在项目的根目录下执行以下命令即可查看项目所使用的vue版本) npm list vue version(空) npm info vue (全局查看vue版本号&#xff0c;详细) npm list vue -g(全局查看vue版本号&#xff0c;简单) npm view vue version(查看项目依赖的vue…

【网络技术】【Kali Linux】Wireshark嗅探(十二)NBNS协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…