opengl png图片 qt_QT开发OpenGL无法显示图像[已解决]

这篇博客主要记录了在QT中使用OpenGL显示PNG图片遇到的问题,代码中创建顶点数组对象(VAO)时初始大小设置错误,导致无法正确显示图像。博主通过调整VAO大小为4成功解决了问题。
摘要由CSDN通过智能技术生成

#ifndef GLWIDGET_H

#define GLWIDGET_H

#include

#include

#include

#include

#include

#include

class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions

{

public:

GLWidget(QWidget *parent=0);

~GLWidget();

protected:

virtual void initializeGL() Q_DECL_OVERRIDE;

virtual void paintGL() Q_DECL_OVERRIDE;

virtual void resizeGL(int w, int h) Q_DECL_OVERRIDE;

GLuint compileShaders();

private:

QOpenGLShaderProgram *program;

QOpenGLVertexArrayObject vao;

QOpenGLBuffer vbo;

static const char *vshader_source;

static const char *fshader_source;

};

#endif // GLWIDGET_H

#include "glwidget.h"

#include

#include

#include

GLWidget::GLWidget(QWidget *parent) :

QOpenGLWidget(parent)

{

}

GLWidget::~GLWidget()

{

}

void GLWidget::initializeGL()

{

initializeOpenGLFunctions();

GLfloat color[] = {0.0, 0.0, 0.0, 1.0};

GLfloat points[] = {1.0,0.0,0.0,1.0,

0.0,1.0,0.0,1.0,

1.0,1.0,0.0,1.0};

glClearBufferfv(GL_COLOR, 0, color);

program = new QOpenGLShaderProgram();

program->addShaderFromSourceCode(QOpenGLShader::Vertex, vshader_source);

program->addShaderFromSourceCode(QOpenGLShader::Fragment, fshader_source);

program->bindAttributeLocation("vertex", 0);

program->link();

assert(program->bind());

vao.create();

//vao.bind();

QOpenGLVertexArrayObject::Binder vaoBinder(&vao);

vbo.create();

vbo.bind();

vbo.allocate(points, sizeof(points));

vbo.bind();

QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();

f->glEnableVertexAttribArray(0);

f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

vbo.release();

program->release();

}

void GLWidget::paintGL()

{

QOpenGLVertexArrayObject::Binder vaoBinder(&vao);

program->bind();

glDrawArrays(GL_TRIANGLES, 0, 3);

program->release();

}

void GLWidget::resizeGL(int w, int h)

{

}

//GLuint GLWidget::compileShaders()

//{

// GLint status;

// GLchar log[1024];

// vshader = glCreateShader(GL_VERTEX_SHADER);

// glShaderSource(vshader, 1, vshader_source, NULL);

// glCompileShader(vshader);

// glGetShaderiv(vshader, GL_COMPILE_STATUS, &status);

// glGetShaderInfoLog(vshader, 1024, NULL, log);

// qDebug()<

// assert(status == GL_TRUE);

// fshader = glCreateShader(GL_FRAGMENT_SHADER);

// glShaderSource(fshader, 1, fshader_source, NULL);

// glCompileShader(fshader);

// glGetShaderiv(fshader, GL_COMPILE_STATUS, &status);

// glGetShaderInfoLog(fshader, 1024, NULL, log);

// qDebug()<

// assert(status == GL_TRUE);

// GLuint program = glCreateProgram();

// glAttachShader(program, vshader);

// glAttachShader(program, fshader);

// glLinkProgram(program);

// glGetProgramiv(program, GL_LINK_STATUS, &status);

// assert(status == GL_TRUE);

// glDeleteShader(vshader);

// glDeleteShader(fshader);

// return program;

//}

const char *GLWidget::vshader_source =

"attribute vec4 vertex;\n"

"void main(){\n"

"gl_Position = gl_Vertex;\n"

"}\n";

const char *GLWidget::fshader_source =

"void main(){ \n"

"gl_FragColor = vec4(0.0, 0.8, 1.0, 1.0); \n"

"} \n";

代码就以上这些,shader改了好几种都没用,实在没办法了,求大神解救!

已解决,设置vao属性那里大小应该是4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中使用OpenGL显示QImage,您需要使用QOpenGLWidget类。这是一个Qt小部件,它为OpenGL提供了一个渲染上下文,可以在其中绘制图形。下面是一个简单的示例代码,展示了如何使用QOpenGLWidget类显示QImage: ```cpp #include <QtWidgets/QApplication> #include <QtWidgets/QOpenGLWidget> #include <QtGui/QOpenGLShaderProgram> #include <QtGui/QOpenGLFunctions> #include <QtGui/QImage> #include <QtGui/QPainter> class SimpleOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: SimpleOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} protected: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Load image QImage image("path/to/image.png"); // Convert image to OpenGL texture GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Draw texture QOpenGLShaderProgram program; program.addShaderFromSourceCode(QOpenGLShader::Vertex, "attribute vec2 position; varying vec2 texCoord; void main() { gl_Position = vec4(position, 0.0, 1.0); texCoord = position * 0.5 + 0.5; }"); program.addShaderFromSourceCode(QOpenGLShader::Fragment, "uniform sampler2D texture; varying vec2 texCoord; void main() { gl_FragColor = texture2D(texture, texCoord); }"); program.link(); program.bind(); program.setUniformValue("texture", 0); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableVertexAttribArray(0); // Delete texture glDeleteTextures(1, &texture); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); SimpleOpenGLWidget w; w.show(); return a.exec(); } ``` 在上面的代码中,我们首先在initializeGL()函数中初始化OpenGL,并在resizeGL()函数中设置视口。在paintGL()函数中,我们首先将QImage转换为OpenGL纹理,然后使用着色器程序绘制纹理。 请注意,这只是一个简单的示例代码,实际的应用程序可能需要更复杂的着色器程序和纹理绑定代码,以适应不同的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值