1

我正在使用 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() 返回“无效枚举”而出现“访问冲突读取位置”错误而崩溃</p>

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

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

4

2 回答 2

3

将其更改为

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

或者

effect->setUniformValue("tex", texture->m_texture); 
于 2011-08-12T00:05:28.593 回答
1

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

image = QGLWidget::convertToGLFormat(image);

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

于 2013-08-17T21:18:53.180 回答