【发布时间】:2014-01-07 01:02:44
【问题描述】:
当您使用 LJWGL 函数 glBufferData() 上传存储有符号字节的 ByteBuffer(java 语言对象)时,openGL 解释相应缓冲区上的数据的正确方法是使用 GL_UNSIGNED_BYTE。
这是为什么? LWJGL 似乎没有将 ByteBuffer 转换为其他格式,这里是 glBUfferData() 函数的源代码。
public static void glBufferData(int target, ByteBuffer data, int usage) {
ContextCapabilities caps = GLContext.getCapabilities();
long function_pointer = caps.glBufferData;
BufferChecks.checkFunctionAddress(function_pointer);
BufferChecks.checkDirect(data);
nglBufferData(target, data.remaining(), MemoryUtil.getAddress(data), usage, function_pointer);
}
知道为什么吗?
编辑:
我明白为什么你们可能认为不需要转换,因为无符号字节和字节的存储方式相同。但是让我澄清一下,我将 1 2 3 4 5 等的整数值放入这个字节缓冲区,大概是有符号字节,因为这是 java 处理的。因此,大概在使用有符号解释时,这些字节存储了 12345。那么为什么 openGL 用无符号解释而不是有符号解释来读取 12345,这就是问题所在。
注意数据的意义是一个索引缓冲区。
【问题讨论】:
-
重要的是数据的含义。值 0 和值 255 是什么意思? -128 对您拥有的数据是否有意义?所以需要考虑的是你拥有的数据,而不是你在 Java 中存储它的类型(没有无符号类型)
-
我在问题中添加了一个编辑以澄清
-
0 到 127 的值无论是有符号字节还是无符号字节都没有区别。很可能 OpenGL 指定了无符号字节,但 Java 不支持它们,因此它使用有符号字节。