使用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渲染。
