2011-08-11 18 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.希望這有助於。