当前位置:网站首页>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
边栏推荐
- Symlink(): solution to protocol error in PHP artisan storage:link on win10
- The tutor put forward 20 pieces of advice to help graduate students successfully complete their studies: first, don't plan to take a vacation
- Groovy测试类 和 Junit测试
- Colleagues wrote a responsibility chain model, with countless bugs
- Socket TCP for network communication (I)
- The uniapp scroll view solves the problems of high adaptability and bullet frame rolling penetration.
- 剑指offer专项32-96题做题笔记
- 安裝electron失敗的解决辦法
- (database authorization - redis) summary of unauthorized access vulnerabilities in redis
- XML (DTD, XML parsing, XML modeling)
猜你喜欢
随机推荐
Experience container in libvirt
Introduction to the implementation principle of rxjs observable filter operator
PHP導出word方法(一mht)
"Jianzhi offer 04" two-dimensional array search
laravel 时区问题timezone
vulnhub之GeminiInc
Why can't my MySQL container start
2022年湖南工学院ACM集训第二次周测题解
Laravel time zone timezone
Solutions to the failure of installing electron
Wrong arrangement (lottery, email)
AOSP ~ NTP (Network Time Protocol)
Vulnhub geminiinc
STL教程10-容器共性和使用场景
Concurrent programming - singleton
R language uses the aggregate function to calculate the mean value (sum) of dataframe data grouping aggregation without setting na The result of RM calculation. If the group contains the missing value
并发编程-单例
Oracle advanced (I) realize DMP by expdp impdp command
(database authorization - redis) summary of unauthorized access vulnerabilities in redis
Groovy test class and JUnit test








