【问题标题】:Pass a Qt QImage to a glsl texture sampler将 Qt QImage 传递给 glsl 纹理采样器
【发布时间】:2011-10-25 04:00:05
【问题描述】:

我正在使用 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() 返回“无效枚举”

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

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

【问题讨论】:

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

标签: qt opengl glsl qimage texturing


【解决方案1】:

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

image = QGLWidget::convertToGLFormat(image);

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

【讨论】:

    【解决方案2】:

    改成

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多