第十六课,面剔除

2023-11-17

使用OpenGL的面剔除选项,它默认是禁用状态

glEnable(GL_CULL_FACE);

直接运行后,我们发现正方体的部分面确实被剔除了,但是却不是背向面,这是因为我们定义的正方体并不是严格遵循逆时针顺序定义的。
原理详见教程,这里就不过多叙述。
在这里插入图片描述
将正方体各面都改为逆时针顺序后

float vertices[] = {
        // Back face
        -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f, 0.0f, 0.0f, // Bottom-left
         0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f, 1.0f, 1.0f, // top-right
         0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f, 1.0f, 0.0f, // bottom-right         
         0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f, 1.0f, 1.0f, // top-right
        -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f, 0.0f, 0.0f, // bottom-left
        -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f, 0.0f, 1.0f, // top-left
        // Front face
        -0.5f, -0.5f,  0.5f,  0.0f,  0.0f, 1.0f, 0.0f, 0.0f, // bottom-left
         0.5f, -0.5f,  0.5f,  0.0f,  0.0f, 1.0f, 1.0f, 0.0f, // bottom-right
         0.5f,  0.5f,  0.5f,  0.0f,  0.0f, 1.0f, 1.0f, 1.0f, // top-right
         0.5f,  0.5f,  0.5f,  0.0f,  0.0f, 1.0f, 1.0f, 1.0f, // top-right
        -0.5f,  0.5f,  0.5f,  0.0f,  0.0f, 1.0f, 0.0f, 1.0f, // top-left
        -0.5f, -0.5f,  0.5f,  0.0f,  0.0f, 1.0f, 0.0f, 0.0f, // bottom-left
        // Left face
        -0.5f,  0.5f,  0.5f,  -1.0f,  0.0f,  0.0f, 1.0f, 0.0f, // top-right
        -0.5f,  0.5f, -0.5f,  -1.0f,  0.0f,  0.0f, 1.0f, 1.0f, // top-left
        -0.5f, -0.5f, -0.5f,  -1.0f,  0.0f,  0.0f, 0.0f, 1.0f, // bottom-left
        -0.5f, -0.5f, -0.5f,  -1.0f,  0.0f,  0.0f, 0.0f, 1.0f, // bottom-left
        -0.5f, -0.5f,  0.5f,  -1.0f,  0.0f,  0.0f, 0.0f, 0.0f, // bottom-right
        -0.5f,  0.5f,  0.5f,  -1.0f,  0.0f,  0.0f, 1.0f, 0.0f, // top-right
        // Right face
         0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f, 1.0f, 0.0f, // top-left
         0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f, 0.0f, 1.0f, // bottom-right
         0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f, 1.0f, 1.0f, // top-right         
         0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f, 0.0f, 1.0f, // bottom-right
         0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f, 1.0f, 0.0f, // top-left
         0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f, 0.0f, 0.0f, // bottom-left     
        // Bottom face
        -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f, 0.0f, 1.0f, // top-right
         0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f, 1.0f, 1.0f, // top-left
         0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f, 1.0f, 0.0f, // bottom-left
         0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f, 1.0f, 0.0f, // bottom-left
        -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f, 0.0f, 0.0f, // bottom-right
        -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f, 0.0f, 1.0f, // top-right
        // Top face
        -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f, 0.0f, 1.0f, // top-left
         0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f, 1.0f, 0.0f, // bottom-right
         0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f, 1.0f, 1.0f, // top-right     
         0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f, 1.0f, 0.0f, // bottom-right
        -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f, 0.0f, 1.0f, // top-left
        -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f, 0.0f, 0.0f  // bottom-left        
    };

在这里插入图片描述
通过透明面可以清除的看到后方的正方体面被剔除。

OpenGL允许我们改变需要剔除的面的类型

glCullFace(GL_FRONT);

glCullFace函数有三个可用的选项:

  • GL_BACK:只剔除背向面。(默认)
  • GL_FRONT:只剔除正向面。
  • GL_FRONT_AND_BACK:剔除正向面和背向面。

调用glFrontFace
glFrontFace(GL_CCW);定义逆时针为正向面(默认)
glFrontFace(GL_CW);定义顺时针为正向面

只使用glCullFace(GL_FRONT);

在这里插入图片描述
只会显示背向面,产生一些魔幻的感觉。

只使用glFrontFace(GL_CW);
在这里插入图片描述
和只使用显示背向面相同,可以看出我们加载的模型严格遵循逆时针方向为正向的法则。

确认在每个三角形中它们都是以逆时针定义的,这是一个很好的习惯。

