首页 > 其他分享 >OpenGL的深度缓冲

OpenGL的深度缓冲

时间:2023-12-13 12:33:28浏览次数:27  
标签:OpenGL 缓冲 绿色 正方形 红色 深度 绘制

  如果我们想要在三维空间里画两个正方形:一个红色的,一个绿色的,而且从人眼的观察角度看,绿色正方形在红色正方形的后面。最后看上去应该是这样的:

要点在于,从观察者的角度看,绿色正方形在红色正方形的后面,因此绿色正方形的一部分被红色正方形遮挡。

  然而,在启用深度测试前,正方形的相对位置完全取决于绘制这两个正方形的顺序。如果我们先绘制红色正方形,再绘制绿色正方形,看上去会是这样:

由于绿色正方形是最后绘制的,因此它在屏幕中遮挡了红色正方形,虽然从顶点坐标来看它应该在红色正方形的后面。而如果最后绘制的是红色正方形,看上去就是正确的效果了。

 

  针对这个问题应该怎么办呢?我们需要你,深度缓冲!

  深度缓冲的原理其实非常简单,它为窗口内的每个像素点保留一个8位的深度信息,当有新的点绘制在窗口的某个位置时,OpenGL会比较这个点的深度与此位置之前保留的深度大小,默认情况下保留深度较小的那个像素点,也就是距离我们的视角更近的那个点。从而,如果新绘制点的深度小于之前保留的深度大小,则在窗口内绘制这个点,并更新深度信息;否则就忽略这个点。

  使用深度缓冲前,需要先启用深度测试:

glEnable(GL_DEPTH_TEST);

  然后在主循环的内部,每次循环时清空深度缓冲:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  现在,无论我们先绘制哪个,都能得到正确的视觉效果:

  启用深度测试后,对于两正方形像素的重叠部分,由于红色正方形上的点具有更小的深度,因此只有红色部分会被保留。

 

  有些杠精朋友可能会说:“我就是不喜欢用深度测试,我乐意每次计算哪些物体距离视线更近,越近的物体越到最后才画,你能拿我怎样?” 年轻人不要太气盛,看看下面这个:

如果没有启用深度缓冲,看上去会是这样:

    

先画红色,再画绿色

或者是这样:

先画绿色,再画红色

最后的视觉效果都不太对。

  好了,这篇文章已经够长了,模板缓冲还是另写一篇吧。

标签:OpenGL,缓冲,绿色,正方形,红色,深度,绘制
From: https://www.cnblogs.com/overxus/p/17898609.html

相关文章

  • 拆解全景,解锁未来——深度分析大模型六大领域及五大应用解决方案
    在本篇文章中,我们将带您首先通过解读LLM的全景图,深入探讨了LLM的六个关键领域,随后提出五种主要方案以解决企业在这一技术领域面临的挑战。从商业模型到开源模型、微调、自定义构建,再到与AI提供商的合作,本文将引领您深入了解LLM的技术脉络,为探索和应用这一技术提供一些思考......
  • 12.12邻接表存储实现图的深度优先遍历(c++)
    今天学习了数据结构中的邻接表存储实现图的深度优先遍历,其中让我受益匪浅,以下是我的解题思路。编写程序,实现由邻接表存储实现无向图的深度优先搜索遍历的功能。顶点为字符型。输入格式:第一行输入顶点个数及边的个数,第二行依次输入各顶点,第三行开始依次输入边的两个顶点,用空格......
  • 聊天记录年度报告一览无余:轻松多格式导出永久保存,深度智能分析
    聊天记录年度报告一览无余:轻松多格式导出永久保存,深度智能分析1.功能简介效果展示一个用于提取微信聊天记录的工具,支持将聊天记录导出成HTML、Word、CSV文档,以实现永久保存。此外,该工具还具有对聊天记录进行分析的功能,可以生成年度聊天报告,帮助用户更好地了解和回顾与他人的沟通......
  • 设计模式之单例模式:不同实现方式的深度解析
    什么是单例模式单例模式是一种常用的软件设计模式,其主要作用是保证某一个类只能有一个实例,并提供对该实例的全局访问点。单例模式有三个要点:1.某个类只能有一个实例。2.它必须自行创建这个实例。3.它必须自行向整个系统提供这个实例。单例模式的分类单例设计模式在具体实现......
  • 深度学习面试常用代码:MHA/MQA/GQA/LN/BN/位置编码代码
    深度学习常用代码参考:https://zhuanlan.zhihu.com/p/6505754261.MHA(MultiHeadAttention)代码实现#1.MHA实现importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassScaleDotProductAttention(nn.Module):def__init__(self,):......
  • isRef()、unRef()、toRef()、toRefs()深度解析,为啥解构会失去响应式?
    前言isRef()、unRef()、toRef()、toRefs()这几个函数他们各自都有什么功能,在什么场景下应用以及有哪些细节是我们没有注意到的,我们一起来看一下,为了方便大家理解和对照,这里以官方文档说明+解析的方式讲解。isRef()检查某个值是否为ref。类型tsfunctionisRef<T>(r:Ref......
  • 掌握TS 从基础到深度理解,晋级TypeScript高级开发的几个实战经验
    TypeScript作为JavaScript的超集语言,在现代前端开发中扮演着重要的角色。掌握TypeScript并深入理解其高级特性,将使开发者能够更加高效地进行项目开发。本文将分享几个实战经验,帮助开发者从基础到深度理解TypeScript,并实现晋级到TypeScript高级开发的目标,并提供相关代码示例。类型注......
  • 5.二叉树的最大深度
    104.二叉树的最大深度1、概要给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。可以使用前序求深度,也可以使用后序求高度。二叉树节点的深度:指从根节点到该节点的最长简单......
  • 15、自定义绘制图形(双缓冲机制)
    效果图 //drawwidget.h#ifndefDRAWWIDGET_H#defineDRAWWIDGET_H#include<QObject>#include<QWidget>#include<QtGui>#include<QMouseEvent>//鼠标事件#include<QPaintEvent>//绘制事件#include<QResizeEvent>//实时获取窗口操作等的大......
  • 通过VS地址擦除系统定位缓冲区溢出问题
    VS2019增加了一个名为“地址擦除系统”的功能,默认是关闭的,可以在项目“属性”-“c/c++”-"常规"中开启。在开启地址擦除系统”功能时,将调试信息格式设置为“程序数据库”。如下图:如果没有该项,检查VS2019的版本是否低于16.9,并且在安装项中是否安装“C++AddressSanitizer”。如下......