查看以下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] .WHy之间?不应该在[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);
答案 0 :(得分:19)
format
和type
参数描述了作为pixel transfer operation的一部分传递给OpenGL的数据。 internalformat
描述了 format of the texture 。你告诉OpenGL你给它看起来像X,而OpenGL是将它存储在数据为Y的纹理中。internalformat
是“Y”。
GL_LUMINANCE8
内部格式表示规范化无符号整数格式。这意味着数据在概念上是浮点数,但以标准化整数形式存储为压缩方式。
就此而言,format
GL_LUMINANCE
表示您传递浮点数据或规范化整数数据(type
表示它是规范化的整数数据)。当然,由于没有GL_LUMINANCE_INTEGER
(这就是你传递整数数据的方式,与整数内部格式一起使用),你不能真正使用像这样的亮度数据此
如果您确实需要纹理中的8位无符号整数,请使用GL_RED_INTEGER
作为格式,使用GL_R8UI
作为内部格式。请注意,整数纹理支持需要OpenGL 3.x级硬件。
话虽如此, 无法 使用sampler2D
整数纹理。如果您使用的是使用无符号整数纹理格式的纹理,则 必须 使用usampler2D
。
答案 1 :(得分:1)
如何在内部存储值并不一定与您在GLSL中访问它的方式相关。在实践中使用标准化颜色值(0-1)更容易。您是否有理由想要在(0-255)范围内操纵像素着色器中的像素值?