当前位置:网站首页>OpenGL index cache object EBO and lineweight mode
OpenGL index cache object EBO and lineweight mode
2022-07-03 12:00:00 【wb175208】
index registers
When drawing some graphs of connection , Usually some points are continuous , Points that can be reused . For example, coincident points , I only need to define it in memory once , Then in the graphics card cache can be reused , Just tell the location of the data . The index buffer is used here (EBO).
Two points need to be noted here : First of all, you need to configure VBO, And then you can use it EBO
The code is as follows :
#pragma once
#include <QOpenGLWindow>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
class QOpenGLFunctions_3_3_Core;
// Use of index cache objects
class EBOWnd : public QOpenGLWindow{
Q_OBJECT
public:
EBOWnd();
~EBOWnd();
void initializeGL()override;
void resizeGL(int w, int h)override;
void paintGL()override;
private:
QOpenGLFunctions_3_3_Core* _openGLCore;
GLuint _EBO;
GLuint _VBO;
GLuint _VAO;
QOpenGLShaderProgram _shaderProgram;// Shader program , All shaders in the system
};
#include "EBOWnd.h"
#include <QOpenGLFunctions_3_3_Core>
EBOWnd::EBOWnd(){
}
EBOWnd::~EBOWnd(){
}
void EBOWnd::initializeGL() {
_openGLCore = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
/* ** First, list the points of all figures in a certain order , Then list an index table , Indicate which data is a group */
GLfloat ver[] = {
0.5f, 0.5f, 0.0f, // First quadrant
0.5f, -0.5f, 0.0f, // Quadrant four
-0.5f, -0.5f, 0.0f, // The third quadrant
-0.5f, 0.5f, 0.0f, // Beta Quadrant
};
GLuint idexVer[] = {
0, 1, 2, // The... In the array 0/1/2 Three points form the first triangle
1, 2, 3 // The first 1/2/3 Form the second triangle
};
// establish VAO, Used to record various data attributes
_openGLCore->glGenVertexArrays(1, &_VAO);
// binding VAO
_openGLCore->glBindVertexArray(_VAO);
// establish EBO VBO
_openGLCore->glGenBuffers(1, &_EBO);
_openGLCore->glGenBuffers(1, &_VBO);
// binding EBO VBO
_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, _VBO);
_openGLCore->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _EBO);
// Transmit data
_openGLCore->glBufferData(GL_ARRAY_BUFFER, sizeof(ver), ver, GL_STATIC_DRAW);
_openGLCore->glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(idexVer), idexVer, GL_STATIC_DRAW);
/* ** Yes VBO Configure properties */
_openGLCore->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
// Enable shader
_openGLCore->glEnableVertexAttribArray(0);
// Unbundling VAO
_openGLCore->glBindVertexArray(0);
// Unbundling VBO
_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, 0);
// Unbundling EBO
_openGLCore->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
/* ** Shaders ** Shaders belong to dynamic compilation */
QOpenGLShader vertexShager(QOpenGLShader::Vertex);// Vertex shader
vertexShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/triangle.vert");
QOpenGLShader fragmentShager(QOpenGLShader::Fragment);// Fragment Shader
fragmentShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/triangle.frag");
_shaderProgram.addShader(&vertexShager);
_shaderProgram.addShader(&fragmentShager);
_shaderProgram.link();
}
void EBOWnd::resizeGL(int w, int h) {
}
void EBOWnd::paintGL() {
// Set clear color , Use the current color , Clear the background
_openGLCore->glClearColor(0.6f, 0.6f, 0.6f, 1.0f);
_openGLCore->glClear(GL_COLOR_BUFFER_BIT);
// Put the shader into the graphics card cache
_shaderProgram.bind();
_openGLCore->glBindVertexArray(_VAO);// Those states that will be remembered , It is equivalent to executing those functions once
/* ** The first parameter : Type of painting triangle ** The second parameter : Draw points , Two triangles are 6 A little bit ** The third parameter : data type , Type of index value idexVer Shaping for unsigned ** Fourth parameter : Set to 0 */
_openGLCore->glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
update();
}
Running results :
Wireframe mode
Let's reorder the dot index array
GLuint idexVer[] = {
0, 1, 2, // The... In the array 0/1/2 Three points form the first triangle , Clockwise
2, 0, 3 // The first 1/2/3 Form the second triangle , Anti-clockwise
};
Unbundling VAO This function is called before , You can see
The first parameter has multiple options :
#define GL_FRONT 0x0404
#define GL_BACK 0x0405
#define GL_FRONT_AND_BACK 0x0408
Respectively, before 、 after 、 Before and after .
Then what is the front and back of a polygon ?
stay OpenGL The normal vector of a face in , It is related to the order of points when drawing this face ;
Take the screen for example , If the point of a polygon is drawn clockwise , Then the normal vector goes inward from the screen , If it is counterclockwise, the direction of the normal vector is outward .
In accordance with the right-hand rule .
The outward direction of the normal vector is called the front , The inward direction of the normal vector is called the back
_openGLCore->glPolygonMode(GL_BACK, GL_LINE);
You can see the effect :
aaa
边栏推荐
猜你喜欢

PHP Basics

ArcGIS应用(二十一)Arcmap删除图层指定要素的方法

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

CGroup introduction

网络通讯之Socket-Tcp(一)

Vulnhub's Tomato (tomato)

ArcGIS application (XXI) ArcMap method of deleting layer specified features

Vulnhub pyexp

同事写了一个责任链模式,bug无数...

vulnhub之Nagini
随机推荐
Qt+vtk+occt reading iges/step model
MCDF实验1
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
在CoreOS下部署WordPress实例教程
vulnhub之GeminiInc v2
安裝electron失敗的解决辦法
OpenGL 绘制彩色的三角形
Kubernetes 三打探针及探针方式
Hongmeng third training (project training)
Test classification in openstack
Groovy test class and JUnit test
网络通讯之Socket-Tcp(一)
(数据库提权——Redis)Redis未授权访问漏洞总结
优化接口性能
Solve msvcp120d DLL and msvcr120d DLL missing
typeScript
Capturing and sorting out external Fiddler -- Conversation bar and filter [2]
【学习笔记】dp 状态与转移
rxjs Observable filter Operator 的实现原理介绍
OpenGL 着色器使用