Texture的内部格式

Xia*_*Jun 2 opengl graphics

看看下面的OpenGL函数:

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

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

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

glTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE8,size,size,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,buffer);
Run Code Online (Sandbox Code Playgroud)

当我在我的GLSL着色器中使用它的纹理时,我得到的值似乎在[0,1] .WHy之间?它不应该在[0,255]之间吗?

我的着色器代码的一部分是:

vec = EntryPoint + delta_dir * texture(noiseTex,EntryPoint.xy * 32).x;
Run Code Online (Sandbox Code Playgroud)

我的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);
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 19

formattype参数描述要传递到OpenGL作为一部分的数据像素传送操作.在internalformat描述了纹理的格式.你告诉OpenGL你给它看起来像X,而OpenGL是将它存储在数据为Y的纹理中internalformat.它是"Y".

GL_LUMINANCE8内部格式表示归一化的无符号整数格式.这意味着数据在概念上是浮点数,但以归一化整数形式存储为压缩方式.

对于这个问题,在formatGL_LUMINANCE说,你通过任何浮点数据或归一化整数数据(type说,这是标准化的整数数据).当然,既然没有GL_LUMINANCE_INTEGER(你是怎么说你传递整数数据,与整数内部格式一起使用),你就不能真正使用像这样的亮度数据.

如果您确实需要纹理中的8位无符号整数,请使用GL_RED_INTEGER格式和GL_R8UI内部格式.请注意,整数纹理支持需要OpenGL 3.x级硬件.

话虽这么说,你不能使用sampler2D整数纹理.如果您使用的是使用无符号整数纹理格式的纹理,则必须使用usampler2D.