У меня есть проблема, которая очень похожа на описанную в Пиксели OpenGL, нарисованные при каждой замене горизонтальной пары. Основное отличие состоит в том, что я получаю это искажение, даже когда я подаю текстуре однобайтовые значения только для красного цвета.
РЕДАКТИРОВАТЬПри более внимательном рассмотрении нормальных текстур я обнаружил, что эта проблема проявляется при рендеринге любой 2D-текстуры. Я попытался повернуть полученную текстуру, меняя координаты текстуры. Полученная картинка еще поменялась визуальный горизонтальные пиксели — так что я предполагаю, что данные в текстуре хороши, и искажение происходит при рендеринге текстуры.
Вот соответствующие части кода:
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);
}
После тщательного изучения кода мне удалось найти виновного.
Я неправильно настраивал функцию смешивания, используя GL_SRC1_ALPHA
а также GL_ONE_MINUS_SRC1_ALPHA
вместо GL_SRC_ALPHA
а также GL_ONE_MINUS_SRC_ALPHA
,