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

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

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

#include<GL/glew.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
#include<iostream>
#include<glm/glm.hpp>
#include<glm/ext.hpp>
using namespace std;
struct Vertex
{
float pos[];
float color[];
}; char *LoadFileContent(const char*path)//加载shader
{
FILE*pFile = fopen(path, "rb");
if (pFile)
{
fseek(pFile, , SEEK_END);
int nLen = ftell(pFile);
char*buffer = new char[nLen+];
rewind(pFile);
fread(buffer, nLen , , pFile);
buffer[nLen]='\0';
fclose(pFile);
return buffer;
}
fclose(pFile);
return nullptr;
} GLuint CreateGPUProgram(const char*vsShaderPath, const char*fsShaderPath)//编译shader
{
GLuint vsShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fsShader = glCreateShader(GL_FRAGMENT_SHADER);
const char* vsCode = LoadFileContent(vsShaderPath);
const char* fsCode = LoadFileContent(fsShaderPath);
glShaderSource(vsShader, , &vsCode, nullptr);
glShaderSource(fsShader, , &fsCode, nullptr);//ram -> vram
glCompileShader(vsShader);
glCompileShader(fsShader);
GLuint program = glCreateProgram();
glAttachShader(program, vsShader);
glAttachShader(program, fsShader);
glLinkProgram(program);
glDetachShader(program,vsShader);
glDetachShader(program, fsShader);
glDeleteShader(vsShader);
glDeleteShader(fsShader);
return program;
} int main(void)
{
GLFWwindow* window; /* Initialize the library */
if (!glfwInit())
return -; /* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(, , "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -;
} /* Make the window's context current */
glfwMakeContextCurrent(window); //shader数据
GLenum status = glewInit(); if (status != GLEW_OK)
{
cout<<">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"<<endl;
std::cout << "Error::GLEW glew version:" << glewGetString(GLEW_VERSION)
<< " error string:" << glewGetErrorString(status) << std::endl;
glfwTerminate();
std::system("pause");
// return -1;
}
GLuint program = CreateGPUProgram("/home/jun/Qt_Preject/opengl/shader/materials/sample.vs", "/home/jun/Qt_Preject/opengl/shader/materials/sample.fs");
//取得shader变量的位置
GLint posLocation, colorLocation, MLocation, VLocation, PLocation;
posLocation = glGetAttribLocation(program, "pos");
colorLocation = glGetAttribLocation(program, "color"); MLocation = glGetUniformLocation(program, "M");
VLocation = glGetUniformLocation(program, "V");
PLocation = glGetUniformLocation(program, "P"); Vertex vertex[];
vertex[].pos[] = ;
vertex[].pos[] = ;
vertex[].pos[] = -100.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f; vertex[].pos[] = ;
vertex[].pos[] = ;
vertex[].pos[] = -100.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f; vertex[].pos[] = ;
vertex[].pos[] = ;
vertex[].pos[] = -100.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f;
vertex[].color[] = 1.0f;
//vbo上传shader数据到GPU
GLuint vbo;
glGenBuffers(, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * , vertex, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, );
//ibo上传shader数据到GPU
unsigned int indexes[] = {,,};
GLuint ibo;
glGenBuffers(, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * , indexes, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ); float identity[] = {
,,,,
,,,,
,,,,
,,,
};
glm::mat4 projection = glm::perspective(45.0f, 800.0f / 600.0f, 0.1f, 1000.0f); /* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Draw a triangle */
glUseProgram(program);
glUniformMatrix4fv(MLocation, , GL_FALSE, identity);
glUniformMatrix4fv(VLocation, , GL_FALSE, identity);
glUniformMatrix4fv(PLocation, , GL_FALSE, glm::value_ptr(projection)); glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(posLocation);
glVertexAttribPointer(posLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*));
glEnableVertexAttribArray(colorLocation);
glVertexAttribPointer(colorLocation, , GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float)*)); //glDrawArrays(GL_TRIANGLES, 0, 3);
//glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glDrawElements(GL_TRIANGLES, , GL_UNSIGNED_INT, );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ); glUseProgram();
/* Swap front and back buffers */
glfwSwapBuffers(window); /* Poll for and process events */
glfwPollEvents();
} glfwTerminate();
return ;
}

效果和上一节一样。

QT_OPENGL-------- 3.ElementArraryBuffer的更多相关文章

  1. Deep Learning(深度学习)相关网站

    Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...

  2. Deep Learning(深度学习)网络资源

    Deep Learning(深度学习) ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习): ...

  3. 【转】本人常用资源整理(ing...)

    Deep Learning(深度学习): ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习) ...

  4. Android 仿真器 无法启动排查

    从命令行启动仿真器,可以查看其输出. Microsoft Windows [版本 10.0.18362.145] (c) 2019 Microsoft Corporation.保留所有权利. C:\U ...

  5. DIP常用资源整理

    Deep Learning(深度学习): ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习) ...

  6. QT bug ig9icd64.dll

    QT bug ig9icd64.dll bugintel ig9icd64.dll 处有未经处理的异常 遇到了一个 奇奇怪怪的bug, 一般的QT程序中 在main.cpp 中初始化一个窗口进行显示后 ...

随机推荐

  1. HDU3374 字符串最大最小表示法模板

    一开始没太看懂什么意思,拿笔反复推了一遍才大概知道最大最小表示法是怎么求的,感觉太神奇了... #include <iostream> #include <cstdio> #i ...

  2. Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...

  3. Gym - 102082G

    Gym - 102082Ghttps://vjudge.net/problem/2198225/origin对于数列中任意一个数,要么从最左边到它不递减,要么从最右边到到它不递减,为了满足这个条件,就 ...

  4. PHP--http_build_query--把数组化成&key=value方式

  5. Spring MVC 搭建web项目示例

    环境为Eclipse 1:新建Dynamic web project  : springMvcDemo 2:下载spring的jar包,把jar包复制到WEB-INF/lib目录下 3.添加配置文件w ...

  6. 开户项目的sql查询语句备查

    查询全国所有的券商名录 SELECT id,security,province,city,borough FROM t_security GROUP BY security ; 查询某个省份的所有券商 ...

  7. python无法启动火狐浏览器且报错“selenium.common.exceptions.WebDriverException: Message: Unable to find a matching set of capabilities”

    安装了python2,使用pip安装了selenium,但是在使用时,报了“selenium.common.exceptions.WebDriverException: Message: 'gecko ...

  8. MyBatis中动态加载where条件

    1.trim 2.where 1 = 1 where 1=1 <if test="beginDate !=null and beginDate !='' "> and ...

  9. day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    一级缓存的更新会自动同步到二级缓存. @SuppressWarnings("all") @Test // 将内存中的数据写到硬盘 public void demo7(){ Sess ...

  10. 【CS Round #44 (Div. 2 only) B】Square Cover

    [链接]点击打开链接 [题意] 给你一个n*m的矩形,让你在其中圈出若干个子正方形,使得这些子正方形里面的所有数字都是一样的. 且一样的数字,都是在同一个正方形里面.问你有没有方案. [题解] 相同的 ...