2

看下面的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);
4

2 回答 2

19

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

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

就此而言,formatofGL_LUMINANCE表示您正在传递浮点数据或标准化整数数据(type表示它是标准化整数数据)。当然,由于没有GL_LUMINANCE_INTEGER(这就是您所说的要传递整数数据,以用于整数内部格式),因此您不能真正使用这样的亮度数据。

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

话虽如此,您不能使用sampler2D整数纹理。如果您使用的纹理使用无符号整数纹理格式,则必须使用usampler2D.

于 2012-10-24T01:48:20.850 回答
1

值如何在内部存储不一定与您在 GLSL 中如何访问它相关。在实践中使用标准化颜色值 (0-1) 要容易得多。您是否出于某种原因想要在 (0-255) 范围内操作像素着色器中的像素值?

于 2012-10-24T01:47:16.313 回答