Горизонтальные пары пикселей OpenGL, нарисованные местами

У меня есть проблема, которая очень похожа на описанную в Пиксели 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);
}

0

Решение

После тщательного изучения кода мне удалось найти виновного.

Я неправильно настраивал функцию смешивания, используя GL_SRC1_ALPHA а также GL_ONE_MINUS_SRC1_ALPHA вместо GL_SRC_ALPHA а также GL_ONE_MINUS_SRC_ALPHA,

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector