glUniform1i не имеет никакого эффекта - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь присвоить единицу текстуры 0 униформе sampler2D, но значение униформы не меняется.

Моя программа раскрашивает точки в зависимости от их высоты (координаты Y). Их цвет выглядит в текстуре.

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

#version 330 core

#define ELEVATION_MODE

layout (location = 0) in vec3 position;
layout (location = 1) in float intensity;

uniform mat4 vpMat;

flat out vec4 f_color;

#ifdef ELEVATION_MODE
    uniform sampler2D elevationTex;
#endif

#ifdef INTENSITY_MODE
    uniform sampler2D intensityTex;
#endif

// texCoords is the result of calculations done on vertex coords, I removed the calculation for clarity
vec4 elevationColor() {
    return vec4(textureLod(elevationTex, elevationTexCoords, 0), 1.0);
}

vec4 intensityColor() {
    return vec4(textureLod(elevationTex, intensityTexCoords, 0), 1.0);
}

int main() {
    gl_Position = vpMat * vec4(position.xyz, 1.0);


    #ifdef ELEVATION_MODE
        f_color = elevationColor();
    #endif

    #ifdef COLOR_LODDEPTH
        f_color = getNodeDepthColor();
    #endif
}

Вот мой фрагментный шейдер:

#version 330 core

out vec4 color;

flat in vec4 f_color;

void main() {
    color = f_color;
}

Когда этот шейдер выполняется, у меня связаны 2 текстуры:

  1. Высота текстуры в текстурном блоке 0
  2. Интенсивность текстуры в текстурном блоке 1

Я использую glUniform1i для установки значения униформы:

glUniform1i(elevationTexLocation, (GLuint)0);

Но когда я запускаю свою программу, значение униформы elevationTex равно 1 вместо 0.

Если я удалю вызов glUniform1i, унифицированное значение не изменится (по-прежнему 1), поэтому я думаю, что вызов ничего не делает (но не генерирует ошибку).

Если я изменю тип униформы на float и вызов с glUniform1i на:

glUniform1f(elevationYexLocation, 15.0f);

Значение в униформе теперь 15.0f. Так что в моей программе нет проблем с местоположением, из которого я называю glUniform1i, просто это не влияет на значение униформы.

Есть идеи о том, что я могу делать неправильно?

Я мог бы дать вам больше кода, но он не совсем доступен, так что если вы знаете ответ без него, это здорово. Если вам нужна часть кода на C ++, спросите, я постараюсь получить важные части

...