opengl - Texture的内部格式

标签 opengl graphics

看看下面的 OpenGL 函数:

void glTexImage2D(GLenum    target,
                  GLint     level,
                  GLint     internalFormat,
                  GLsizei   width,
                  GLsizei   height,
                  GLint     border,
                  GLenum    format,
                  GLenum    type,
                  const GLvoid * data);

我知道参数格式和类型描述了图像数据的格式和类型,但我不明白参数internalFormat。我应该如何在我的应用程序中设置它的值?

例如,我创建了一个这样的纹理:

glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE8,size,size,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,buffer);

当我在我的 GLSL 着色器中访问其中的纹理时,我得到的值似乎在 [0,1] 之间。为什么?它不应该在 [0,255] 之间吗?

我的部分着色器代码是:

vec = EntryPoint + delta_dir * texture(noiseTex,EntryPoint.xy * 32).x;

我的部分 C++ 代码:

for (int i = 0;i < temp;++i)
    {
        buffer[i] = 255.0 * rand() / (float)RAND_MAX;
    }
    glGenTextures(1,&noiseTex);
    glActiveTexture(GL_TEXTURE0 + activeTexUnit);
    glBindTexture(GL_TEXTURE_2D,noiseTex);
    glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE8,size,size,
                            0,GL_LUMINANCE,GL_UNSIGNED_BYTE,buffer);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

最佳答案

formattype参数描述您作为 pixel transfer operation 的一部分传递给 OpenGL 的数据. internalformat描述了 format of the texture 。你告诉 OpenGL 你给它看起来像 X,OpenGL 将它存储在数据为 Y 的纹理中。 internalformat是“Y”。

GL_LUMINANCE8内部格式表示规范化 无符号整数格式。这意味着数据在概念上是 float ,但作为压缩手段以规范化整数形式存储。

就此而言,formatGL_LUMINANCE表示您正在传递 float 据或规范化整数数据(type 表示它是规范化整数数据)。当然,因为没有 GL_LUMINANCE_INTEGER (这就是您所说的要传递整数数据,以与整数内部格式一起使用的方式),您不能真正使用这样的亮度数据。

使用 GL_RED_INTEGER对于格式和 GL_R8UI对于内部格式,如果你真的想在你的纹理中使用 8 位无符号 整数。请注意,整数纹理支持需要 OpenGL 3.x 级硬件。

也就是说,您不能使用sampler2D具有整数纹理。如果您使用的纹理采用无符号整数纹理格式,则必须使用usampler2D .

关于opengl - Texture的内部格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13041830/

相关文章:

java - 窗口打开时出错?

c++ - 用于透视投影的相机旋转

c# - 如何关闭 WPF 形状中的抗锯齿?

delphi - 如何从图形单元获取所有支持的文件格式?

用于在屏幕上显示/与键盘交互的Python包?

java - 在 swing 中调整图像大小

qt - 为 Qt 安装 OpenGL

编译因#include "..."而失败,但因#include <...> 而失败

c++ - Opengl减少制服的使用

java - 为什么我的图标不会重新绘制?