【问题标题】:OpenGL horizontal pixel pairs drawn swappedOpenGL水平像素对绘制交换
【发布时间】:2015-04-09 22:09:07
【问题描述】:

我遇到的问题与OpenGL pixels drawn with each horizontal pair swapped 中描述的问题极为相似。主要区别在于,即使我输入纹理只有一个字节的红色值,我也会得到这种失真。

编辑:通过仔细检查普通纹理,我发现渲染任何 2D 纹理时都会出现此问题。我尝试通过交换纹理坐标来旋转生成的纹理。生成的图片仍然交换了 visual 个水平像素 - 所以我假设纹理中的数据是好的,并且在渲染纹理时会发生失真。

以下是代码的相关部分:

C++:

struct coord_t { float x; float y; }

GLint loc = glGetAttributeLocation(program, "coord");
if (loc != -1) {
  glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE,
    sizeof(coord_t), static_cast<void *>(offsetof(coord_t, x)));
  glEnableVertexAttribArray(loc);
}
loc = glGetAttributeLocation(program, "tex_coord");
if (loc != -1) {
  glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, sizeof(coord_t),
    static_cast<void *>((void*)(4*sizeof(coord_t)+offsetof(coord_t, x)));
  glEnableVertexAttribArray(loc);
}

// ... Texture binding to GL_TEXTURE_2D ...

coord_t pos[] = {coord_t{-1.f,-1.f}, coord_t{1.f,-1.f}
  coord_t{-1.f,1.f}, coord_t{1.f,1.f}
};

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(pos), pos); // position
glBuffefSubData(GL_ARRAY_BUFFER, sizeof(pos), sizeof(pos), pos); // texture coordinates

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

对应的顶点着色器:

#version 110
attribute vec2 coord;
attribute vec2 tex_coord;
varying vec2 tex_out;

void main(void) {
  gl_Position = vec4(coord.xy, 0.0, 1.0);
  tex_out = tex_coord;
}

对应片段着色器:

#version 110
uniform sampler2D my_texture;
varying vec2 tex_out;

void main(void) {
  gl_FragColor = texture(my_texture, tex_out);
}

【问题讨论】:

  • 目前完全不清楚发生了什么。您应该提供更多上下文。也可能是您的绘图代码错误,或者您的 subimg 数据不是您所期望的。或两者。读回纹理数据(或在 gl 调试器中检查)也可能是个好主意。
  • 你是对的,字节序不会成为问题,但对齐可能取决于width 的值。您已经使用解包对齐设置对此进行了补偿。使用这种格式读回数据可能是一个问题,这会受到包对齐的影响(默认也是 4)。
  • 感谢之前的两位 cmets。我用我认为相关的实际代码中的新发现和样本扩展了这个问题。但由于我是 OpenGL 新手,我可能省略了一些重要的内容,如果有人指出,我会很高兴再次扩展它。
  • 您加载的纹理不正确。很可能将其加载为 24 位而不是 32 位。你能分享更多关于纹理加载的代码吗?你也应该检查你的纹理格式。是 RGB,是 RGBA,是 ABGR,等等?您应该检查纹理加载的步幅。如果纹理是 RGB24,使用 3 的步幅。如果是 RGBA32,使用 4,等等。
  • @DimoMarkov 我知道这可能是一个问题,但如第一段所述,我正在使用 GL_RED 和 GL_UNSIGNED_BYTE 的组合加载数据 - 这意味着一次一个字节,步幅为 1。

标签: c++ opengl textures distortion


【解决方案1】:

经过广泛的代码调查,我设法找到了罪魁祸首。

我错误地设置了混合功能,使用GL_SRC1_ALPHAGL_ONE_MINUS_SRC1_ALPHA 而不是GL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA

【讨论】:

  • 我知道问题中的代码和其他详细信息与此答案无关。在将此答案标记为解决方案之前,我想问一下我是否应该更新/删减问题,或者保持原样(我不能在元中询问,没有足够的声誉)。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多