将Qt QImage传递给glsl纹理采样器

时间:2011-08-11 16:33:21

标签: qt opengl glsl qimage texturing

我正在使用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 个答案:

答案 0 :(得分:3)

将其更改为

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

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

答案 1 :(得分:1)

尝试使用以下方法转换QImage:

image = QGLWidget::convertToGLFormat(image);

另一个想法,如果你使用的是ES2,那么GL_RGBA8无效。我认为GL_BGRA可能是一个可选的扩展,或者不是ES 2.希望这会有所帮助。