当前位置:网站首页>OpenGL 绘制彩色的三角形
OpenGL 绘制彩色的三角形
2022-07-03 11:06:00 【wb175208】
使用openGL绘制图形需要三步:
1.创建一个VBO,使内存中的数据,存到显卡缓存中;VBO的任务就是这一件事;
2.创建一VAO,也就是属性的数组,负责把现存中的的数据,绑定属性,指定数据的使用规则,使着色器明白那些数据是颜色,那些是坐标;
3.着色器程序,运行在GPU中,负责把现存中的数据,通过计算渲染出图片;
绘制一个顶点颜色不同的三角形,需要给三角形的每隔顶点设置一个颜色,这也就需要一些颜色数据。我们可以单独定义一下顶点数据和颜色数据。
GLfloat ver[] = {
//如果话两个三角形的话,常规画法,定义两个三角形的位置点
//第一个三角形
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
GLfloat verColor[] = {
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
看一下绘制效果:
#pragma once
#include <QOpenGLWindow>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
class QOpenGLFunctions_3_3_Core;
class HelloShaderSelf : public QOpenGLWindow {
Q_OBJECT
public:
HelloShaderSelf();
~HelloShaderSelf();
private:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
private:
QOpenGLFunctions_3_3_Core* _openGLCore;
GLuint _VBO;//顶点位置VBO
GLuint _VBOColor;//顶点颜色VBO
GLuint _VAO;
QOpenGLShaderProgram _shaderProgram;//着色器程序,所里系统所有的着色器
};
#include <QOpenGLFunctions_3_3_Core>
#include <QVector4D>
#include <QMath.h>
#include "HelloShaderSelf.h"
HelloShaderSelf::HelloShaderSelf() {
}
HelloShaderSelf::~HelloShaderSelf() {
}
void HelloShaderSelf::initializeGL() {
_openGLCore = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
GLfloat ver[] = {
//如果话两个三角形的话,常规画法,定义两个三角形的位置点
//第一个三角形
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
GLfloat verColor[] = {
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
_openGLCore->glGenBuffers(1, &_VAO);
_openGLCore->glGenBuffers(1, &_VBO);
_openGLCore->glGenBuffers(1, &_VBOColor);
_openGLCore->glBindVertexArray(_VAO);
//把定位位置数据写入显卡缓存
_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, _VBO);
_openGLCore->glBufferData(GL_ARRAY_BUFFER, sizeof(ver), ver, GL_STATIC_DRAW);
_openGLCore->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
_openGLCore->glEnableVertexAttribArray(0);
//把顶点颜色数据写入显卡缓存
_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, _VBOColor);
_openGLCore->glBufferData(GL_ARRAY_BUFFER, sizeof(verColor), verColor, GL_STATIC_DRAW);
_openGLCore->glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void*)0);
_openGLCore->glEnableVertexAttribArray(1);
_openGLCore->glBindVertexArray(0);
QOpenGLShader vertexShager(QOpenGLShader::Vertex);//顶点着色器
vertexShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/HelloShaderSelf.vert");
QOpenGLShader fragmentShager(QOpenGLShader::Fragment);//片段着色器
fragmentShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/HelloShaderSelf.frag");
_shaderProgram.addShader(&vertexShager);
_shaderProgram.addShader(&fragmentShager);
_shaderProgram.link();
}
void HelloShaderSelf::resizeGL(int w, int h) {
}
void HelloShaderSelf::paintGL() {
_openGLCore->glClearColor(0.6f, 0.6f, 0.6f, 1.0);
_openGLCore->glClear(GL_COLOR_BUFFER_BIT);
_shaderProgram.bind();
_openGLCore->glBindVertexArray(_VAO);
_openGLCore->glDrawArrays(GL_TRIANGLES, 0, 3);
update();
}
顶点着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec4 aColor;
out vec4 outColor;
void main(){
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
outColor = aColor;
}
片元着色器:
#version 330 core
out vec4 fragColor;
in vec4 outColor;//从顶点着色器中传过来的颜色
void main(){
fragColor = outColor;
}
aaa
边栏推荐
猜你喜欢

After watching the video, AI model learned to play my world: cutting trees, making boxes, making stone picks, everything is good

Numpy np.max和np.maximum实现relu函数

Based on MCU, how to realize OTA differential upgrade with zero code and no development?

DS90UB949

The world's most popular font editor FontCreator tool

C language AES encryption and decryption

Xiaopeng P7 hit the guardrail and the airbag did not pop up. The official responded that the impact strength did not meet the ejection requirements

Mmc5603nj geomagnetic sensor (Compass example)

2022年湖南工学院ACM集训第二次周测题解

Vulnhub geminiinc V2
随机推荐
P3250 [HNOI2016] 网络 + [NECPC2022] F.Tree Path 树剖+线段树维护堆
Momentum of vulnhub
外插散点数据
. \vmware-vdiskmanager. exe -k “c:\\xxxxx.vmdk”
The world's most popular font editor FontCreator tool
Mysql根据时间搜索常用方法整理
Yintai department store ignites the city's "night economy"
Asyncio warning deprecationwarning: there is no current event loop
Mmc5603nj geomagnetic sensor (Compass example)
vulnhub之presidential
Duplicate numbers in the array of sword finger offer 03
phpcms 提示信息页面跳转showmessage
ftp登录时,报错“530 Login incorrect.Login failed”
Cadence background color setting
R language uses grid of gridextra package The array function combines multiple visual images of the lattice package horizontally, and the ncol parameter defines the number of columns of the combined g
Kibana~Kibana的安装和配置
解决msvcp120d.dll和msvcr120d.dll缺失
previous permutation lintcode51
R语言使用aggregate函数计算dataframe数据分组聚合的均值(sum)、不设置na.rm计算的结果、如果分组中包含缺失值NA则计算结果也为NA
836. Merge sets (day 63) and search sets