当前位置: 首页 > 知识库问答 >
问题:

openGL使用GetTextureImage读取仅红色组件的纹理数据

公良运锋
2023-03-14

我的问题是,我无法正确读取存储在只有红色分量的纹理中的值。我的第一个实现导致了缓冲区溢出。所以我读了openGL参考资料,它说:

如果选定的纹理图像不包含四个组件,则应用以下映射。单组分纹理被视为RGBA缓冲区,红色设置为单组分值,绿色设置为0,蓝色设置为0,α设置为1。双分量纹理被视为RGBA缓冲区,红色设置为分量零的值,α设置为分量一的值,绿色和蓝色设置为0。最后,三个组件纹理被视为RGBA缓冲区,红色设置为组件零,绿色设置为组件一,蓝色设置为组件二,α设置为1。

第一件令人困惑的事情是,nvidia的实现将这些值紧密地打包在一起。如果我有四个一个字节的值,我只需要四个字节的空间,而不是16。所以我读了openGL规范,它在第236页的表8.18中告诉我相同的,除了两个组件纹理将它的第二个值存储在绿色通道中,而不是阿尔法通道中,这对我来说也更有意义。但是哪个定义是正确的呢?

它还说:

如果格式为颜色格式,则根据表8.18[…]在R、G、B和a之间分配组件

所以我问你:“什么是颜色格式?”以及“如果格式不是颜色格式,我的纹理数据是否紧凑”?我的纹理定义如下:type:GL\u UNSIGNED\u BYTE format:GL\u RED internalformat:GL\u R8

另一件事是,当我的纹理大小是两个像素的两倍时,前两个值保存在前两个字节中,但其他两个值保存在缓冲区的第五和第六个字节中。中间的两个字节是填充。所以我得到了“GL_-PACK_-ALIGNMENT”状态,它显示了四个字节。这怎么可能?

GetTexImage调用:

std::vector<GLubyte> values(TEXTURERESOLUTION * TEXTURERESOLUTION);

GLvoid *data = &values[0];//values are being passed through a function which does that

glBindTexture(GL_TEXTURE_2D, TEXTUREINDEX);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D, 0);

共有1个答案

刁丰羽
2023-03-14

第一个令人困惑的是,英伟达的实施将价值紧密地打包在一起。

这正是应该发生的。只有当您实际使用GL_RGGL_RGBGL_RGBA格式(并且源代码纹理包含较少的组件)时,才会对2,3或4个组件进行扩展。如果你只是ak为GL_RED你也只会得到GL_RED

[...]除了两个组件纹理存储它的第二个值不是在alpha通道中,而是在绿色通道中,这对我来说也更有意义。但是哪个定义是正确的呢?

正确的定义是规范中的定义。不幸的是,参考页经常有小的不准确或遗漏。在这种情况下,我认为参考文献已经过时了。描述分别匹配一个和两个通道的旧的和现在不推荐的GL_亮度GL_亮度格式,而不是现代的GL_REDGL_RG格式。

所以我问你:“什么是颜色格式?”

颜色格式是用于颜色纹理的格式,与非颜色格式(如GL_DEPTH_COMPONENTGL_STENCIL_INDEX)相反。

关于GL_PACK_ALIGNMENT的问题:GL的行为完全符合它的预期行为。你有一个2x2的纹理和GL_PACK_ALIGNMENT为4,这意味着数据将被填充在每一行,所以从一行到下一行的距离将是4的倍数。因此,您将得到第一行紧密打包,2个填充字节,最后是第二行。

 类似资料:
  • 我有一个纹理和OpenGL的小问题。我做了个小的。obj加载器(带纹理加载)但是所有东西都是蓝色的。示例: 我加载一个纹理。我将纹理与GL11.glBindTexture(GL11.GL_TEXTURE_2D,texureId)绑定。如果我这样做了: 它画了一个白色的四边形...但是如果我这样做: 它画了一个蓝色的四边形,其他的都是蓝色的。 也许有人知道解决方案?

  • 我正在OpenGL中练习纹理,将定义为白色的简单纹理应用到四边形上。代码编译和运行良好,但四元体的颜色只是黑色,而不是我指定的白色。 我认为这是因为我的片段着色器没有进行正确的采样,就像它从纹理函数返回的数据都是零,因此四边形的纹理变为黑色。我之所以这么想,是因为当我运行程序时,我可以把白色变成清晰的颜色,并稍微移动四边形上的一个顶点,以便看到背景(因为它通常会填充整个曲面)。然后我可以清楚地看到

  • OpenGL标准是否要求应该给一个程序没有绑定到纹理单元的统一采样器2D给出一个texture 2d操作的结果? 例如在像素着色器中: 在该计划中: 对于上下文,我想知道是否可以对纹理实体和非纹理实体使用相同的着色器,其中(希望如此),我只需要确保没有任何东西绑定到GL_TEXTURE_2D,以便texture2d()返回0,0,0,1。否则,我需要为每个置换使用一个着色器。

  • 我在学《欢乐合唱团》。0(我是一个新手:))在Android上,我想画一个有纹理的正方形,但我做不到。我在谷歌上搜索了很多,但我想不出答案,我只得到了一个黑色的正方形。 我设置了一个GLSurfaceView,然后是一个渲染器: 雪碧类: ShaderLoader。loadShader从文件(以res/raw格式)TextureLoader加载着色器。loadTexture从资源中加载纹理: 顶点

  • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理

  • 我想在FBO中加载两个纹理,其中一个纹理包含HDR图像,我的第一个目标是将图像从第一个纹理“复制”到第二个纹理(该纹理为空),并称为“下采样纹理”。 所以我创建FBO,加载我想用颜色_附件_0书写的纹理,并绑定它;然后初始化我的着色器程序并渲染一个四边形,其中包含我要在GL\u texture\u 0中读取的纹理。 然后我解开FBO并绑定“DownSamplingTex”,然后画一个四元组。 我不