如何使用 GL_RGB9_E5 格式?

Posted

技术标签:

【中文标题】如何使用 GL_RGB9_E5 格式?【英文标题】:how to use GL_RGB9_E5 format? 【发布时间】:2019-04-15 15:40:30 【问题描述】:

我正在尝试使用具有 3D 纹理的 GL_RGB9_E5 格式。为此,我创建了简单的测试来了解格式的使用。不知何故,我没有得到我所期望的。以下是测试程序

GLuint texture;
const unsigned int depth = 1;
const unsigned int width = 7;
const unsigned int height = 3;

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
const float color[3] =  0.0f, 0.5f, 0.0f ;
const rgb9e5 uColor = float3_to_rgb9e5(color);

GLuint * t1 = (GLuint*)malloc(width*height*depth* sizeof(GLuint));
GLuint * t2 = (GLuint*)malloc(width*height*depth* sizeof(GLuint));
int index = 0;
for (int i = 0; i < depth; i++)
    for (int j = 0; j < width; j++)
        for (int k = 0; k < height; k++)
        
            t1[index] = uColor.raw;
            index++;
        

glTexImage3D(GL_TEXTURE_3D, 0,
    GL_RGB9_E5,
    width, height, depth, 0,
    GL_RGB,
    GL_UNSIGNED_INT,
    (void*)t1);

glGetTexImage(GL_TEXTURE_3D, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, t2);

index = 0;
for (int i = 0; i < depth; i++)
    for (int j = 0; j < width; j++)
        for (int k = 0; k < height; k++)
        
            rgb9e5 t;
            t.raw = t2[index];
            index++;
        

我期待的是 uColor.raw 我放入 t1 我在 t2 中得到相同的原始颜色。 p>

我采用了Specification for GL_RGB9_E5的float3_to_rgb9e5方法 在底部你可以找到代码。

如果有人能举例说明如何正确使用它或正确的做法,那就太好了。

【问题讨论】:

【参考方案1】:
    GL_RGB,
    GL_UNSIGNED_INT,

这意味着您正在传递 3 通道像素数据,其中每个通道都是标准化的 32 位无符号整数。但这并不是你真正在做的事情。

您实际上是在传递 3 个通道数据,这些数据被打包成一个 32 位无符号整数,这样前 5 位代表一个浮点指数,然后是 3 组 9 位,每组代表无符号尾数一个浮子。我们拼写:

GL_RGB,
GL_UNSIGNED_INT_5_9_9_9_REV

【讨论】:

好的,谢谢。我正在这样做,但可能不理解。谢谢解释

以上是关于如何使用 GL_RGB9_E5 格式?的主要内容,如果未能解决你的问题,请参考以下文章

在 glCopyTexImage1D() OpenGL 3.3 中使用 GL_RGB10_A2UI 内部格式

使用 GL_RGB 格式抓取 Mac OS 屏幕

我应该使用哪种 OpenGL ES 纹理格式来在 iPad 上获得更好的动态范围?

如何使用C语言将汉字转换成UTF8编码,如将“你好”转成:%E4%BD%A0%E5%A5%

如何确定 glTexImage3D 的尺寸参数?

如何格式化 mongodb find 查询的结果?