Не удается загрузить текстуру с помощью функции glUniform1i - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь следовать руководству по YT на канале 'Черно' об OpenGL (мой код можно найти здесь ). У меня есть две униформы u_Color и u_Texture, которые я загружаю, используя функцию glUniform1i, вызываемую из файла Shader. cpp. Для u_Color все в порядке, но когда я пытаюсь загрузить u_Texture, я получаю код ошибки

0x502 (GL_INVALID_OPERATION; отладка Qt прекращает выводить сообщение об ошибке "Недопустимая операция").

Я пытался удалить неиспользуемые вызовы униформы "u_Color" в шейдере и cpp коде, я пытался использовать функцию вне макроса GLCall и некоторых других вещей, но она просто не хочет работать. Я уверен, что расположение текстуры в порядке (без знака int), и я думаю, что мой код выглядит точно так же, как тот из учебника, который действительно работает!

Я работаю в системе Linux (18.04), с Intel Графическая карта c, и я использую Qt Creator (Qt Creator 4.11.2 на основе Qt 5.14.2) с компилятором g ++ (7.5.0).

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

Это проблемная c часть кода из "Shader. cpp"

GLuint uniformlocation = static_cast<GLuint>(glGetUniformLocation(m_rendererID, "u_Texture"));
glUniform1f(uniformLocation, value);

А вот фрагментный шейдер, который использует u_Texture

#version 330 core

layout(location = 0) out vec4 color;

in vec2 v_TexCoord;

uniform vec4 u_Color;
uniform sampler2D u_Texture;

void main()
{
    vec4 texColor = texture2D(u_Texture, v_TexCoord);
    color = texColor;
}

1 Ответ

2 голосов
/ 28 апреля 2020

glUniform1f устанавливает единообразное значение установленной в данный момент программы, поэтому программа должна быть установлена ​​с помощью glUseProgram до:

GLuint uniformlocation = static_cast<GLuint>(glGetUniformLocation(m_rendererID, "u_Texture"));
glUseProgram(m_rendererID);
glUniform1f(uniformLocation, value);

соответственно:

shader.bind();
shader.setUniform1i("u_Texture", 0);

GL_INVALID_OPERATION вызвано тем, что текущий программный объект отсутствует.


В качестве альтернативы вы можете использовать glProgramUniform для указания значения универсальной переменной для указанного программного объекта

...