加载生成的纹理数据在 Libgdx/Lwjgl 中是不确定的

2024-03-23

数据格式如下:

final int width = 256;
final int height = 256;
final float[][][] data = new float[width][height][4];
FloatBuffer dataBuf;
int textureHandle;
FrameBuffer testFrame;
@Override
public void create () {
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            data[i][j][0] = 0.4f; /* r */
            data[i][j][1] = 0.38f; /* g */
            data[i][j][2] = 0.2f; /* b */
            data[i][j][3] = 0.9f; /* a */
        }
    }
    dataBuf = ByteBuffer.allocateDirect( Float.BYTES * 4 * width * height ).asFloatBuffer();
    for (float[][] dat : data) { /* Float Byte size * RGBA * width * height */
        for (float[] floats : dat) {
            dataBuf.put(floats, 0, 4);
        }
    }
    dataBuf.position(0); /* reset the caret position to the beginning of the array */
    textureHandle = Gdx.gl.glGenTexture();
    Gdx.gl.glActiveTexture(GL20.GL_TEXTURE1);
    Gdx.gl.glBindTexture(GL30.GL_TEXTURE_2D, textureHandle);
    Gdx.gl.glTexParameteri(GL30.GL_TEXTURE_2D, GL30.GL_TEXTURE_MIN_FILTER, GL30.GL_NEAREST);
    Gdx.gl.glTexParameteri(GL30.GL_TEXTURE_2D, GL30.GL_TEXTURE_MAG_FILTER, GL30.GL_LINEAR);
    Gdx.gl.glTexImage2D(
        GL30.GL_TEXTURE_2D, 0, GL30.GL_RGBA32F,
        width, height, 0, GL30.GL_RGBA, GL30.GL_FLOAT, dataBuf
    );
}

着色器的行为正确,因为它们是使用帧缓冲区对象进行测试的,并且它们显示帧缓冲区的正确内容。

然而,当渲染生成的纹理时,它似乎偏离了原始的颜色/值。 在大多数情况下,由FloatBuffers导致黑色纹理,有时会出现意想不到的颜色(例如柠檬绿而不是米色)。

不幸的是我不能玩glPixelStorei很多,因为该接口缺少大部分参数。但无论如何glGetError总是返回 0,所以我怀疑数据在某种程度上被错误地编译到了dataBuf字节流。

这里可能有什么问题?

Edit:一些调试细节:

  • glGetError()始终为零
  • the individual components seem to have a rough idea of the data, but most of the values produce a black texture:
    • r: 1.0f, g: 1.0f, b: 1.0f, a: 1.0f --> 黑屏
    • r: 0.9f, g: 0.9f, b: 0.9f, a: 0.9f --> 白屏
    • r: 0.9f, g: 0.0f, b: 0.0f, a: 0.9f --> 红屏
    • r: 0.0f, g: 0.9f, b: 0.0f, a: 0.9f --> 绿屏
    • r:0.0f,g:0.0f,b:0.9f,a:0.9f --> 蓝屏
    • r: 0.5f, g: 0.5f, b: 0.5f, a: 0.5f --> 黑屏
    • r: 0.4f, g: 0.32f, b: 0.2f, a: 0.9f --> 绿屏
  • 上面我怀疑是因为浮点值之间存在转换错误dataBuf和 openGL-s GL_FLOAT 上传纹理时
  • 否则,着色器和设置可以正常工作,因为它是使用帧缓冲区的颜色附件进行测试的,并且使用上述所有值都可以按预期工作。不同之处在于颜色纹理不是手动生成的,而是通过渲染到帧缓冲区中glClear(GL_COLOR_BUFFER_BIT);
  • 使用整数缓冲区也可以按预期工作(整数数组,值 0-255):
        dataBuf.position(0);
        Gdx.gl.glTexImage2D(
            GL30.GL_TEXTURE_2D, 0, GL30.GL_RGBA,
            width, height, 0, GL30.GL_RGBA, GL30.GL_UNSIGNED_INT, dataBuf
        );
  • LWJGL3 后端也存在相同的行为

