OpenGL下的场景层次化渲染

openGL学习笔记二十二: MipMap多层级纹理 MipMap多层级纹理:   纹理不仅仅是一张图片数据,可能是一系列图数据,因为图片放大、缩小时纹理要进行插值计算,这个过程是比较耗时间的,为了避免这耗时的计算,提高性能,显卡采用一张图片多层级纹理方式,根据摄像机离纹理距离,采用不同层级的纹理,比如摄像机离纹理较近,选择较大的纹理,摄像机离纹理较远,选择较小的纹理。这就是多层级纹理。 代码如下: 创建多层级纹理 static unsigned c... 阅读详情

目前使用VC6.0+OpenGL图形库已经逐渐成为开发3D应用程序的主流,但是在使用OpenGL图形库中会涉及到很多2D或者3D坐标,正确理解这 些坐标的含义是使用OpenGL开发应用程序的前提,另外对于一个复杂的3D场景如果使用程序的手段来进行有效的渲染也是至关重要的。本文主要探讨这两个 方面的问题。

  1. 相关基础知识

   要渲染真实世界的3D物体,首先必须了解OpenGL里面的坐标系统。OpenGL是使用顶点(Vertex)来描述几何物体的,最开始几何物体处于世 界坐标之下,然后所有的顶点都通过模型视图变换、投影变换以及视口变换来转换为屏幕坐标。通过这种流水线似的作业,3D场景就可以在屏幕上展现出来了。
世界坐标系统遵循右手定则,即X轴是从左至右,Y轴由下至上,Z轴是垂直于屏幕由里到外。这样在OpenGL里面使用的坐标值都是在这样的一个座标系统之下定位的,然后通过一系列的变换转换为人眼坐标,进而最后转换为屏幕坐标(2D坐标)。

  2. 场景的层次化渲染

  对于一个复杂的场景,如果才能有效的进行渲染呢?这里就借助一个示例来进行说明。
例子是这样的,需要在一个SDI窗口下绘制如下的一个2D的货车(实际上在进行场景层次化渲染这方面,2D渲染的思路与3D渲染思路是一样的)

 

   实现的思路首先应该是对这个货车分解几个独立的子实体:货车主体(前面那个大矩形)、货车主体车轮、拖车主体(后面的矩形)、拖车主体车轮。那么整个货 车在运动的时候应该是以主货车为运动的主体,其他的子实体都对主货车做相对运动,这就好比是爸爸牵着儿子走路一样,整体上爸爸和儿子是一起往前走的,但是 就局部来说,儿子可以绕爸爸做四周环绕运动。所以在利用OpenGL渲染比较复杂的3D物体时,首先要分清楚此3D物体的自由度的个数,然后分离出一个主 体部分,其他部分只是对这个主体部分做相对运动即可。这样的思路在渲染复杂的机器人的时候也应用到了。

那么在OpenGL里面如果实现各个实体之间的相对运动呢?事实上OpenGL里面提供了这样的一对函数:glPushMatrix()和glPopMatrix()。其功能是前者把当前所有的矩阵栈都压入堆栈,后者刚好相反。先看下面的例子:

//对整个货车做运动变换A
变换A
glPushMatrix();
//绘制货车主体
glPopMatrix();
glPushMatrix();
//绘制拖车主体
glPopMatrix();

   上面代码看出来,在第一对glPushMatrix()和glPopMatrix()之间绘制的货车主体不会影响到第二对glPushMatrix() 和glPopMatrix()里面绘制的拖车主体,也就是说,平行的两对glPushMatrix()和glPopMatrix()互相不影响。但是变换 A却可以影响货车主体和拖车主体,因为它们是上下级的关系,而不是平行的关系。

  所以从上面的分析中可以看出,可以利用glPushMatrix()和glPopMatrix()来实现主体和子体之间的相对运动,而且子体之间的绘制也不会相互影响,基于这样的思想,可以编制如下代码:(这里只列出主体代码DrawLorry和DrawWheel)

