当前位置:网站首页>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
边栏推荐
- Introduction to the implementation principle of rxjs observable filter operator
- STL教程9-容器元素深拷贝和浅拷贝问题
- Solution to the second weekly test of ACM intensive training of Hunan Institute of technology in 2022
- Nestjs configuration service, configuring cookies and sessions
- php 获取文件夹下面的文件列表和文件夹列表
- Sheet1$.输出[Excel 源输出].列[XXX] 出错。返回的列状态是:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”。
- MySQL uses the method of updating linked tables with update
- 并发编程-单例
- OpenGL 索引缓存对象EBO和线宽模式
- Xml的(DTD,xml解析,xml建模)
猜你喜欢
随机推荐
Groovy测试类 和 Junit测试
(database authorization - redis) summary of unauthorized access vulnerabilities in redis
Test classification in openstack
Talk about the state management mechanism in Flink framework
OpenGL 索引缓存对象EBO和线宽模式
Systemverilog-- OOP--对象的拷贝
PHP export word method (one MHT)
同事写了一个责任链模式,bug无数...
Cacti monitors redis implementation process
vulnhub之momentum
XML (DTD, XML parsing, XML modeling)
Simple factory and factory method mode
Hongmeng third training (project training)
php 获取文件夹下面的文件列表和文件夹列表
Kibana - installation and configuration of kibana
Why can't my MySQL container start
STL教程8-map
Solutions to the failure of installing electron
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
Unity3D学习笔记5——创建子Mesh









