2011-08-11 11 views
1

我写使用Qt渲染引擎和我遇到了问题与纹理我的模型传递一个Qt的QImage到GLSL纹理采样

我有一个非常简单的着色器来测试纹理: 顶点着色器:

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()返回“无效enumerant”

程序崩溃3210

有趣的是,当我尝试运行程序而不尝试将纹理发送到采样器时,纹理实际上出现在模型上。这让我想到我绑定它的方式与传统纹理处理有关,纹理绑定到由着色器拾取的特定纹理地址。这不是我想要的效果,因为我希望程序员能够在绘制时明确说明应该传递给制服的纹理(就像其他制服一样)

如何将纹理传递给它采样器,绑定纹理时需要更改什么?

+0

绑定纹理的实际代码是什么样的?我们在这里看到的是你的包装代码。什么是你的OpenGL代码? –

回答

3

将其更改为

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

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

尝试使用转换的QImage:

image = QGLWidget::convertToGLFormat(image); 

另一种思想,如果你正在使用ES2,然后GL_RGBA8无效。我认为GL_BGRA可能是一个可选的扩展,或不是ES 2.希望这有助于。