面剔除是一个提高OpenGL程序性能的很棒的工具。
但你需要记住哪些物体能够从面剔除中获益,而哪些物体不应该被剔除。
如半透明物体的前后应该是都可见的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十六课,面剔除 的相关文章

  • 使用帧缓冲区将深度缓冲区渲染为纹理

    我正在使用 JOGL 但这个问题通常适用于 OpenGL 似乎也有类似的问题 但它们要么是针对 GLSL 代码 与复制帧缓冲区的内容有关 要么是一般建议 使用帧缓冲区对象而不是glCopyTexSubImage2D Question 我正在
  • 计算边界球体半径时遇到一些问题

    我已经设法用两种方法计算边界球体半径 但没有一种方法能够准确地满足我的要求 我不需要 像素 完美边界球 但我想要比我目前拥有的更好的东西 我正在使用 Wavefront obj 模型并计算这些模型的边界球半径 我提取当前模型尺寸 我使用 N
  • 将 CVPixelBuffer 渲染到 NSView (macOS)

    我有一个CVPixelBuffer我正在尝试在屏幕上有效地绘制 转变为低效率的方式NSImage可以工作 但速度非常慢 丢掉了大约 40 的帧数 因此 我尝试使用将其渲染在屏幕上CIContext s drawImage inRect fr
  • OpenGL NURBS 曲面

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • Opengl 非同步/非阻塞地图

    我刚刚找到以下内容OpenGL 规范ARB map buffer range http www opengl org registry specs ARB map buffer range txt 我想知道是否可以使用此扩展进行非阻塞地图调
  • 对 VBO 中的特定三角形使用不同的纹理

    我有 9 个由三角形组成的四边形 如下所示 我在用着VBO存储有关它们的数据 它们的位置和纹理坐标 我的问题是 是否可以仅使用一个来使四边形 5 具有与其余四边形不同的纹理VBO and shader 绿色代表纹理 1 黄色代表纹理 2 到
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl
  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 阻止 OpenGL.framework 在 Cocoa 应用程序中加载

    我的应用程序链接到这些框架 Cocoa Framework AppKit Framework CoreData Framework Foundation Framework 请注意 OpenGL Framework 是NOT已链接 但是 设
  • 为什么 OpenGL 给对象提供句柄而不是指针?

    OpenGL 的传统是让用户使用 unsigned int 句柄来操作 OpenGL 对象 为什么不直接给出一个指针呢 与指针相比 唯一 ID 有何优点 TL DR OpenGL ID 不会双射映射到内存位置 单个 OpenGL ID 可能
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • glut 库中缺少 glutInitContextVersion()

    我正在练习一些 opengl 代码 但是当我想通过以下方式强制 opengl 上下文使用特定版本的 opengl 时glutInitContextVersion 它编译过程失败并给出以下消息 使用未声明的标识符 glutInitContex
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 当 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?

    假设你有这样的东西 glBindTexture GL TEXTURE 2D my2dTex glBindTexture GL TEXTURE 1D my1dTex glBegin 正确的 OpenGL 行为是什么 要绘制一维纹理 二维纹理还
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染

