Передайте Qt QImage в образец текстуры glsl - PullRequest
1 голос
/ 11 августа 2011

Я пишу движок рендеринга с использованием 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 (), возвращающей «недопустимый перечислитель»

Интересно, что когда я пытаюсь запустить программу, не пытаясь отправить текстуру в сэмплер, текстура фактически появляется в модели. Это заставляет меня думать, что способ привязки связан с устаревшей обработкой текстур, и текстура привязывается к определенному адресу текстуры, который выбирается шейдером. Это не тот эффект, которого я хочу, потому что я хочу, чтобы программист мог явно указывать во время рисования, какую текстуру следует передавать в униформу (так же, как установлена ​​любая другая униформа)

Как передать текстуру в сэмплер, что мне нужно изменить при связывании текстуры?

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Измените его на

effect->setUniformValue(effect->uniformLocation("tex"), texture->m_texture);

или

effect->setUniformValue("tex", texture->m_texture); 
1 голос
/ 18 августа 2013

Попробуйте преобразовать QImage, используя:

image = QGLWidget::convertToGLFormat(image);

Еще одна мысль: если вы используете ES2, то GL_RGBA8 недействителен.Я думаю, что GL_BGRA может быть дополнительным расширением или не ES 2. Надеюсь, это поможет.

...