将Qt QImage传递给glsl纹理采样器
我正在使用Qt编写一个渲染引擎,在对模型进行纹理处理时遇到了问题 我有一个非常简单的着色器来测试纹理: 顶点着色器:将Qt QImage传递给glsl纹理采样器,qt,opengl,glsl,qimage,texturing,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; } 和片段
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()返回“无效枚举器”
有趣的是,当我尝试运行程序而不尝试将纹理发送到采样器时,纹理实际上出现在模型上。这让我认为我绑定它的方式与传统纹理处理有关,并且纹理被绑定到着色器拾取的特定纹理地址。这不是我想要的效果,因为我希望程序员能够在绘图时明确说明应该将什么纹理传递给统一体(就像设置任何其他统一体一样)
如何将纹理传递到其采样器,绑定纹理时需要更改什么?将其更改为
effect->setUniformValue(effect->uniformLocation("tex"), texture->m_texture);
或
换成
effect->setUniformValue(effect->uniformLocation("tex"), texture->m_texture);
或
尝试使用以下方法转换QImage:
image = QGLWidget::convertToGLFormat(image);
另一种想法是,如果您使用的是ES2,那么GL_RGBA8是无效的。我认为GL_BGRA可能是可选的扩展,也可能不是ES 2。希望这有帮助。尝试使用以下方法转换QImage:
image = QGLWidget::convertToGLFormat(image);
另一种想法是,如果您使用的是ES2,那么GL_RGBA8是无效的。我认为GL_BGRA可能是可选的扩展,也可能不是ES 2。希望这有帮助。绑定纹理的实际代码是什么样的?我们在这里看到的只是你的包装代码。你的OpenGL代码是什么?绑定纹理的实际代码是什么样的?我们在这里看到的只是你的包装代码。你的OpenGL代码是什么?