欢迎访问宙启技术站
智能推送

使用QOpenGLWidget()实现地形渲染

发布时间:2024-01-02 10:13:25

QOpenGLWidget类是Qt提供的一个OpenGL窗口部件类,用于在Qt应用程序中显示OpenGL图形。

以下是使用QOpenGLWidget类实现地形渲染的一个示例。在这个示例中,我们将使用OpenGL绘制一个简单的地形,并使用着色器对地形进行渲染。

首先,创建一个继承自QOpenGLWidget的自定义窗口部件类TerrainWidget,并重写其中的一些方法。

class TerrainWidget : public QOpenGLWidget
{
public:
    TerrainWidget(QWidget *parent = nullptr);
    ~TerrainWidget();

protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int width, int height) override;

private:
    QOpenGLShaderProgram m_shaderProgram;
    QOpenGLVertexArrayObject m_vao;
    QOpenGLBuffer m_vbo;
};

TerrainWidget::TerrainWidget(QWidget *parent)
    : QOpenGLWidget(parent)
{
}

TerrainWidget::~TerrainWidget()
{
}

void TerrainWidget::initializeGL()
{
    // 初始化OpenGL函数
    initializeOpenGLFunctions();

    // 创建和编译顶点着色器
    QOpenGLShader vs(QOpenGLShader::Vertex, this);
    vs.compileSourceCode(
        "#version 330
"
        "layout(location = 0) in vec3 position;
"
        "void main()
"
        "{
"
        "    gl_Position = vec4(position, 1.0);
"
        "}
");
    
    // 创建和编译片段着色器
    QOpenGLShader fs(QOpenGLShader::Fragment, this);
    fs.compileSourceCode(
        "#version 330
"
        "out vec4 fragColor;
"
        "void main()
"
        "{
"
        "    fragColor = vec4(1.0, 0.0, 0.0, 1.0);
"
        "}
");

    // 创建着色器程序并链接顶点和片段着色器
    m_shaderProgram.addShader(&vs);
    m_shaderProgram.addShader(&fs);
    m_shaderProgram.link();

    // 创建和绑定顶点数组对象
    m_vao.create();
    m_vao.bind();

    // 创建和初始化顶点缓冲区对象
    float vertices[] = {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f,  0.5f, 0.0f
    };
    m_vbo.create();
    m_vbo.bind();
    m_vbo.allocate(vertices, sizeof(vertices));

    // 配置顶点属性指针
    m_shaderProgram.enableAttributeArray(0);
    m_shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 3, 0);

    // 解绑顶点数组对象和顶点缓冲区对象
    m_vao.release();
    m_vbo.release();
}

void TerrainWidget::paintGL()
{
    // 清空屏幕
    glClear(GL_COLOR_BUFFER_BIT);

    // 链接着色器程序
    m_shaderProgram.bind();

    // 绘制地形
    m_vao.bind();
    glDrawArrays(GL_TRIANGLES, 0, 3);
    m_vao.release();

    // 解绑着色器程序
    m_shaderProgram.release();
}

void TerrainWidget::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
}

在main函数中,将TerrainWidget添加到一个窗口中,并显示窗口。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建地形窗口部件并设置父窗口
    TerrainWidget terrainWidget;
    terrainWidget.setParent(nullptr);
    terrainWidget.resize(800, 600);
    terrainWidget.show();

    return a.exec();
}

通过运行上述代码,将显示一个简单的红色三角形,用于表示地形。

这个示例展示了如何使用QOpenGLWidget类来实现地形渲染。可以根据实际需求进行修改和扩展,例如使用更复杂的着色器、加载真实的地形数据等。使用QOpenGLWidget类可以很方便地在Qt应用程序中进行OpenGL渲染。