c - 使用整数纹理坐标从一维纹理采样无符号整数

标签 c opengl glsl texture1d

我想将一大群无符号短元组(矩形几何图形)传递给我的片段着色器,并能够使用整数纹理坐标按原样对它们进行采样,为此我正在尝试具有如下所示的 1D 纹理,但仅获取空白 (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”

最佳答案

经过一些谷歌搜索和反复试验,我发现 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
);

关于c - 使用整数纹理坐标从一维纹理采样无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39576153/

相关文章:

c++ - glUnproject 和重新绘制场景后的奇怪结果

c++ - 使用 openGL 渲染时如何判断字体大小(以像素为单位)

c++ - OpenGL - 重新排序渲染方法后崩溃

opengl - 如何获取片段的当前颜色?

opengl-es - 片段着色器中的轮廓/锐利过渡

c - 获取错误 : memory protection violation

c++ - CUDA:对传递给 GPU 的数组的每个第 n 个点进行分组

C++ 将 char 数组存储在 int 指针中

c - 死 C 变量

c++ - 附加深度纹理 (C++) 时 OpenGL FBO 纹理困惑