尽管将WRAP设置为GL_REPEAT,但纹理没有重复

时间:2019-07-17 01:53:19

标签: opengl glsl textures glteximage2d texture-wrapping

我正在创建2D纹理,如下所示:

    GLuint t[1] = { 0 };

    glGenTextures( 1, t );
    ASSERT( t[0] > 0 );
    glBindTexture( GL_TEXTURE_2D, t[0] );
    CHECK_OGL

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
    CHECK_OGL

    ...

    glTexImage2D
    (
        GL_TEXTURE_2D,
        0,
        GL_R16F,
        sz,
        sz,
        0,
        GL_RED,
        GL_FLOAT,
        img
    );
    CHECK_OGL

然后在片段着色器中,我对-6,-6到6,6范围内的纹理进行大致采样。

但是,我观察到固定的纹理像素值,不再重复。

如果我通过在GLSL顶点着色器中添加一个fract()操作来明确地重复,那么我确实会看到纹理重复,但是考虑到WRAP模式,为什么采样器不自己做呢?

顶点着色器:

...
out vec2        UV;

void main()
{
        ...
        UV          = fract( vec2( inPos.x, inPos.z ) );
        //UV        = vec2( inPos.x, inPos.z );

片段着色器:

...
in              vec2    UV;
out             vec4    outCol;

uniform sampler2D       c_noiseSampler;

void main()
{
        float sample = texture( c_noiseSampler, UV ).r;
...

即使没有fract(),没有GL_REPEAT的纹理也不会重复,只是夹住。

为什么纹理不会重复。是因为GL_R16F之类的FLOAT纹理不支持这种包装吗?

我在使用nVidia GPU的Ubuntu LTS:

GL_RENDERER GeForce GTX 1650/PCIe/SSE2
GL_VERSION  3.3.0 NVIDIA 430.14
GL_SHADING_LANGUAGE_VERSION 3.30 NVIDIA via Cg compiler

0 个答案:

没有答案