OpenGL 打包正常

2023-12-08

我试图理解使用之间的区别GL_INT_2_10_10_10_REV对于我的数据的正常情况 V.S.GLbyte。目前我正在将法线加载到glm::vec4我这样包装它:

int32_t floatToSignedNormalizedByte(float x, float y, float z, float w)
{
    int32_t result = 0;
    const int16_t maxValue = static_cast<int16_t>(std::numeric_limits<int8_t>::max());
    const int16_t negativeValueScale = maxValue + 1;

    result |= static_cast<int8_t>(x < 0 ? x * negativeValueScale : x * maxValue);
    result |= static_cast<int8_t>(y < 0 ? y * negativeValueScale : y * maxValue) << 8;
    result |= static_cast<int8_t>(z < 0 ? z * negativeValueScale : z * maxValue) << 16;
    result |= static_cast<int8_t>(w < 0 ? w * negativeValueScale : w * maxValue) << 24;

    return result;
}

正常情况下,我会调用:

//Location, component count, type, normalized, stride, offset
glVertexAttribPointer(location, 4, GL_BYTE, true, format.getVertexSize(),  format.getFieldOffset(field, dataBasePtr));

我的问题是,考虑到我平常的包装方式,我应该使用GL_INT_2_10_10_10_REV作为我的类型(替换 GL_BYTE)?我理解使用GL_INT_2_10_10_10_REV意味着每个组件获得 10 位而不是 8 位,这很好,因为我实际上只需要 xyz 组件。哪一个更好,为什么?如果我使用GL_INT_2_10_10_10_REV,我猜组件数仍然是 4?


Why

正如您所说,使用 10_10_10_2 将为每个有意义的分量 (xyz) 提供 10 位,同时为 w 分量留下 2 位,这对于法向量来说是无用的。有了 10 位,你就有了2^10x、y 和 z 的可能离散值,而不是2^8由8位提供的值。因此,这将为您提供更准确的法线值和更平滑的渐变。您还可以使用浮点值,但这些需要更多内存并且可能会更慢。这回答了“我为什么要这样做”部分。

How

至于“如何”,您当前的打包功能会改变每个float转换为 8 位整数。您需要更改此设置以将 x、y 和 z 分量转换为 10 位整数,并将这些位与01作为最后 2 位(w 分量)。这REVversion 只是允许您以相反的顺序指定组件 (wzyx)。

更多信息关于GL_INT_2_10_10_10_REV顶点格式

OpenGL 规范的表 10.3 和 10.4 描述了这些组件如何在 32 位字中布局:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|  w |             z               |              y              |         x         |

Table 10.3: Packed component layout for non-BGRA formats. Bit numbers are indicated for each component.

UNSIGNED_INT_2_10_10_10_REV:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|  w |             x               |              y              |         z         |

Table 10.4: Packed component layout for BGRA format. Bit numbers are indicated for each component.

如您所见,此顶点格式有 4 个组件。

您可能还会发现以下规格GL_ARB_vertex_type_2_10_10_10_rev如果您想要更多背景知识,请阅读有趣的文章:

两种新的顶点属性数据格式:有符号 2.10.10.10 和无符号 2.10.10.10 顶点数据格式。这些顶点数据格式描述了 4 个分量流,可用于以量化形式存储法线或其他属性。法线、切线、副法线和其他顶点属性通常可以以降低的精度指定,而不会引入明显的伪影,从而减少它们消耗的内存量和内存带宽。

“降低精度”是指使用 10 位整数而不是法线的半浮点(16 位)或浮点(32 位)值。每个顶点更少的位数可以提供更好的性能,因为顶点组装阶段需要更少的内存带宽。

这个问题也有相关信息:在 glVertexAttribPointer() 中使用 GL_INT_2_10_10_10_REV

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

