Передача только 1 float в sampleler1D - PullRequest
1 голос
/ 12 июля 2019

У меня есть несколько мешей, которые я хочу нарисовать в glDrawElementsInstanced, но я хочу, чтобы все вершины имели разную высоту, поэтому для этого я пытаюсь передать высоту сэмплера1D.

Вот как я создаю текстуру:

    glGenTextures(1, &meshHeightTexId_);
    glBindTexture(GL_TEXTURE_1D, meshHeightTexId_);

    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);

    // meshHeight_.size() = meshNumber_*meshSize_
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RED, meshNumber_*meshSize_, 0, GL_RED, GL_FLOAT, meshHeight_.data());

    glBindTexture(GL_TEXTURE_1D, 0);

(meshNumber_ - номера сетки, meshSize_ - количество содержащихся вершин, а meshHeight_ - вектор с плавающей точкой, содержащий все данные о высоте)

Вызов, который я делаю перед отрисовкой:

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_1D, meshHeightTexId_);

И в шейдере я собираю значение следующим образом:

int index = gl_InstanceID * meshSize + gl_VertexID;
vec4 tempo = texture(heightData, index);
float height = tempo.r;

(heightData - это имя сэмплера1D, которое я использую иmeshSize - это единое целое, содержащее количество вершин в сетке)

Затем я использую высоту в качестве значения y для вершины.

Но при этом похоже, что я получаю только высотуравно 0 (кроме 1 под углом без причины).

Я могу сделать что-то не так при инициализации текстуры ..

А также, если у вас есть идея получше, чем передатьвысота ячеек по текстуре я бывозьми.

1 Ответ

1 голос
/ 12 июля 2019

Так же, как GL_TEXTURE_2D, GL_TEXTURE_1D использует нормализованные координаты текстуры. Поскольку вы устанавливаете GL_CLAMP_TO_EDGE, все значения за пределами [0, 1] будут привязаны к этому интервалу, поэтому вы получите только первое и последнее значение высоты.

Функция, которую вы ищете: texelFetch:

vec4 tempo = texelFetch(heightData, index, 0);

В качестве альтернативы вы можете создать UBO и читать данные из массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...