Opengl 如何在纹理中存储指针?

Opengl 如何在纹理中存储指针?,opengl,glsl,Opengl,Glsl,我有一个包含数据的ARGB float纹理。其中一个数据项是指向纹理中另一个像素的索引 这是将索引解码为UV坐标的代码,可与texelfetch一起使用,以读取其指向的像素: ivec2 getTexelfetchCoord_TEXTURE(float index) { return ivec2( mod(index, TEXTURE_WIDTH), int(index / TEXTURE_WIDTH) ); } 只要纹理不大于4096x4096,此操作就可以正常工作。如果大于该值,则

我有一个包含数据的ARGB float纹理。其中一个数据项是指向纹理中另一个像素的索引

这是将索引解码为UV坐标的代码,可与texelfetch一起使用,以读取其指向的像素:

ivec2 getTexelfetchCoord_TEXTURE(float index)
{
    return ivec2( mod(index, TEXTURE_WIDTH), int(index / TEXTURE_WIDTH) );
}
只要纹理不大于4096x4096,此操作就可以正常工作。如果大于该值,则由于浮点精度问题,浮点索引值将变得不准确

问题是32位浮点仅使用24位作为整数部分,这意味着U和V分量各只有12位。2^12=4096,唉,最大范围是4096。使用这个标志,我可以将其扩展到8192,但这仍然不足以达到我的目的

显而易见的解决方案是将索引存储为两个单独的条目,U坐标和V坐标。然而,由于太复杂的原因,我无法进入这里,这个选项对我来说是不可用的

所以,我想知道,有没有一种方法可以将一个有符号的32位整数打包成一个浮点,然后将其解压成一个具有完整32位精度的整数?事实上,我甚至不确定OpenGL中的int是否真的是32位的,或者它们是否实际上在内部存储为具有相同24位范围的浮点


基本上,我想把UV坐标打包成一个浮点数,然后重新打包成一个UV坐标,精确范围超过4096x4096。这在GLSL中可能吗?

您可以使用整数纹理,您知道。。。它们不必是浮点型的。@user253751我知道,但数据纹理包含大量数据,其中大部分数据必须是浮点型的,而不仅仅是指针。另外,您是否可以确认int纹理提供了完整的32位int范围,或者这取决于每个平台上的OpenGL实现?我会质疑您的数据布局。我甚至不确定将这些东西存储在纹理中是否是一个好主意。