OpenGL 中对 R8G8B8 纹理的 NPOT 支持

2023-12-08

我使用 glew 和 glut 创建了一个示例应用程序,它读取 dds 文件并显示它。我手动读取dds文件(R8G8B8中的NPOT(886 x 317)文件)并创建数据指针(unsigned char*)。

然后我使用准备纹理

void prepareTexture(int w, int h, unsigned char* data) {

    /* Create and load texture to OpenGL */
    glGenTextures(1, &textureID); /* Texture name generation */
    glBindTexture(GL_TEXTURE_2D, textureID); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 
                w, h, 
                0, GL_RGB, GL_UNSIGNED_BYTE,
                data); 
    glGenerateMipmap(GL_TEXTURE_2D);
}

enter image description here

上图中,第一个显示了原始的dds文件,第二个是我的应用程序的渲染结果,这显然是错误的。如果我将图像大小重新调整为 1024 x 512,则两个图像看起来将相同。

来自OpenGL规范

I.3 非二次方纹理

对于所有纹理目标,纹理对二维次方的限制已放宽,因此 可以指定非二次方纹理而不生成 错误。非二次幂纹理是从 ARB 纹理升级而来的 非二次幂的扩展。

据我所知,从 OpenGL 2.0 开始,我们可以使用 NPOT 纹理,OpenGL 将处理这个问题。

我尝试使用 DevIL 图像库加载 dds 文件,但最终得到相同的结果。如果我将图像转换为 RGBA 并将内部格式和 glTexImage2D 格式更改为 GL_RGBA,即使 dds 文件是 NPOT,我也会得到正确的结果。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
                w, h, 
                0, GL_RGBA, GL_UNSIGNED_BYTE,
                data);

我在带有 NVIDIA 卡和 Ration 卡的 PC 上尝试了该应用程序,它们都给出了相同的结果。

我的示例源代码可以从以下位置下载link

谁能告诉我我的申请有什么问题吗?或者如果图像是 R8G8B8,OpenGL 不允许 NPOT。


这看起来像是一个对齐问题。在之前添加此内容glTexImage2D() call:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

该值指定数据的行对齐方式(以字节为单位)。默认值为 4。

纹理宽度为 886,每像素 3 字节GL_RGB,每行是 886 * 3 = 2658 字节,不是 4 的倍数。

随着UNPACK_ALIGNMENT默认值时,大小将四舍五入到下一个 4 的倍数,即 2660。因此,每行将读取 2660 字节,这解释了每行增加的移位。第一行是正确的,第二行有 2 个字节,第二行有 4 个字节,第三行有 6 个字节,依此类推。

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

OpenGL 中对 R8G8B8 纹理的 NPOT 支持 的相关文章

随机推荐

  • 如何通过 Objective-C 代码在 iOS 上创建 openssh 密钥

    我们可以通过命令 ssh keygen 获取 openssh 密钥 或者通过命令 openssl genrsa 获取 openssl 密钥 但我可以通过 Objective C 代码在 iOS 应用程序中执行此操作吗 任何帮助将不胜感激 您
  • 将不同格式的字符串转换为日期

    我有一个带有字符串列的表 varchar 200 包含不同格式的日期 例如 may 24 1983 12 00AM 1981 01 13 00 00 00 1979 01 13 00 00 00 123 我想将此列转换为日期以提取年份 我该
  • 最有效地查找数组中的最小值

    数组中有N个值 其中最小的一个 如何最有效地找到最小值 如果它们没有排序 你就不能做太多事情 只能查看每一个 这是 O N 完成后你就会知道最小值 伪代码 small
  • HTML表单文件上传不起作用,$_POST不转发数据

    也许现在还为时过早 但无法找出问题所在 我已经制作了几个表格 但这次由于某种原因我无法转发文件输入的数据 这是我的索引 php 表格所在的位置
  • 在python中获取一组二维列表

    我有一个list如下 t 1 7 3 7 1 7 5 8 3 7 我需要得到一个set因此输出将是这样的 t 1 7 3 7 5 8 我尝试使用t set t 但没有成功 如果不关心顺序的话 可以先转换一下内层lists to tuples
  • 用户定义类模板参数推导的缩写函数模板语法指南

    我正在以缩写函数模板的风格编写推导指南 但我不确定是否允许 它可以在 gcc 和 clang 上编译 但不能在 msvc 上编译 错误是 错误 C3539 模板参数不能是包含 auto 的类型 哪个编译器正在做正确的事情 在这里尝试一下 t
  • 无法执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.10:test

    我已经在互联网上搜索了近五天 寻找解决这个问题的方法 但我似乎无法自己找到并解决它 主要是因为我对 Maven 和 PlayN 都很陌生 所以我不完全确定我到底在看什么 但是 它显然在构建核心方面正忙得不可开交 似乎无法下载 工件过滤器 并
  • 为 Domino Java 代理创建交叉证书?

    我正在尝试使用 Domino java 代理连接到启用 https 的 Web 服务 使用 http 可以正常工作 但使用 https 则失败 我禁用了 TLS 1 2 显然 Fix Pack 4 和 5 有 TLS 1 2 和 Java
  • SoapUI Testrunner 给出有关 TestAssertionRegistry 的错误

    我能够使用有效的断言成功运行我的测试用例 但是当通过 testrunner 运行时 它会以这些错误开始 ERROR TestAssertionRegistry Missing assertion for type JsonPath Matc
  • onsubmit:返回 false;在 Rails 4 中如果 remote: true 则被忽略

    我在 Rails 4 中有以下形式 我的 validateForm 函数如下所示 function validateForm return false 即使它被调用 也会执行 AJAX 提交 我怎样才能避免这种情况 那么 如果函数 vali
  • “Klass:method(p)”中的“:”(单个冒号)是什么意思?

    今天我看到了这段代码 void CameraTree dragMoveEvent QDragMoveEvent event QTreeWidget dragMoveEvent event 我认为上面的代码是错误的 但 void Camera
  • (ggplot2 更新?)带有百分比标签的堆叠条形图

    我正在复制一些所有脚本 一年多前编码 发现我不再得到相同的情节 我使用相同的数据集和相同的代码 唯一的区别是我的 R 安装和 ggplot2 的版本 所以我假设这就是问题所在 让我用几个愚蠢的情节向你展示这个问题 当生成带有百分比标签的堆叠
  • 如何修复重叠的 Google 图表图例

    这是我已经研究了几个小时的事情 但我似乎找不到有效的解决方案 我有一个页面 ASP NET Core 上面有引导选项卡 每个选项卡显示不同的图表 我已经阅读了各种答案 并从这个网站和其他网站尝试了很多不同的事情 但我确信我做错了什么 这是我
  • 使用最频繁的值按组填充缺失值

    我正在尝试使用一组使用最频繁的值来估算缺失值pandasPython 中的模块 在检查了 Stack Overflow 上的一些帖子后 我成功实现了这一目标 import numpy as np import pandas as pd df
  • 使用 rgb2ind 减少 matlab 中的颜色数量

    我正在做一些图像处理 我需要减少图像的颜色数量 我找到rgb2ind可以做到这一点并编写了以下代码片段 clc clear all X map rgb2ind RGB 6 nodither X rgb2ind RGB map rgb ind
  • 如何防止 Rails 在生产环境中记录操作视图

    在 Rails 3 2 0 中 是否可以关闭 Rails 日志记录以渲染视图 生产环境中的ActionView LogSubscriber 目前我发现抑制的唯一方法是猴子修补它并增加日志级别以通过以下方式进行调试 有没有更好的方法或任何配置
  • 关于 np.all 与 axis 的使用

    我尝试测试使用np all 测试数组a is a array 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 255 0 0 b 255 0 255 c np all a b axis 1
  • 将数据从一个 MySQL 表移动到另一个表

    当用户单击名为 删除 的按钮时 我试图将数据从一个数据库 注册 移动到另一个数据库 我想将数据移动到名为archived的表中 这是我尝试过的 从谷歌找到 result mysql query Insert Into archived se
  • LINQ to SQL 是否使用 ActiveRecord 模式?

    我刚刚研究了ActiveRecord模式 并基于此 http en wikipedia org wiki Active record pattern 看来 Linq 2 Sql 或多或少实现了这一点 我错了吗 或者需要更改什么才能使其符合
  • OpenGL 中对 R8G8B8 纹理的 NPOT 支持

    我使用 glew 和 glut 创建了一个示例应用程序 它读取 dds 文件并显示它 我手动读取dds文件 R8G8B8中的NPOT 886 x 317 文件 并创建数据指针 unsigned char 然后我使用准备纹理 void pre