opengl——绘制三角形

本文介绍如何在规范化空间中设置顶点坐标以绘制一个三角形。文章详细解释了顶点坐标映射原理,并提供了具体的源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Background

这一节是非常短的。我们简单的扩展上一节的内容来画一个三角形。
在这一节中我们再一次在规范化空间中安排我们的顶点坐标。能够看见的顶点一定要在盒子内部,这样视口矩阵才能将这些顶点映射到窗口可以看见的地方。当我们忽略 Z 轴时,我们看到的盒子如下图:

在这里插入图片描述
点(-1.0,-1.0)是被映射到窗口的左下角,(-1.0,1.0)被映射到窗口的左上角等等。如果你将顶点的位置坐标扩展到这个盒子的外边,那么这个三角形将被截断同时你只能看到它的一部分。

Source Walkthru

Vector3fVertices[3];
Vertices[0] =Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] =Vector3f(1.0f, -1.0f, 0.0f);
Vertices[2] =Vector3f(0.0f, 1.0f, 0.0f);

我们让这个数组包含三个顶点。

glDrawArrays(GL_TRIANGLES,0, 3);

对于这个绘图函数我们做个两个改变:在这个例子中我们绘制的是一个三角形,而且使用了3个顶点。

Operation Result

在这里插入图片描述
学习内容来源:https://www.bootwiki.com/opengl/opengl-modern-opengl-tutorial.html

### 使用 OpenGL 和 Qt 实现三角形绘制 为了在 Qt 中利用 OpenGL 绘制一个简单的三角形,程序结构主要围绕 `QOpenGLWidget` 类展开。此组件提供了用于渲染 OpenGL 场景的基础框架,并允许开发者重载特定的方法来定制化图形处理逻辑。 #### 创建自定义的 Widget 类 首先,在头文件中定义一个新的 widget 类,该类继承自 `QOpenGLWidget` 及 `QOpenGLExtraFunctions` 并声明必要的成员变量和方法: ```cpp #ifndef WIDGET_H #define WIDGET_H #include <QOpenGLWidget> #include <QOpenGLExtraFunctions> #include <QOpenGLShaderProgram> class Widget : public QOpenGLWidget, protected QOpenGLExtraFunctions { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; private: QOpenGLShaderProgram m_shaderProgram; }; #endif // WIDGET_H ``` 接着实现在 cpp 文件中的这些虚函数,它们分别负责初始化、调整大小以及实际绘画操作: ```cpp #include "widget.h" Widget::Widget(QWidget *parent): QOpenGLWidget(parent){ } Widget::~Widget(){ } void Widget::initializeGL(){ initializeOpenGLFunctions(); // 编译并链接着色器程序... m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vshader.glsl"); m_shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fshader.glsl"); m_shaderProgram.link(); } void Widget::resizeGL(int w, int h){ glViewport(0, 0, w, qMax(h, 1)); } void Widget::paintGL(){ glClear(GL_COLOR_BUFFER_BIT); GLfloat vertices[] = { -0.5f, -0.5f, 0.5f, -0.5f, 0.0f, 0.5f }; GLuint VBO, VAO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); m_shaderProgram.bind(); glDrawArrays(GL_TRIANGLES, 0, 3); } ``` 上述代码片段展示了如何设置顶点缓冲对象(VBO)、顶点数组对象(VAO),并通过调用 `glDrawArrays()` 函数完成三角形的实际绘制过程[^4]。 对于着色器部分,则需准备两个独立的 `.glsl` 文件——一个是顶点着色器 (`vshader.glsl`) ,另一个是片元着色器(`fshader.glsl`) 。以下是顶点着色器的一个例子: ```glsl #version 330 core layout(location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); } ``` 这个顶点着色器接收来自 CPU 的几何数据作为输入参数,并将其转换成标准化设备坐标系下的位置信息以便后续光栅化阶段使用[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值