纹理似乎正在读取未初始化的内存

时间:2017-12-15 07:57:26

标签: c opengl textures opengl-4

我创建了这样的纹理:

GLuint tex;
unsigned char data[12] = {255, 255, 255,
                          255, 255, 255,
                          255, 255, 255,
                          255, 255, 255};

glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

我得到它的位置:

GLuint texloc = glGetUniformLocation(program, "tex_map");

然后在我的绘图循环中我有:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glUniform1i(texloc, 0);

然后在我的片段着色器里面:

out vec3 color;

uniform sampler2D tex_map;

void  main()
{
    .
    .

    color = texture(tex_map, vec2(-0.1, -0.5));

}

有时当我运行程序时,我绘制的对象变成随机的非白色,通常是红色。我以为我使用GL_CLAMP_TO_EDGE处理了出界情况。是什么导致了这种行为?

编辑:当vec2(_, _)内的两个值都在0-1范围内时,也会发生这种情况......

1 个答案:

答案 0 :(得分:5)

尝试添加

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

默认对齐方式是4个字节,但您的data数组假设紧密包装。