Значения текстуры шейдера не такие, как написано при создании текстуры - PullRequest
0 голосов
/ 29 октября 2018

Я создал текстуру и заполнил ее:

size_t size = width * height * 4;
float *pixels = new float[size];
for (size_t i = 0; i < size; ++i) {
    pixels[i] = 1.0f;
}

glTextureStorage2D(texture_id, 1, GL_RGBA16F, width,
                   height);
glTextureSubImage2D(texture_id, 0, 0, 0, width, height, GL_RGBA,
                    GL_FLOAT, pixels);

Я использую линейную фильтрацию (GL_LINEAR) и прижимаю к границе.

Но когда я рисую изображение:

color = texture(atlas, uv);

последняя строка выглядит так, как будто она имеет альфа-значения меньше 1. Если в шейдере я установил альфа на 1:

color.a = 1.0f;

это рисует это правильно. Что может быть причиной этого?

1 Ответ

0 голосов
/ 29 октября 2018

Проблема возникает из-за комбинации GL_LINEAR и GL_CLAMP_TO_BORDER:

  • Зажим на границу означает, что каждая координата текстуры вне [0, 1] вернет цвет границы. Этот цвет может быть установлен с glTexParameterf(..., GL_TEXTURE_BORDER_COLOR, ...) и является черным по умолчанию.

  • Линейный фильтр будет учитывать пиксели, расположенные рядом с место отбора проб (если выборка не происходит точно в центрах текселей 1 ), и, таким образом, также будет читать границы цвета текселей (которые здесь черные).

Если вам не нужно это поведение, простейшим решением будет использовать GL_CLAMP_TO_EDGE, который будет повторять последний ряд / столбец текселей до бесконечности. Различные режимы упаковки хорошо объяснены на open.gl .

1) Выборка, скорее всего, происходит не в центрах пикселей , как объяснено в этом ответе .

...