我能够使用给定的代码复制该问题,并且可以通过一行更改来修复它。您的 FloatBuffer 默认为大端字节顺序,并且看起来像 libGDX、LWJGL 和/或 OpenGL 需要小端字节顺序。我在这里将您的示例制作成可执行的测试用例:https://github.com/yellowstonegames/SquidLib/blob/master/squidlib/src/test/java/squidpony/gdx/tests/issues/Issue6516.java#L37 https://github.com/yellowstonegames/SquidLib/blob/master/squidlib/src/test/java/squidpony/gdx/tests/issues/Issue6516.java#L37(测试用例并不依赖于整个库,它只是在已经依赖于 libGDX 并具有可用资产的项目中测试 libGDX 问题很方便)。我的解决办法是改变:

dataBuf = ByteBuffer.allocateDirect(Float.BYTES * 4 * width * height).asFloatBuffer();

to:

dataBuf = ByteBuffer.allocateDirect(Float.BYTES * 4 * width * height).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer();

看起来你的其他一切都是正确的;当我绘制该纹理时,我得到了预期的泥棕色,而不是柠檬绿。

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

加载生成的纹理数据在 Libgdx/Lwjgl 中是不确定的 的相关文章

  • 将 TextField 与 LibGDX 结合使用

    我正在使用 LibGDX 开发一款 Android 游戏 并且想要实现两个TextFields 登录到服务器 据我所知我需要使用Stage https libgdx badlogicgames com nightlies docs api
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • 我的绘图存在坐标/glortho 问题

    I have made a bit of a change to my code in the last couple of hours as everything was messy with my grid so I made it i
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • lnk1104:无法打开“LIBC.lib”链接

    使用 GLee 将着色器写入我的 OpenGL 项目并编译后 我收到了错误LNK1104 cannot open file LIBC lib 我尝试按照其他人的建议添加它并忽略它 但没有解决问题 有没有其他方法可以解决我错过的这个问题 以下
  • 如何通过pthreads管理两个或多个消费者?

    我有一个正在寻求解决的通用问题 即从标准输入或常规文件流发送到应用程序的二进制数据块 应用程序又将二进制数据转换为文本 使用线程 我想在将文本传输到下一个应用程序之前对其进行处理 该应用程序会进一步修改该文本 依此类推 作为一个简单的测试用
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

    我正在开发一个使用 GLSL 着色器的程序 我编写了 2 种不同的方法来用 2 种不同的方法计算 ADS 环境光 漫反射 镜面反射 着色 为了正确完成这项工作 我使用子例程来使用一种或另一种方法来计算 ADS 着色 这是片段着色器代码的一部
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 我如何在 LibGDX 应用程序中找到软键盘的高度

    我正在开发一个Android游戏与LibGDX 我需要找到用户正在使用的软键盘的高度 因为我想在键盘正上方显示一些对象 我读过这个帖子 如何获取 Android 上的软键盘高度 https stackoverflow com questio
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • libgdx SpriteBatch 渲染到纹理

    是否可以使用 libGdx 适用于 Android 桌面的 Java 引擎 中的 SpriteBatch 渲染到纹理 如果是这样 怎么办 基本上我想将所有内容渲染到 512 x 256 纹理的 320 x 240 区域 然后缩放区域以适合屏
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • Opengl 像素完美 2D 绘图

    我正在研究 2d 引擎 它已经工作得很好 但我不断收到像素错误 例如 我的窗口是 960x540 像素 我从 0 0 到 959 0 画一条线 我希望扫描线 0 上的每个像素都会被设置为一种颜色 但事实并非如此 最右边的像素没有被绘制 当我
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a

