当前位置:网站首页>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
边栏推荐
- Concurrent programming - singleton
- 2022 northeast four provinces match VP record / supplementary questions
- 《剑指offer 03》数组中重复的数字
- vulnhub之GeminiInc v2
- 2022年中南大学夏令营面试经验
- vulnhub之tomato(西红柿)
- Software testing weekly (issue 78): the more confident you are about the future, the more patient you are about the present.
- Based on MCU, how to realize OTA differential upgrade with zero code and no development?
- Vulnhub's cereal
- The uniapp scroll view solves the problems of high adaptability and bullet frame rolling penetration.
猜你喜欢
Slam mapping and autonomous navigation simulation based on turnlebot3
MCDF实验1
How should intermediate software designers prepare for the soft test
Kibana~Kibana的安装和配置
Hongmeng fourth training
Vulnhub geminiinc
金额计算用 BigDecimal 就万无一失了?看看这五个坑吧~~
聊聊Flink框架中的状态管理机制
Numpy np.max和np.maximum实现relu函数
The world's most popular font editor FontCreator tool
随机推荐
uniapp scroll view 解决高度自适应、弹框滚动穿透等问题。
vulnhub之Ripper
Viewing binary bin files with notepad++ editor
剑指offer专项32-96题做题笔记
Capturing and sorting out external Fiddler -- Conversation bar and filter [2]
Kibana~Kibana的安装和配置
Vulnhub's cereal
MySQL searches and sorts out common methods according to time
ORACLE进阶(一) 通过EXPDP IMPDP命令实现导dmp
GCC compilation process and dynamic link library and static link library
2022年中南大学夏令营面试经验
简单工厂和工厂方法模式
Excel表格转到Word中,表格不超边缘纸张范围
Vulnhub's presidential
Concurrent programming - singleton
PHP Basics
鸿蒙第三次培训(项目实训)
Repo ~ common commands
How should intermediate software designers prepare for the soft test
rxjs Observable filter Operator 的实现原理介绍