QT_OPENGL

与上一节内容基本相同,只是用ElementArraryBuffer绘制三角形,也就是VBO与IBO。

1.VBO 一系列点,通过glDrawArrays指定绘制几个点,是连续的,不能跳跃。
2.IBO(ElementArrayBufferObject) 一系列点,通过指定其中的某一些点组成三角形,不需要是连续的。
gldrawElement(绘制什么,绘制数据的个数,类型,绘制的起始位置)

3.其他与上一节相同,代码部分如下:

1#include<GL/glew.h> 2#include <GLFW/glfw3.h> 3#include <stdio.h> 4#include<iostream> 5#include<glm/glm.hpp> 6#include<glm/ext.hpp> 7using namespace std; 8struct Vertex 9{ 10 float pos[3]; 11 float color[4]; 12}; 13 14char *LoadFileContent(const char*path)//加载shader 15{ 16 FILE*pFile = fopen(path, "rb"); 17 if (pFile) 18 { 19 fseek(pFile, 0, SEEK_END); 20 int nLen = ftell(pFile); 21 char*buffer = new char[nLen+1]; 22 rewind(pFile); 23 fread(buffer, nLen , 1, pFile); 24 buffer[nLen]='\0'; 25 fclose(pFile); 26 return buffer; 27 } 28 fclose(pFile); 29 return nullptr; 30} 31 32GLuint CreateGPUProgram(const char*vsShaderPath, const char*fsShaderPath)//编译shader 33{ 34 GLuint vsShader = glCreateShader(GL_VERTEX_SHADER); 35 GLuint fsShader = glCreateShader(GL_FRAGMENT_SHADER); 36 const char* vsCode = LoadFileContent(vsShaderPath); 37 const char* fsCode = LoadFileContent(fsShaderPath); 38 glShaderSource(vsShader, 1, &vsCode, nullptr); 39 glShaderSource(fsShader, 1, &fsCode, nullptr);//ram -> vram 40 glCompileShader(vsShader); 41 glCompileShader(fsShader); 42 GLuint program = glCreateProgram(); 43 glAttachShader(program, vsShader); 44 glAttachShader(program, fsShader); 45 glLinkProgram(program); 46 glDetachShader(program,vsShader); 47 glDetachShader(program, fsShader); 48 glDeleteShader(vsShader); 49 glDeleteShader(fsShader); 50 return program; 51} 52 53int main(void) 54{ 55 GLFWwindow* window; 56 57 /* Initialize the library */ 58 if (!glfwInit()) 59 return -1; 60 61 /* Create a windowed mode window and its OpenGL context */ 62 window = glfwCreateWindow(480, 320, "Hello World", NULL, NULL); 63 if (!window) 64 { 65 glfwTerminate(); 66 return -1; 67 } 68 69 /* Make the window's context current */ 70 glfwMakeContextCurrent(window); 71 72 //shader数据 73 GLenum status = glewInit(); 74 75 if (status != GLEW_OK) 76 { 77 cout<<">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"<<endl; 78 std::cout << "Error::GLEW glew version:" << glewGetString(GLEW_VERSION) 79 << " error string:" << glewGetErrorString(status) << std::endl; 80 glfwTerminate(); 81 std::system("pause"); 82 // return -1; 83 } 84 GLuint program = CreateGPUProgram("/home/jun/Qt_Preject/opengl/shader/materials/sample.vs", "/home/jun/Qt_Preject/opengl/shader/materials/sample.fs"); 85 //取得shader变量的位置 86 GLint posLocation, colorLocation, MLocation, VLocation, PLocation; 87 posLocation = glGetAttribLocation(program, "pos"); 88 colorLocation = glGetAttribLocation(program, "color"); 89 90 MLocation = glGetUniformLocation(program, "M"); 91 VLocation = glGetUniformLocation(program, "V"); 92 PLocation = glGetUniformLocation(program, "P"); 93 94 Vertex vertex[3]; 95 vertex[0].pos[0] = 0; 96 vertex[0].pos[1] = 0; 97 vertex[0].pos[2] = -100.0f; 98 vertex[0].color[0] = 1.0f; 99 vertex[0].color[1] = 1.0f; 100 vertex[0].color[2] = 1.0f; 101 vertex[0].color[3] = 1.0f; 102 103 vertex[1].pos[0] = 10; 104 vertex[1].pos[1] = 0; 105 vertex[1].pos[2] = -100.0f; 106 vertex[1].color[0] = 1.0f; 107 vertex[1].color[1] = 1.0f; 108 vertex[1].color[2] = 1.0f; 109 vertex[1].color[3] = 1.0f; 110 111 vertex[2].pos[0] = 0; 112 vertex[2].pos[1] = 10; 113 vertex[2].pos[2] = -100.0f; 114 vertex[2].color[0] = 1.0f; 115 vertex[2].color[1] = 1.0f; 116 vertex[2].color[2] = 1.0f; 117 vertex[2].color[3] = 1.0f; 118 //vbo上传shader数据到GPU 119 GLuint vbo; 120 glGenBuffers(1, &vbo); 121 glBindBuffer(GL_ARRAY_BUFFER, vbo); 122 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 3, vertex, GL_STATIC_DRAW); 123 glBindBuffer(GL_ARRAY_BUFFER, 0); 124 //ibo上传shader数据到GPU 125 unsigned int indexes[] = {0,1,2}; 126 GLuint ibo; 127 glGenBuffers(1, &ibo); 128 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 129 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 3, indexes, GL_STATIC_DRAW); 130 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 131 132 133 134 float identity[] = { 135 1,0,0,0, 136 0,1,0,0, 137 0,0,1,0, 138 0,0,0,1 139 }; 140 glm::mat4 projection = glm::perspective(45.0f, 800.0f / 600.0f, 0.1f, 1000.0f); 141 142 143 /* Loop until the user closes the window */ 144 while (!glfwWindowShouldClose(window)) 145 { 146 /* Draw a triangle */ 147 glUseProgram(program); 148 glUniformMatrix4fv(MLocation, 1, GL_FALSE, identity); 149 glUniformMatrix4fv(VLocation, 1, GL_FALSE, identity); 150 glUniformMatrix4fv(PLocation, 1, GL_FALSE, glm::value_ptr(projection)); 151 152 glBindBuffer(GL_ARRAY_BUFFER, vbo); 153 glEnableVertexAttribArray(posLocation); 154 glVertexAttribPointer(posLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); 155 glEnableVertexAttribArray(colorLocation); 156 glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float)*3)); 157 158 //glDrawArrays(GL_TRIANGLES, 0, 3); 159 //glBindBuffer(GL_ARRAY_BUFFER, 0); 160 glBindBuffer(GL_ARRAY_BUFFER, 0); 161 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 162 glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0); 163 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 164 165 166 glUseProgram(0); 167 /* Swap front and back buffers */ 168 glfwSwapBuffers(window); 169 170 /* Poll for and process events */ 171 glfwPollEvents(); 172 } 173 174 glfwTerminate(); 175 return 0; 176}

效果和上一节一样。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )