【问题标题】:texture appears to be reading off uninitialized memory纹理似乎正在读取未初始化的内存
【发布时间】:2017-12-15 07:57:25
【问题描述】:

我创建一个这样的纹理:

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 范围内时,也会发生此行为...

【问题讨论】:

  • 一个疯狂的猜测是,任何对象(纹理、着色器)创建代码都在 OpenGL 上下文范围之外被调用。仔细检查,在执行此操作时,当前线程上是否有有效的上下文处于活动状态。

标签: c opengl textures opengl-4


【解决方案1】:

尝试添加

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

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

【讨论】:

  • 感谢这项工作。我只想分享这个链接:opengl.org/discussion_boards/showthread.php/… 这也帮助我理解了它的含义。 TLDR:将纹理声明为字符数组并不能保证您的数组的内存地址可以被 4 整除。如果您使用整数创建纹理数组,那么您就不会有这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2019-10-03
相关资源
最近更新 更多