OpenGL 打包正常 的相关文章

  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • OpenGL中背景对象绘制在前景对象前面?

    为了测试目的 我们假设我画了 2 个茶壶glutSolidTeapot 像这样 glColor3f 1 0f 0 0f 0 0f Red teapot glutWireTeapot 1 0f glColor3f 0 0f 1 0f 0 0f
  • 渲染 TTF SDL2.0 opengl 3.1

    我正在使用 SDL2 0 并使用 半现代 opengl 3 1 我希望向我的应用程序添加文本叠加 并在应用程序中呈现 TTF 我将如何使用现代 OpenGL 来解决这个问题 编辑 根据 genpfault 的建议 我尝试使用 SDL TTF
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • Opengl 视频纹理

    我正在使用 Visual Studio 10 在 Windows 上用 C 开发 opengl 应用程序 目前我在立方体上使用静态纹理 但我想集成视频纹理 你知道我可以使用哪个库来打开和解密视频吗 查看 ffmpeg libavformat
  • OpenGL - 自动生成 glDrawArrays 的索引/步幅参数

    我正在渲染一个包含大量数据点 gt 1M 的网格结构 我的数据结构如图所示 所以我的索引缓冲区的内容看起来像这样0 100 1 101 2 102 3 103 我对索引缓冲区的巨大尺寸有点恼火 我需要它来定义我的三角形带 是否有可能告诉 O
  • 带有 std::vector 的 VBO

    我用 C 和 OpenGL 编写了一个模型加载器 我用过std vectors 来存储我的顶点数据 但现在我想将其传递给glBufferData 但是数据类型却截然不同 我想知道是否有办法可以相互转换std vector至已记录的const
  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 如何在 OpenGL 中绘制镜像某些东西的镜子?

    根据我的理解 要在 OpenGL 中进行镜像 您基本上需要绘制场景 然后将所有内容翻转并再次绘制 只是使其通过镜子可见 从而在镜子中创建完美翻转的图像 但我看到的问题是 执行此操作时 唯一可以看到其他镜子的镜子是在前一个镜子之后渲染的镜子
  • SDL 程序中颜色关闭

    我目前正在开发一个非常简单的游戏 使用纯 C 方法和 SDL 及其官方额外库 如 SDL image 和 OpenGL 现在 虽然我遇到了一些障碍 但我不知道为什么要这样做 绘制时颜色全部关闭 我目前在 Mac 上运行该程序 但如果我没记错
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • sRGB 纹理。它是否正确?

    我最近阅读了一些有关 sRGB 格式以及它们如何允许硬件自动对典型显示器执行色彩校正的文章 作为我阅读的一部分 我发现您可以使用普通纹理和返回结果上的 pow 函数来模拟此步骤 无论如何 我想问两个问题 因为我以前从未使用过此功能 首先 有
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧

