使用整数纹理坐标从1D纹理中采样无符号整数

时间:2016-09-19 14:52:49

标签: c opengl glsl texture1d

我想将一大堆unsigned short元组(矩形几何)传递给我的片段着色器并能够使用整数纹理坐标对它们进行采样,为此我尝试使用一维纹理如下所示,但只获得空白(0)值。

纹理创建和初始化:

GLushort data[128][2];
// omitted array initialization

GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_1D, tex);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage1D(
    GL_TEXTURE_1D,
    0,
    GL_RG16UI,
    128,
    0,
    GL_RG_INTEGER,
    GL_UNSIGNED_SHORT,
    data
);

纹理传递到着色器:

int tex_unit = 0;
glActiveTexture(GL_TEXTURE0 + tex_unit);
glBindTexture(GL_TEXTURE_1D, tex);
glUniform1iv(loc, 1, &tex_unit);

调试片段着色器:

#version 330 core
out vec4 out_color;

uniform usampler1D tex;

void main()
{
    uvec4 rect = texelFetch(tex, 70, 0);
    uint w = rect.r;
    uint h = rect.g;
    out_color = w > 0u ? vec4(1) : vec4(0);
}

可行的事情:data数组中的非零数据,纹理图像单元设置和采样器统一初始化。

OpenGL 4.1,OSX 10.11.6“El Capitan”

1 个答案:

答案 0 :(得分:1)

经过一些谷歌搜索并通过反复试验,我发现this post,其中指出使用整数纹理格式(例如,GL_RG16UI内部格式)GL_LINEAR过滤无法指定且仅GL_NEAREST适用,因此,使用以下纹理创建代码解决了所有问题:

GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_1D, tex);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage1D(
    GL_TEXTURE_1D,
    0,
    GL_RG16UI,
    128,
    0,
    GL_RG_INTEGER,
    GL_UNSIGNED_BYTE,
    data
);