gpt4 book ai didi

c++ - Qt/OpenGL 试图显示二维纹理

转载 作者:行者123 更新时间:2023-11-30 03:39:45 29 4
gpt4 key购买 nike

我是 OpenGL 的新手,所以我从头开始。我做的第一件事是使用旧方法(使用 glBegin() 和 glEnd())显示一个基本的 2D 纹理,它起作用了。然后我试图改进我的代码以便将来可以使用VBO和VAO,所以我不得不使用Shaders。我设法使用带有颜色的着色器,但我在纹理方面遇到了麻烦。

这是我的代码:

glwidget.h

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLBuffer>
#include <QDebug>
#include <QOpenGLTexture>
#include <GL/gl.h>
#include <QGLFunctions>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>



class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent = 0);

void initializeGL();
void paintGL();
void resizeGL(int w, int h);
void LoadGLTextures();

private :

QOpenGLShaderProgram *program;
GLuint tex;


public slots:



private slots:



};

#endif // GLWIDGET_H

glwidget.cpp

#include "glwidget.h"


GLWidget::GLWidget(QWidget *parent) :
QOpenGLWidget(parent)
{

}

void GLWidget::LoadGLTextures(){

QImage img;

if(!img.load("C:\\Users\\Adrien\\Desktop\\open3.bmp")){

qDebug()<<"Image loading failed";
}

QImage t = (img.convertToFormat(QImage::Format_RGBA8888)).mirrored();

glGenTextures(1, &tex);

glBindTexture(GL_TEXTURE_2D, tex);

glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glBindTexture( GL_TEXTURE_2D, 0);



}

void GLWidget::initializeGL(){

initializeOpenGLFunctions();

glClear(GL_COLOR_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);
LoadGLTextures();

QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
const char *vsrc =
"#version 150 core\n"
"in vec2 in_Vertex;\n"
"in vec2 vertTexCoord;\n"
"out vec2 fragTexCoord;\n"
"void main(void)\n"
"{\n"
" gl_Position = vec4(in_Vertex, 0.0, 1.0);\n"
" fragTexCoord = vertTexCoord;\n"
"}\n";
vshader->compileSourceCode(vsrc);

QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
const char *fsrc =
"#version 150 core\n"
"uniform sampler2D tex;\n"
"in vec2 fragTexCoord;\n"
"void main(void)\n"
"{\n"
" gl_FragColor = texture2D(tex,fragTexCoord);\n"
"}\n";
fshader->compileSourceCode(fsrc);

program = new QOpenGLShaderProgram;
program->addShader(vshader);
program->addShader(fshader);

program->link();
program->bind();
program->setUniformValue("tex", tex);

}

void GLWidget::paintGL(){

glClear(GL_COLOR_BUFFER_BIT);

program->bind();
{
float vertices[] = {-1.0,-1.0, 1.0,-1.0, 1.0,1.0, -1.0,1.0};

float coordTexture[] = {0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0};

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glEnableVertexAttribArray(0);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, coordTexture);
glEnableVertexAttribArray(2);

glBindTexture(GL_TEXTURE_2D, tex);

glDrawArrays(GL_QUADS, 0, 4);

glBindTexture(GL_TEXTURE_2D, 0);

glDisableVertexAttribArray(2);
glDisableVertexAttribArray(0);


}
program->release();

}

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

glViewport(0, 0, (GLint)w, (GLint)h);

}

我只有黑屏。一切都是 2D 的(我的项目不需要 3D),我暂时没有使用 VBO 和 VAO,我试图先让它工作。 LoadGLTexture() 似乎可以工作,因为我之前已经使用过它。顶点和片段着色器被使用并在片段着色器中处理颜色。

谢谢

最佳答案

在答案和评论中陈述的其他问题中,您的 position 和 texcoord 属性位置是错误的:

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, coordTexture);

第一个参数是位置。它由驱动程序分配,您只是假设这些位置有效。要解决此问题,请从着色器查询位置:

GLint vertexLocation = glGetAttribLocation( shaderProgram, "in_Vertex" );
GLint texcoordLocation = glGetAttribLocation( shaderProgram, "vertTexCoord" );

然后将这些值赋予 glVertexAttribPointer 的第一个参数和 glEnableVertexAttribArray

关于c++ - Qt/OpenGL 试图显示二维纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38566729/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com