Выборка 1D текстуры на основе значений из 2D текстуры


Я заполняю 2D-текстуру Глубайтом из значений с плавающей точкой R (вещественных чисел), отображенных на (0,1) и умноженных на 255, дающих значения (0, 255). Сохранение так же GL_R8, как мне нужно только 1 значение из текстуры. Это может, например, представлять собой математическую функцию.

Я также загружаю текстуру 1d для работы в качестве цветовой карты / цветовой панели. Затем я произвожу выборку из 1D-текстуры на основе значений из моей 2D-текстуры.

Вот как работают мои шейдеры фрагментов:

#version 400
in vec2 f_textureCoord;

layout(location = 0) out vec4 FragColor;

uniform sampler2D textureData;
uniform sampler1D colorBar;


void main() {
    /* Values in the sampler are on (0, 1) * 255 => (0, 255) */
    vec3 texColor = texture2D(textureData, f_textureCoord).rgb;
    float s = texColor.r;

    /* Use the texture value as a coordinate in the 1D colorbar texture */
    vec3 color = texture1D(colorBar, s).rgb;

    float val = color.r;
    FragColor = vec4(val, val, val, 1);
}

Используя это I получаем следующую ошибку:

GlValidateProgram: ошибка проверки: сэмплеры разных типов указывают к той же текстурной единице

Тем не менее, мой код работает, как и ожидалось, по крайней мере, результат рендеринга!

Мои вопросы:

1) Почему я получаю эту ошибку / предупреждение? --- ответил в комментариях...

2) является ли это правильным подходом к тому, что я пытаюсь сделать? Должен ли я использовать другую форму буфера вместо сохранения значений функции в 2D текстура? 3) я предполагаю, что столкнусь с проблемами, когда моя математическая функция (заполнение 2D-текстуры) превысит некоторый предел размера текстуры. Какие-нибудь рекомендации относительно того, как мне следует действовать в этом направлении?
2 4

2 ответа:

1.) Вызовите glValidateProgram перед командой glDraw*, чтобы проверить, правильно ли вы настроили единообразные и атрибутивные местоположения. Таким образом, выдается неправильное предупреждение, потому что оба текстурных блока сэмплера по-прежнему равны нулю после связывания программы.

2.) Если речь идет о отображении результатов вашей функции с помощью цветового индекса, это нормально. Если я правильно понимаю textureData содержит только серые значения. Если вам нужен только один цветовой компонент из текстуры, вы должны написать

float s = texture2D(textureData, f_textureCoord).r;

3.) Если вы ... чтобы отобразить больше данных, чем вы можете поместить в одну текстуру, вам придется использовать тайлинг (т. е. разделить данные на несколько текстур и сделать несколько рисунков).

glValidateProgram предназначен для определения, может ли программа использоваться для визуализации с текущим состоянием OpenGL . Сюда входят такие объекты, как текущие привязки для текстур, однородные буферы и любые другие объекты, к которым текстуры имеют прямой доступ (буферы рисования и атрибуты вершин не входят в этот список).