//m_rot 和m_trans分别表示轮胎的旋转量和整个货车在X轴上的平移量,已经在有关//函数里面进行了初始化
void CTerraintestView::DrawLorry()
{//控制货车的运动
//这里施加的几何变换将影响到所有的下面绘制的物体
glTranslatef(m_trans,0,0);
glColor3f(1.0,0.5,0);
//绘制货车
glBegin(GL_POLYGON ); glVertex2f(-0.3f,0.2f); glVertex2f(-0.3f,-0.2f); glVertex2f(0.3f,-0.2f); glVertex2f(0.3f,0.2f);
glEnd();
//绘制拉绳
glBegin(GL_LINES );
glVertex2f(-0.3,0); glVertex2f(-0.6,0);
glEnd();
//绘制货车轮胎
glPushMatrix(); glTranslatef(0,-0.3f,0); glTranslatef(-0.2,0,0); glPushMatrix(); glRotatef(m_rot,0,0,1); DrawWheel(0.1); glPopMatrix(); glTranslatef(0.4,0,0); glRotatef(m_rot,0,0,1); DrawWheel(0.1);
glPopMatrix();
glPushMatrix();
//总比货车滞后0.3 glTranslatef(-0.6,0,0);
//绘制后面的拖车
glBegin(GL_POLYGON); glVertex2f(-0.2f,0.2f); glVertex2f(-0.2f,-0.2f); glVertex2f(0.2f,-0.2f); glVertex2f(0.2f,0.2f);
glEnd();
// 绘制拖车的轮胎 glPushMatrix(); glTranslatef(0,-0.3f,0); glTranslatef(-0.1,0,0); DrawWheel(0.1); glTranslatef(0.2,0,0); DrawWheel(0.1); glPopMatrix();
glPopMatrix();
}
void CTerraintestView::DrawWheel(float radius)
{//绘制轮胎
float step=0.05;
float i;
float x,y;
glBegin(GL_LINE_STRIP );
glVertex2f(radius,0);
for (i=step;i<360.0;i+=step)
{ //计算两个坐标
x=radius*cos(i*3.1415926/180.0);
y=radius*sin(i*3.1415926/180.0);
glVertex2f(x,y);
}
glEnd();
}
 

  3.小结:

   前面的分析看出,无论是对复杂的场景还是对多DOFs(自由度的简称)的物体来说,使用分解的方式将复杂物体分解为相对独立的子实体(对于更加复杂的场 景需要建立场景的层次树),并结合glPushMatrix()和glPopMatrix()来实现对各个子实体的绘制,进而实现整个3D物体的绘制工 作。这种思路对于大型的复杂场景的绘制尤为有用。

文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppsl/20071119/86920.html)

OpenGL 分层渲染(Layered Rendering)的实例编程 通过分层渲染,我们可以将场景的不同元素渲染到不同的图层上,从而实现更灵活和高效的渲染方式。在这个实例中,我们创建了两个图层,一个用于渲染背景,另一个用于渲染前景。在这段代码中,drawBackgroundLayer函数用于绘制背景图层,我们使用glClear函数清空颜色缓冲区,然后使用glColor3f函数设置绘制颜色,最后使用glBegin和glEnd函数定义了一个矩形。在这段代码中,我们使用glClearColor函数设置清屏颜色为黑色,gluOrtho2D函数设置了正交投影矩阵,指定了窗口的范围。 阅读详情

相关推荐

OpenGL层次渲染实例

在这段代码中,我们首先创建了一个帧缓冲对象,然后绑定一个纹理对象到帧缓冲的GL_COLOR_ATTACHMENT0上。此时,我们需要确保帧缓冲对象完整,以便后面的渲染过程可以正确地进行。在OpenGL图形学中,层次渲染是一种用于将多个几何体绘制到同一个屏幕上的技术。使用该技术可以有效地减少OpenGL渲染管线的负载,提高渲染性能,并且减少重复渲染部分物体的次数。接着,我们需要为每个要绘制的几何体创建一个独立的渲染目标。下面我们来介绍如何使用OpenGL进行层次渲染,并给出相应的代码示例。

DevWizard的博客 386

探索Voxy的层次化遮挡剔除技术:游戏渲染的未来

Voxy作为一款专为Minecraft设计的LoD(细节层次)渲染模组,通过创新的层次化遮挡剔除技术,显著提升了游戏的渲染效率和视觉体验。本文将深入解析这一核心技术的工作原理、实现方式及其对游戏性能的革命性影响。 ## 什么是层次化遮挡剔除? 层次化遮挡剔除(Hierarchical Occlusion Culling)是一种先进的计算机图形渲染优化技术,它通过构建场景的层级结构,动态判断哪些

gitblog_00538的博客 943

OpenGL 分层渲染Layered Rendering的实例

OpenGL gslayered先上图,再解答。完整主要的源代码源代码剖析 先上图,再解答。 完整主要的源代码 源代码剖析

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1174

【openGL2021版】创建地板图层

【openGL2021版】创建地板图层 大家好,我是Lampard猿奋~ 欢迎来到船新的openGL基础系列的博客,今天主要实现的是创建地板图层 (1)上周demo回顾 上周已经实现了封装2d的纹理类,给demo加了一个小Logo。接下来要给这个项目加一个地板并实现倒影的效果 (2)创建地板图层 同样创建一个类来定义这个地板图层,这个地板类中有Init方法,其主要内...

Lampard的博客 1301

OPenGL笔记--创建一个3D场景

通过前面的学习,基本掌握了怎么绘制图形,使用纹理,接下来就来创建一个3D场景。基本原理一个复杂的场景肯定是由一些简单的图形,通过某种组合方式构建起来的,在OPenGL中也不例外;例如:在绘制立方体的时候,立方体也是由6个正方形围起来的;基本图形由于显卡在渲染三角形时效率较高,所以我们采用三角形来构建复杂的3D场景;数据结构当您想要使用一系列的数字来完美的表达3D环境时,随着环境复杂度的上升,这个工作的难度也会随之上升;

贝勒里恩的博客 2949

交互式计算机图形学基于OpenGL的自顶向下方法第五版课后习题答案(英文版)

htmltable {th, td {th {pre {简介:《交互式计算机图形学——基于OpenGL的自顶向下方法》第五版是学习现代计算机图形学的经典教材,涵盖从基础绘图到高级渲染的核心概念。本资源提供该书部分课后习题(奇数题)的英文版答案,内容涉及OpenGL基础、矩阵变换、投影与视口、光照模型、纹理映射、着色器编程等关键知识点。

weixin_28787801的博客 698

OpenGL 渲染

OpenGL入门(五)-- OpenGL渲染流程图解析

七爷OK 501

OpenGL的实现多层显示

OpenGL+MFC的实现多层次显示,

OpenGL初级_解决渲染层级导致的半透明深度问题(非次序无关)

深度测试开启的情况下 渲染半透明物体导致后排的半透明的物体被丢掉 问题: 解决思路: 1. 存储所有的渲染物体位置(世界坐标下), 在每一帧时候计算与相机移动的距离大小, 然后存储在一个dictionary或则map中, 保证有对应的索引获取 2. 从后往前进行绘制 结果: ...

qq_29601003的博客 943

Codex App 远程 SSH 连接 autodl 配置全攻略

SSH 远程连接是开发中常用的技术,通过加密通道实现本地与远程服务器的安全通信。其原理基于非对称加密和密钥对认证,确保数据传输安全。在 AI 开发场景中,远程连接能充分利用云端 GPU 算力,同时保留本地编辑器的流畅体验。autodl 作为主流算力云平台,支持通过 SSH 接入实例,但 Codex App 等工具需额外配置。本文详细讲解如何获取 autodl 的 SSH 接入信息、配置密钥登录、填写 Codex App 远程连接参数,并解决连接拒绝、权限报错等常见问题,帮助开发者高效搭建远程开发环境。

weixin_28312391的博客 257

ipc$漏洞攻击(实验)

我们总在说ipc$漏洞ipc$漏洞,其实,ipc$并不是真正意义上的漏洞,它是为了方便管理员的远程管理而开放的远程网络登陆功能,而且还打开了默认共享,即所有的逻辑盘(c$,d$,e$……利用IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码(当然,对方机器必须开了ipc$共享,否则你是连接不上的),而利用这个空的连接,连接者还可以得到目标主机上的用户列表(不过负责的管理员会禁止导出用户列表的)。5.然后,我们物理连接到靶机上,到了两分钟后,我们可以用命令看到,这个pp45的用户就出现了。

2301_76361674的博客 3255

OpenGL 渲染篇

前面讨论了如何给3D图形染色,更一般的情况是使用位图来给Mesh上色(渲染材质)。主要步骤如下: 创建Bitmap对象 使用材质渲染,首先需要构造用来渲染的Bitmap对象,Bitmap对象可以从资源文件中读取或是从网络下载或是使用代码构造。为简单起见,本例从资源中读取: 1 2 Bitmap bitmap = BitmapFactory.decodeRes...

xuela-net 682

通达信缠论中枢自动识别与画线实战指南

本文详细介绍了通达信缠论中枢自动识别与画线公式的实战应用。该工具通过严谨的算法逻辑,自动在K线图上标记出符合缠论定义的中枢区间,帮助投资者摆脱繁琐的手工画图,聚焦于价格与中枢的互动关系,从而高效识别趋势延续、背驰及第三类买卖点,提升缠论分析与交易决策的效率。

weixin_29267307的博客 663

OpenGL入门学习(八) 【转】

  今天介绍关于OpenGL显示列表的知识。本课内容并不多,但需要一些理解能力。在学习时,可以将显示列表与C语言的“函数”进行类比,加深体会。我们已经知道,使用OpenGL其实只要调用一系列的OpenGL函数就可以了。然而,这种方式在一些时候可能导致问题。比如某个画面中,使用了数千个多边形来表现一个比较真实的人物,OpenGL为了产生这数千个多边形,就需要不停的调用glVertex*函数,

shiqx429的专栏 1044

hfss仿真软件入门教程

hfss仿真软件入门教程 1.模型建立 1.1在project种选择insert hfss design 1.2.在hfss-》solution type 中选择modal 1.3.在moderler-》中选择units 设置单温为mm 1.4进行画图操作,这里为提高效率直接导入一个已经画好的cad图。使用modeler-》import 2.设置端口 2.1在更改模型中的材料 选择需要更改材料...

xunshui2007的博客 3万+

YOLOv8实战教程:从模型训练到改进的全流程指南

回顾这段YOLOv8的实战历程,从最初的模型训练到后来的各种改进尝试,我深刻体会到目标检测技术的魅力与挑战。YOLOv8作为一款优秀的框架,不仅易用性强,而且具备很强的可扩展性,让我能在其基础上不断创新。未来,我计划在以下几个方向继续探索:一是将YOLOv8与多模态技术结合,尝试实现图像与文本的联合目标检测;二是深入研究自监督学习在YOLOv8中的应用,减少对标注数据的依赖;三是探索YOLOv8在更广泛场景的部署,如机器人、自动驾驶等。

LXY_LOVE36的博客 281

OpenGL实现多层绘制(Layered Rendering)

多层绘制可以一次性渲染多张纹理,还能实现一些更为方便的功能,比如只调用一次shader就完成多个不同视口图像的绘制。实在是利器。 要实现Layered Rendering,需要用到多层纹理Array Texture、帧缓存对象FBO、几何着色器Geometry Shader。

鸣桐小记 1万+

innovus:set_clock_latency与insertion_delay

当1ns clock latency设置在capture上,在report_timing报告中体现在other end arrival time以及capture clock path的Arrival Time上。因为-1ns的insertion delay存在,所以skew group报告中显示的Arrival (ns)是减1ns的结果,即1.819-1=0.819 ns。CTS阶段create_ccopt_clock_tree_spec之后,spec中会产生对应的insertion_delay命令。

m0_61544122的博客 1621

OpenGL相机预览纹理叠加----多层纹理叠加---git源码

Context 在相机预览上添加蒙层。结构是以SurfaceView的Surface给Camera做预览,预览在OpenGL上对应samplerExternalOES纹理。在声明一个sampler2D纹理当做Overlay。 shader private val box_vert = ("uniform mat4 trans;\n" + "uniform mat4 ......

zhjali123的专栏 2418

【Agent】AI Agent架构趋势及演进

本文系统介绍了AI Agent架构的发展趋势和技术框架,涵盖单Agent与多Agent系统设计、提示词工程与上下文管理、SpringAI开发框架等关键技术。重点阐述了AI原生应用参考架构,包括Nacos配置管理、Higress AI网关、RocketMQ会话状态管理等核心组件解决方案。同时深入探讨了AI应用可观测性体系,包含OpenTelemetry全链路追踪、关键指标监控以及基于LoongSuite开源工具的数据采集评估方法,为构建高效可靠的AI应用提供了全景式技术参考。

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1106

DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

【代码】DC Error: The power pin VDD on the cell UASA1/CG_X8_Rdsd2pcm is unconnected. (UPF-581)

baidu_34971492的博客 970

OpenGL渲染流程详解

将顶点数据根据Primitive(原始链接关系)还原出网格结构,网格由顶点和索引组成,在此阶段根据索引将顶点链接在一起,组成点、线、面三种不同的图元,之后就是对超出屏幕的三角形进行剪裁,如果三角形ABC三个顶点其中一个点在屏幕的外面,另外两个点在屏幕里面,其实屏幕上看到的应该是个四边形,然后再将这个四边形切成2个小的三角形。VBO/VAO(到底是啥,下回讲解)是cpu提供给GPU的顶点信息,包括了顶点的位置、颜色(只是顶点的颜色,和纹理的颜色无关)、纹理坐标(用于纹理贴图)等顶点信息。

程序猿老樊的博客 1224

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

dom对象

  1.逻辑运算 || && !   1||2 (结果为1)   5&&4 (结果为4)   !0 口诀:   || 遇到第一个数字是true,就结束,并返回   && 遇到第一个为false就终止,返回false(如果没有false,就返回最后那个数) ...

weixin_30539625的博客 73

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 用rand函数输出负数和正数随机的数值
下一篇: 超前引用
th0624
博客等级 码龄19年 11粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值