2014-01-06 31 views
1

当您上传一个存储带符号字节的ByteBuffer(java lang对象)时,使用LJWGL函数glBufferData(),结果发现openGL解释相应缓冲区上数据的正确方法是使用GL_UNSIGNED_BYTE。为什么使用LWJGL将这些带符号字节读为无符号字节?

这是为什么? 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等放入这个bytebuffer,大概是有符号的字节,因为这是java处理的。所以这些字节在使用签名解释时可以存储12345,据推测。那么为什么openGL读取带有无符号解释的12345而不是带符号的解释呢,是一个问题。

请注意,数据的重要性是一个索引缓冲区。

+0

什么是siginificance是数据的含义。 0的值是什么意思,而255的值是什么意思?对于你所拥有的数据,-128是否有意义?所以这是你需要考虑的数据,而不是你在Java中存储它的类型(它没有无符号类型) – nos

+0

我在问题中添加了一个编辑来澄清 – Thomas

+0

0值之间没有区别到127是否是有符号或无符号字节。 OpenGL很可能会指定无符号字节,但Java不支持它们,因此它使用带符号字节。 –

回答

1

首先,不要使用GL_UNSIGNED_BYTE作为顶点缓冲区索引。 OpenGL在API级别支持这一点,但过去约14年制造的桌面GPU硬件通常不支持硬件级别。驱动程序会将索引转换为16位以满足硬件限制,所以您实际上正在增加驱动程序的工作负载。 GL_UNSIGNED_SHORT实际上是您应该使用的最小索引大小,如果您不想对驱动程序造成不必要的负担。它归结为未对齐的内存访问,如果需要,可以使用8位索引,但如果使用16/32位,则可以获得更好的顶点性能。

为了解决企业的实际问题,在这个问题上,你正在使用GL_UNSIGNED_BYTE解释顶点索引,在这种情况下,数据类型的范围是无关值与GL_SIGNED_BYTE实际上只事项解释颜色值,因为GL确实定点缩放,以便将值从[-128,127]重新映射 - >[-1.0,1.0](签名)或[0,255] - >[ 0.0,1.0](无符号)用于内部表示。

在顶点索引的情况下,然而,数是仍然 它被转换从无符号到符号或周围的其他方法之后。没有定点到浮点转换来解释顶点索引,所以值的范围并不特别重要(假设没有溢出)。

为此,您在使用顶点索引时没有选择。唯一有效的枚举是GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORTGL_UNSIGNED_INT。如果你的语言不能表示无符号值,那么OpenGL的语言绑定将负责确定这些枚举的含义以及如何处理它们。

0

有符号和无符号字节之间的主要区别是你如何解释这些位:负值具有与127以上的值相同的位模式。对于两者,不需要不同类型的存储器,并且转换真的是没有操作)使用二进制补码系统自动工作。

+0

你可能编辑你的答案根据我的编辑问题? – Thomas

+0

那么,为什么1 2 3 4 5的有符号和无符号二进制表示是相同的?这就是二进制补码系统的工作原理,正整数与无符号时的表示形式相同,而负时则与大正无符号整数具有相同的表示形式。恐怕这已经被讨论过了。 – Joni

+1

虽然你所说的是真的,但在许多情况下,OpenGL中的'signed'与'unsigned'比这更重要。当使用二进制补码时,无符号8位数字** 255 **具有与** - 1 **相同​​的位模式,但OpenGL将大量数据从定点整数转换为浮点数并需要关于为了做到这一点,所表示的数值范围......该数字可能意图映射到浮点数** 1.0 **或〜** - 0.0078 **,具体取决于数据类型是否应该有符号或无符号。 –

相关问题