加载生成的纹理数据在 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 中是不确定的 的相关文章

  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • cout什么时候刷新?

    I know endl或致电flush 将冲洗它 我也知道当你打电话时cin after cout 它也会冲水 还有当程序退出时 是否还有其他情况cout脸红 我只是写了一个简单的循环 我没有刷新它 但我可以看到它被打印到屏幕上 为什么 谢
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • WGL:没有双缓冲 + 多重采样 = 失败?

    我通常使用创建像素格式wglChoosePixelFormatARB 与这些论点 除其他外 WGL DOUBLE BUFFER ARB GL TRUE WGL SAMPLE BUFFERS ARB GL TRUE WGL SAMPLES A
  • 使用 gl_FragColor 与 vec4 颜色?

    似乎有很多不明确的地方gl FragColor被弃用 例如 它缺失在GLSL 4 40 规范 https www khronos org registry OpenGL specs gl GLSLangSpec 4 40 pdf 但它包含在
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将
  • 为贝塞尔曲线中的每个点绘制切线

    我设法绘制了一条贝塞尔曲线 如下所示 glColor3f 0 1 0 glBegin GL LINE STRIP for int i 3 i lt nPt i 3 glColor3f 0 0 0 for float k 0 k lt NLI
  • 如何通过 Web-Workers 传递自定义类实例?

    由于 Web Worker JSON 在线程之间序列化数据 因此这样的方法不起作用 worker js function Animal Animal prototype foobar function self onmessage func
  • 之前对 GL.Color3 的调用使我的纹理使用了错误的颜色

    制作 2D OpenGL 游戏 渲染帧时 我需要首先绘制一些计算的四边形几何体 然后绘制一些纹理精灵 当我的渲染方法主体仅绘制精灵时 一切正常 但是 当我尝试在精灵之前绘制几何四边形时 精灵的纹理会更改为之前使用的最后一个 GL Color
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

    使用之间有什么区别吗 glutInitDisplayMode GLUT SINGLE GLUT RGB with glFlush and glutInitDisplayMode GLUT DOUBLE GLUT RGB with glutS
  • 如何在 OpenGL 中绘制镜像某些东西的镜子?

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

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • sRGB 纹理。它是否正确?

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

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • GNU 屏幕:环境变量

    更新 问题与问题相关GNU Screen 程序员在 Readbuf 中引用的内容 https stackoverflow com questions 1318186 gnu screen programmer quotes in readb
  • Libgdx SpriteBatch.draw() 指定 4 个顶点

    我正在使用 libGdx 创建一个 2d 游戏 并尝试使用这个特殊的方法来绘制一个简单的 2d 纹理 分别指定 4 个顶点 draw Texture texture float spriteVertices int offset int l
  • 线性/非线性纹理映射扭曲的四边形

    In my 上一个问题 https stackoverflow com questions 10832909 quad strip texturing distortion 已经确定 当对四边形进行纹理化时 面被分解为三角形 并且纹理坐标以

随机推荐

  • 使用 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