随机推荐

  • OpenAI的模型下载(chatGPT模型)

    OpenAI于Aug 21 2019提交了一个commit 其公布了更大的774M模型 并且纠正了对之前公布的两个模型的参数估计错误导致的命名不准确问题 修改了其名称 其中 原117M模型更名为124M 345M更名为355M 仅修改名称
  • 三角函数与反三角函数的关系及图像

    文章目录 TOC 1 正弦函数 sin x 反正弦函数 arcsin x 2 余弦函数 cos x 反余弦函数 arccos x 3 反正弦函数 arcsin x 反余弦函数 arccos x 4 正切函数 tan x 余切函数 cot x
  • 20道JavaScript经典面试题

    该篇文章整理了一些前端经典面试题 附带详解 涉及到JavaScript多方面知识点 满满都是干货 建议收藏阅读 前言 如果这篇文章有帮助到你 关注 点赞 鼓励一下作者 文章公众号首发 关注 前端南玖 第一时间获取最新的文章 1 说一说Jav
  • Android增强现实(一)-AR的三种方式(展示篇)

    有一段时间没写博客了 事情比较多 博客进度有点跟不上了 1 Android增强现实 一 AR的三种方式 展示篇 2 Android增强现实 二 支持拖拽控制进度和伸缩的VrGifView 3 Android增强现实 三 3D模型展示器 这段
  • 安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计&WebPack打包器&第三方库JQuery&安装使用&安全检测

    文章内容 环境搭建 NodeJS 解析安装 库安装 安全问题 NodeJS 注入 RCE 原型链 案例分析 NodeJS CTF题目 源码审计 打包器 WebPack 使用 安全 第三方库 JQuery 使用 安全 环境搭建 NodeJS
  • TestComplete数据驱动测试教程(三)——修改记录测试

    TestComplete是一款具有人工智能的自动UI测试工具 利用自动化测试工具和人工智能支持的混合对象识别引擎 轻松检测和测试每个桌面 Web和移动应用程序 本文中我们将讲解如何进行数据驱动的测试 方便大家更快更直接的学习TestComp
  • c++的常用库

    c 的常用库 C 资源大全 关于 C 框架 库和资源的一些汇总列表 内容包括 标准库 Web应用框架 人工智能 数据库 图片处理 机器学习 日志 代码分析等 标准库 C 标准库 包括了STL容器 算法和函数等 C Standard Libr
  • 用C++封装一个Ocr文字识别程序,离线识别,完全免费

    程序封装了RapidOcr模块 源文件路径Tree信息如下 文件夹 PATH 列表 卷序列号为 43EE 6931 D build windows bat CMakeLists txt CMakeSettings json Ocr cpp
  • Centos7版本的安装超级详细

    Centos7的安装超级详细 关于Centos版本下载地址 https archive kernel org centos vault CentOS 7 0 1406 x86 64 DVD iso 标准安装版 一般下载这个就可以了 Cent
  • 线程创建的三种方法

    继承Thread类 1 继承Thread类 2 重写run 方法 3 调用start 方法开启线程 public class testThread1 extends Thread Override public void run run 方
  • Qt浅谈之一:内存泄露(总结)

    一 简介 Qt内存管理机制 Qt 在内部能够维护对象的层次结构 对于可视元素 这种层次结构就是子组件与父组件的关系 对于非可视元素 则是一个对象与另一个对象的从属关系 在 Qt 中 在 Qt 中 删除父对象会将其子对象一起删除 C 中del
  • 谷歌chrome浏览器的源码分析(一)

    随着网络技术的发展 越来越多应用都已经离不开网络 特别像人类大脑一样的知识库的搜索引擎 更加是离不开功能强大的云计算 不过 即便云计算非常强大 但它还不能直接地把结果呈现给用户 这样就需要一个客户端来呈现出来 这个客户端就是浏览器 现在越来
  • 归并排序(分析与模板)

    归并排序 思路 1 确定分界元素mid left right 2 2 递归分解数组 两两组合组成两个有序数组 3 归并 合二为一 int temp 100010 merge sort int num int l int r if l gt
  • std::thread线程命名

    也可以参考我另外一篇文章 另外一篇更详细些 为线程设置名字的最大的好处是在程序出错时 它会出现在 GDB 的出错信息里 可以更快地定位问题 有两种方法可以给线程设置名字 一种在线程的调用函数内部设置 还有一种是在外部对指定线程变量做设置 i
  • 【软件测试】未来软件测试必备的8大技能,你缺少哪几个?

    软件测试工程师是个神奇的职业 他是开发人员与老板之间的传话筒 三夹板 也是开发人员与老板的好帮手 他不仅需要有销售的沟通能力 也需要具备编辑人员的文档撰写技巧 如此一个面面俱到的岗位 他需要具备的技能到底有哪些呢 有逆向思维的能力 曾经采访
  • 算法:两个有序数组合并成一个有序数组 java语言

    题目 有两个有序数组a 和b 将它们合并成数组c 需要c 也是有序数组 思路 新建一个以两个集合长度之和为长度的新数组 从两数组最左边开始比起 把小的放入新集合 并用变量标记后一位置 每次比较都是比较的最左边未比较过的元素 通过变量 循环比
  • 分享一个可交互的小场景(二)

    先看效果 可互动的小场景 再看代码 JS部分
  • 正点原子I.MX6ULL开发板车牌识别项目实战 1

    1 项目总体概述 下图为 车牌识别项目 的系统框图 借助这个框图 简要介绍项目的总体思路和所需要做的准备工作 1 1 总体思路 通过摄像头采集图像信息 并将图像信息传递开发板 这里使用的是OpenCv 开发板收到图像信息之后 通过定时器 周
  • Python解决ModuleNotFoundError: No module named 'Queue'的问题

    我们知道Python2和Python3两个版本之间 有些不兼容的地方 Python3中引入Queue会报出这个问题 Python3中要这样引入 1 import queue Python2中要这样引入 1 import Queue 为了兼容
  • 第十六课,面剔除

    使用OpenGL的面剔除选项 它默认是禁用状态 glEnable GL CULL FACE 直接运行后 我们发现正方体的部分面确实被剔除了 但是却不是背向面 这是因为我们定义的正方体并不是严格遵循逆时针顺序定义的 原理详见教程 这里就不过多