随机推荐

  • 如何在 Cypress 中测试选择是否具有给定值? [复制]

    这个问题在这里已经有答案了 我对 Cypress 非常陌生 我想编写一个简单的测试 在页面首次加载时将选择框 下拉菜单 设置为特定状态 我不想将其设置为任何内容 网站上的说明清楚地显示了这一点 我只是想确保页面首次加载时选择框设置为应有的值
  • Swift2 从 Firebase 检索图像

    我正在尝试从 Firebase 读取 显示图像 我首先对图像进行编码 然后将此编码的字符串发布到 Firebase 这运行良好 当我尝试解码 Firebase 中的编码字符串并将其转换为图像时 我收到一个 nil 值异常 这就是我将图像保存
  • __DIR__ 不适用于 php include

    我正在尝试使用 php include 将一个 php 文件链接到另一个 结构是这样的 ROOT templates footer php main maps uk map php Using 代码链接绝对没问题 使用任一 or
  • 初始化 Objective-C 类 ivar,它是一个 C 数组

    我的 Obj C 类中有一个 ivar 它是一个 C 数组 我对使其成为 Obj C 属性不感兴趣 够简单的 现在 在我的类的 init 方法中 我想使用 C 数组简写 init 为该数组播种一些值 如下面的 m 所示 但我相当肯定这是创建
  • Android setShareIntent 在片段内

    一 背景 我有一个屏幕 上面有 ShareActionProvider and a ViewPager 使用片段 我希望做的是从当前可见片段内部获取一些信息来创建意图 然后我就能够在 ShareActionProvider 上设置意图 这是
  • 如何在rmarkdown中的pdf_document中渲染htmlTable包中的表格?

    在 rmarkdown 在 RStudio 中 中 我使用 htmlTable 包在 html 文档中生成漂亮的表格 现在我想要在渲染 pdf 文档时得到相同的结果 表格未正确呈现 如何让 rmarkdown 在我的 pdf 文档中生成表格
  • 源映射必须有 .map 扩展名吗?

    如果我创建一个源映射 我是否必须给它一个 map 扩展名 或者我可以将其命名为 foo 只要它具有正确的标头 如果有人能指出这方面的文档 我将不胜感激 它可以有任何扩展名 在压缩 缩小 原始文件中 您放入sourceMappingUrl评论
  • 通过拖放文件或文件夹来启动 Swift OSX 应用程序

    我试图弄清楚如何通过拖放文件或文件夹来在 OSX 上启动 Swift 应用程序 并让它将拖放资源的完整路径视为参数 首先 在 项目导航器 根节点 中选择您的项目 然后转到 信息 选项卡以声明您的应用程序支持的文件类型 它可以窄到 仅 CSV
  • Outlook 自动化 - 更改发件人帐户

    我正在自动化 Outlook 并且需要控制电子邮件的发件人身份 用户将在 Outlook 中设置两个或多个帐户 我需要能够选择从哪个帐户发送电子邮件 有任何想法吗 需要 Outlook 2003 及以上版本支持 我正在使用 Delphi 2
  • 是什么原因造成的,当数值大于一定位数时,结果会不同呢?

    非常抱歉 在尝试完所有案例之前 我急忙发邮件向大家说声抱歉 根据你的回答 我尝试并推翻了之前的想法 随着位数的变化 我很困惑 我没有测试多少位数字是正常的 但我相信这个例子应该可以解释 字符串类型与数字类型比较时 当位数大于一定值时 只返回
  • -replace 不将字符串替换为“()”

    我正在尝试在 PowerShell 中替换包含括号的字符串 但是 当我尝试这样做时 它不起作用 知道我哪里出错了吗 我应该做什么来替换包含的字符串 with replace在 PowerShell 中 a Some Text with ro
  • 声明结构体字段对象类型时,我必须在这里使用什么样的生命周期参数

    这就是我的代码的样子 我正在尝试在我的内部使用一个实现的结构ShapeRenderer构造并使用它的方法 形状 rs use super core pub struct ShapeRenderer lt a gt core renderer
  • 添加数据时ng-repeat不更新列表

    我的问题是 ng repeat 不会自动更新数据 当我在代码中按添加引脚时 该元素会正确添加到数据库中 如果我重新加载页面 数据会正确显示 但不会像角度那样显示 据记录 更新和删除工作正常 提前致谢 这是我的 app js 代码 var a
  • ASP.NET MVC3 - 使用 Javascript 的错误

    我正在尝试使用 Ajax BeginForm 从我的控制器发布 Json 结果 我正在使用 MVC3 当 Json 结果被调用时 它应该被发送到 javascript 函数并使用提取对象 var myObject content get r
  • 显示优惠券说明 woocommerce

    我试图在购物车页面应用优惠券 10 后显示优惠券描述 要显示总计 我正在使用 woocommerce gt cart gt cart contents total 如何显示优惠券说明 由于你没有提到你想要在哪里有优惠券说明 我之前已经打印了
  • 聚合数据帧列表并存储所有结果

    我有 9 个数据框的列表 每个数据框大约有 100 行和 5 6 列 我想根据所有数据帧中另一个列中指定的组来聚合列中的值 并将所有结果存储在单独的数据框中 为了阐明这一点 请考虑一个列表 1 Date Group Age Nov A 13
  • Hibernate 不会完全刷新实体子级

    我使用 Hibernate 5 1 0 Final 我的GenericDAO类主要方法 public T save T entity entityManager getTransaction begin entityManager pers
  • 如何删除 Symfony 2.7 中的弃用警告?

    Symfony 在日志和控制台中输出了可怕的 自 2 6 版本以来已弃用 并将在 3 0 中删除 错误 我遵循了我发现的所有声称可以解决该问题的指南 包括升级 sensio distribution bundle 并将 E USER DEP
  • 是否可以重新加载相同的 FXML/Controller 实例?

    Goal Implement a standard Settings GUI window Categories in a ListView on the left and the corresponding options in a Pa
  • OpenGL 打包正常

    我试图理解使用之间的区别GL INT 2 10 10 10 REV对于我的数据的正常情况 V S GLbyte 目前我正在将法线加载到glm vec4我这样包装它 int32 t floatToSignedNormalizedByte fl