交换的OpenGL水平像素对被交换

时间:2015-04-04 16:40:39

标签: c++ opengl textures distortion

我遇到的问题与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);
}

1 个答案:

答案 0 :(得分:0)

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

我使用GL_SRC1_ALPHAGL_ONE_MINUS_SRC1_ALPHA代替GL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA错误地设置了混合功能。