随机推荐

  • 使用 Spring RestTemplate 将嵌套 JSON 对象映射到 Java 类

    我知道这可能很简单 但是 我就是无法让它发挥作用 所以我尝试使用 Spring RestTemplate 来映射我的 JSON 数据 我有以下来自休息调用的 JSON 响应 message ok status ok data Name Yo
  • 熊猫合并 101

    我怎样才能执行 INNER LEFT RIGHT FULL OUTER JOIN和熊猫 合并后如何为缺失的行添加 NaN 合并后如何摆脱 NaN 我可以合并索引吗 如何合并多个 DataFrame 与 pandas 交叉连接 merge j
  • 动画 UIProgressView 的变化

    是否可以动画化 a 的变化UIProgressView以便显示能够平滑地移动到新值 有点像 NSProgressIndicator 那样 如果您对此感兴趣 请填写错误报告 Duplicate 5883058 Title UIProgress
  • 在 Ember.JS ember-cli 应用程序中包含引导库的推荐方法

    我正在尝试在当前的 ember cli 项目中正确安装 Twitter Bootstrap 我确实用 Bower 安装了 bootstrap bower install save bootstrap 现在库已下载到 vendor boots
  • 如何使用AES解密使用openssl命令加密的Java文件?

    我需要使用以下命令在 JAVA 中解密在 UNIX 中加密的文件 openssl aes 256 cbc a salt in password txt out password txt enc mypass mypass 我必须在 java
  • 如何从 JavaScript 中的字符串中删除单词数组?

    我有一个可以从字符串中删除单词的函数 这是 var removeFromString function oldStr fullStr return fullStr split oldStr join 我这样使用它 console log r
  • Maven 部署:即使工件已经存在也强制部署

    我正在构建一个项目 它由几个 有时不相关的 模块和一些更多的非标准 java 模块 使用 ANT 构建 组成 每个 Maven 模块在完成后都会部署到发布存储库 如果构建在中间失败 我可能已经部署了一些模块 因此如果我尝试重建 新的部署尝试
  • 退出和退出有什么区别!在红宝石中?

    退出和退出有什么区别 在红宝石中 几件事 退出处理程序以 exit 形式运行 但不是 exit 这意味着分配给 清理 的任何代码都不会使用 退出 来运行 退出 中的 退出状态 默认设置为 false 形式 而在 退出 形式中则为真 退出状态
  • 使用 xlrd 时读取包含公式的单元格值会返回 0.0

    我尝试读取单元格值 例如 Excel 工作表中的 E5 和 E5 包含一个公式 A29 A2 我使用以下代码 它返回 0 00 而不是实际值1 440408 有办法解决这个问题吗 我想打印正确的值 请在这件事上给予我帮助 谢谢 book x
  • jQuery 在 Chrome 和 Mac OS 上停止运行

    看看这个小提琴 http jsfiddle net mattball nWWSa http jsfiddle net mattball nWWSa var lis ul innerfade gt li function fadeThemOu
  • 适用于商品 Linux 存储场的最佳分布式文件系统 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有很多闲置的英特尔 Linux 服务器 数百台 并且希望将它们用于 Web 托管和文件共享环境中的分布式文件系统 这不适用于 HPC 应用程序
  • 如何按顺序获取int中的每个数字?

    我有一个整数 int iNums 12476 我想从中获取每个数字作为整数 就像是 foreach iNum in iNums printf i iNum 所以输出将是 1 2 4 7 6 但我需要每个数字作为int not as char
  • 在类中找不到 main(String[]) 方法

    我收到以下错误 在类中找不到 main String 方法 import java util class Coor int x y w Coor int x int y int w this x x this y y this w w cl
  • gtkmm 的 CMake 错误

    我正在使用 Debian 8 并安装了 libgtkmm 3 0 以及 dev 现在我有一个使用 gtkmm 的非常简单的程序 基本上是一个 Hello World 主要 cpp include include BrowserWindow
  • 如何用许多随机数填充 MySQL 表?

    我要问一个已经被问过的问题very https stackoverflow com questions 9505930 populate mysql table with random data in python抽象的terms http
  • 无法从“字符串”转换为“System.IFormatProvider”

    这段代码给了我这个错误 var n 9 7 2014 8 22 35 AM var m n ToString yyyy MM dd T HH mm ssZ 但这段代码可以正常工作 并以正确的格式返回日期 var n DateTime Now
  • 如何正确使用实时优先级

    我的问题可能并不是真正关于实时处理 但话又说回来 它可能是 我的应用程序有几个比 GUI 重要得多的线程 但是 我确实希望 GUI 至少可用 我不希望它始终锁定 并且我确实想根据我正在执行的处理结果更新屏幕 目前 我的所有必需项目都隔离在单
  • 随机森林回归中的样本大小

    如果理解正确 当计算随机森林估计量时 通常会应用引导法 这意味着仅使用来自样本 i 的数据构建树 i 并通过替换选择 我想知道sklearn的样本大小是多少随机森林回归器 http scikit learn org stable modul
  • R 错误:影子图形设备错误

    是的 我知道上述错误有很多线索 但 至少我 无法找到解决方案 因此 RStudio 在尝试绘制某些内容时出现以下错误 Error in RStudioGD Shadow graphics device error r error 4 R c
  • 加载生成的纹理数据在 Libgdx/Lwjgl 中是不确定的

    数据格式如下 final int width 256 final int height 256 final float data new float width height 4 FloatBuffer dataBuf int textur