纹理的internalformat(the internalformat of Texture)

2019-08-01 20:04发布

请看下面的OpenGL函数:

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

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

例如,我创建这样的结构:

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

当我在aceess它的质地在我的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);

Answer 1:

formattype参数描述要传递到OpenGL作为一部分的数据像素传送操作 。 该internalformat描述的纹理格式 。 你是说,你给它需要看起来像X的OpenGL和OpenGL是将其存储在纹理数据所在Y的internalformat是“Y”。

所述GL_LUMINANCE8内部格式表示的无符号整数格式。 这意味着,数据在概念上被浮点,而是存储在归一化的整数形式压缩的手段。

对于这个问题,该formatGL_LUMINANCE说,你传递或者浮点数据或归一化整数数据( type说,这是标准化的整数数据)。 当然,因为没有GL_LUMINANCE_INTEGER (这是你如何说,你传递整型数据,与整数内部格式使用),你真的不能使用这样的亮度数据。

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

话虽这么说,你不能使用sampler2D与整数质感。 如果您使用的是使用一个无符号整数纹理格式的纹理,你必须使用usampler2D



Answer 2:

如何值存储在内部并不一定是相关的,你会如何访问它GLSL。 使用标准化的颜色值(0-1)是在实践中容易得多。 有没有要处理的像素值在像素着色器中(0-255)范围内的一些原因?



文章来源: the internalformat of Texture