纹理

2012-10-24 47 views
2

请看下面的OpenGL函数internalformat:纹理

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]之间不应该?我的shader代码

部分原因是:我的C

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

部分++代码:

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); 
+1

您应该发布着色器代码,以便我们可以诊断您描述的行为。 –

回答

19

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

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

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

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

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

+0

指定(大小)的内部格式只是GL的提示。 GL只需要每个基本内部格式具有一种尺寸的内部格式,并且可以以任何想要的方式转换输入。 LUMINANCE8可能由LUMINANCE4内部代表。标准本身并不禁止它。 – Andreas

+0

@安德里亚斯:有许多必需的内部格式不允许“仅仅是一个提示”。 –

+0

阅读OpenGL 1.3规范我发现内部格式没有SIZE要求。后来的版本有这种变化吗?我误解了标准吗? – Andreas

1

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

+0

如何使用规范化的颜色值(0-1)再设置参数以及如何通过设置参数来操作像素着色器中的像素值,范围为0-255?谢谢〜 – XiaJun

+1

@XiaJun:通过指定值范围对于基于整数的图像格式,总是归一化到范围[0,1]。只有浮点内部格式的值才能通过。然而,并非所有的OpenGL实现都支持浮动纹理。为什么你需要价值[0,255]呢?这只是应用的乘法因子255。 – datenwolf