Я пишу движок рендеринга с использованием Qt, и у меня возникают проблемы с текстурированием моих моделей
У меня есть очень простой шейдер для проверки текстурирования:
вершинный шейдер:
Attribute vec4 Vertex;
Attribute vec2 texcoords;
uniform mat4 mvp;
varying vec2 outTexture;
void main() {
gl_Position = mvp * Vertex;
outTexture = texcoords;
}
и фрагментный шейдер:
uniform sampler2D tex;
varying vec2 outTexture;
void main() {
vec4 color = texture2D(tex, outTexture);
gl_FragColor = color;
}
Я правильно передаю свои текстурные координаты шейдерам
Моя проблема заключается в связывании QImage и отправке его в форму текстуры.
Я использую следующий код для привязки текстуры:
const QString& filename;
GLuint m_texture;
QImage image(filename);
image = image.convertToFormat(QImage::Format_ARGB32);
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.width(), image.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, image.bits());
glGenerateMipmap(GL_TEXTURE2D);
glEnable(GL_TEXTURE_2D);
Шейдер работает, и я могу передать униформу в матрицу и атрибуты в координаты вершины и текстуры, но когда я пытаюсь отправить униформу в текстуру так же, как и так:
effect->setUniformValue(effect->uniformLocation("tex", texture->m_texture));
программа аварийно завершает работу с ошибкой «место чтения нарушения доступа» с glGetError (), возвращающей «недопустимый перечислитель»
Интересно, что когда я пытаюсь запустить программу, не пытаясь отправить текстуру в сэмплер, текстура фактически появляется в модели. Это заставляет меня думать, что способ привязки связан с устаревшей обработкой текстур, и текстура привязывается к определенному адресу текстуры, который выбирается шейдером. Это не тот эффект, которого я хочу, потому что я хочу, чтобы программист мог явно указывать во время рисования, какую текстуру следует передавать в униформу (так же, как установлена любая другая униформа)
Как передать текстуру в сэмплер, что мне нужно изменить при связывании текстуры?