一、环境:qt下qmake编译
首先在qt .pro文件中添加glew和glfw的链接
LIBS+= -L/usr/lib64 -lGLEW
LIBS +=-L/usr/local/lib -lglfw3 -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lGL -lpthread -ldl
二、用可编程管线实现画三角形分为三步
1.创建vertexshader和fragramshader作为gpu program,
2.创建vertexdata上传数据到gpu
3.调用显卡程序渲染vertexdata,也就是画三角形
三、具体实现
main.cpp
#include<GL/glew.h>
#include <GLFW/glfw3.h>
#include<stdio.h>
#include<glm/glm.hpp>
#include<glm/ext.hpp> GLfloat deltaTime = 0.0f;
GLfloat lastFrame = 0.0f;
struct Vertex
{
float pos[];
float color[]; }; char *LoadFileContent(const char*path)
{
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;
}
GLint CreateGPUProgram(const char*vsShaderPath,const char*fsShaderPath)
{
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);
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;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(, , width, height);
}
int main(void)
{
GLFWwindow* window; if (!glfwInit())
return -; window = glfwCreateWindow(, , "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
// 还需要注册这个函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数。
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glewInit();//初始化glew可以使用高级opengl接口函数
GLuint program=CreateGPUProgram("/home/jun/OpenGL/FirstTriangle/sample.vs","/home/jun/OpenGL/FirstTriangle/sample.fs");
//在创建程序之后取得每一个变量的位置
GLint posLocation,colorLocation,MLocation,PLocation,VLocation;//分别代表sample.vs文件中pos,color,M,P,V的位置
//获取变量的值
posLocation=glGetAttribLocation(program,"pos");//第一个参数是你的程序是什么,第二个参数是要获取的sample.vs变量名
colorLocation=glGetAttribLocation(program,"color");
MLocation=glGetUniformLocation(program,"M");
PLocation=glGetUniformLocation(program,"P");
VLocation=glGetUniformLocation(program,"V");
//创建vertex data (顶点数据)
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; GLuint vbo;//vertex buffer
//object创建并绑定VBO对象
glGenBuffers(,&vbo);//需要声明一个vbo对象
glBindBuffer(GL_ARRAY_BUFFER,vbo);//设置为当前操作的对象
// 分配空间 传送数据
glBufferData(GL_ARRAY_BUFFER,sizeof(vertex)*,vertex,GL_STATIC_DRAW);//将内存中的数据传入显卡buffer数据包含三个顶点和4个color
// 解除绑定
glBindBuffer(GL_ARRAY_BUFFER,);
//创建一个单位矩阵
float identity[]=
{
,,,,
,,,,
,,,,
,,, };
//创建一个投影矩阵
glm::mat4 projection=glm::perspective(45.0f,800.0f/600.0f,0.1f,1000.0f); glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE); while (!glfwWindowShouldClose(window))
{
GLfloat currentFrame = (GLfloat)glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
glfwPollEvents(); glClearColor(1.0f, 0.04f, 0.14f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//调用显卡程序渲染数据
glUseProgram(program);//创建一个程序,调用渲染程序
// 在上面已经获取到了posLocation,colorLocation,MLocation,PLocation,VLocation在gpu中地址的值,这里就可以把定义的三角形的顶点的值付给地址了
glUniformMatrix4fv(MLocation,,GL_FALSE,identity);//第一个参数传地址,第二份是size,第三个是否转置,第四个参数是要传的数据,这里传单位矩阵
glUniformMatrix4fv(VLocation,,GL_FALSE,identity);//视图矩阵
glUniformMatrix4fv(PLocation,,GL_FALSE,glm::value_ptr(projection));//投影矩阵 //给pos 和color传值
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glEnableVertexAttribArray(posLocation);
//指定显卡中vbo数据分别对应的是sample中的pos和color
glVertexAttribPointer(posLocation,,GL_FLOAT,GL_FALSE,sizeof(Vertex),nullptr);//第一个参数传位置,第二个数量,第三变量类型,第四个是否归一化,第五个间隔多少,第六感是数据开始的地方
//color
glEnableVertexAttribArray(colorLocation);
glVertexAttribPointer(colorLocation,,GL_FLOAT,GL_FALSE,sizeof(Vertex),(const GLvoid*)(*sizeof(float)));
//画图
glDrawArrays(GL_TRIANGLES,,);//起始位置是0,画3个点
glBindBuffer(GL_ARRAY_BUFFER,); glUseProgram();//结束时重置
glfwSwapBuffers(window); } glfwTerminate();
return ;
}

sample.vs

attribute vec3 pos;
attribute vec4 color; uniform mat4 M;
uniform mat4 V;
uniform mat4 P; varying vec4 V_Color; void main()
{
V_Color=color;
gl_Position=P*V*M*vec4(pos,1.0);
}

sample.fs

varying vec4 V_Color;

void main()
{
gl_FragColor=V_Color;
}

四、结果展示

QT_OPENGL-------- 4.可编程管线绘制三角形的更多相关文章

  1. WebGL编程指南案例解析之绘制三角形

    //案例3.绘制三角形,将顶点数据存到缓冲区对象(gl.ARRAY_BUFFER)中,然后顶点着色器从里面读数据(3个顶点) //顶点着色器中去掉gl_PointSize = 10.0,绘制三角不能设 ...

  2. Linux OpenGL 实践篇-3 绘制三角形

    本次实践是绘制两个三角形,重点理解顶点数组对象和OpenGL缓存的使用. 顶点数组对象 顶点数组对象负责管理一组顶点属性,顶点属性包括位置.法线.纹理坐标等. OpenGL缓存 OpenGL缓存实质上 ...

  3. opengl绘制三角形

    顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 索引缓冲对象:Element Buffer Object,EBO或Inde ...

  4. GPU的历史:从固定管线到可编程管线再到通用计算平台

    开始的时候GPU不能编程,也叫固定管线的,就是把数据按照固定的通路走完. 和CPU同样作为计算处理器,顺理成章就出来了可编程的GPU,但是那时候想在GPU上编程可不是容易的事,你只能使用GPU汇编来写 ...

  5. iOS OpenGL ES简单绘制三角形

    OpenGL 是用于2D/3D图形编程的一套基于C语言的统一接口. windows,Linux,Unix上均可兼容. OpenGL ES 是在OpenGL嵌入式设备上的版本, android/iOS ...

  6. SharpDX初学者教程第4部分:绘制三角形

    原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-4-drawing-a-triangle 现在我们有了一个Direct3 ...

  7. 从0开发3D引擎(九):实现最小的3D程序-“绘制三角形”

    目录 上一篇博文 运行测试截图 需求分析 目标 特性 头脑风暴 确定需求 总体设计 具体实现 新建Engine3D项目 实现上下文 实现_init 实现"获得WebGL上下文" 实 ...

  8. 1.opengl绘制三角形

    顶点数组对象:Vertex Array Object,VAO,用于存储顶点状态配置信息,每当界面刷新时,则通过VAO进行绘制. 顶点缓冲对象:Vertex Buffer Object,VBO,通过VB ...

  9. 纯CCS绘制三角形箭头图案

    用CSS绘制三角形箭头.使用纯CSS,你只需要很少的代码就可以创作出各种浏览器都兼容的三角形箭头! CSS代码: /* create an arrow that points up */ div.ar ...

随机推荐

  1. struts2-result-servletAPI-获得参数-参数封装

    1 结果跳转方式  转发 重定向 转发到Action 重定向到Action 2 访问servletAPI方式 2.1 原理 2.2 获得API 通过ActionContext ★★★★ 通过Servl ...

  2. HDFS 数据节点(DataNode)

  3. LINUX使用 su 命令临时切换用户身份

    1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限恰恰由root ...

  4. ubuntu 环境下向GitHub上传(push)每次都需要用户名密码问题

    这里使用的系统环境是ubuntu16.04,通过Git向GitHub仓库pull/push,使用https方式每次都需要输入用户名和密码,是解决此问题的方法. 一.应该确保你的系统上已经安装了Git ...

  5. Codeforces 220B

    B. Little Elephant and Array time limit per test 4 seconds memory limit per test 256 megabytes input ...

  6. 2019.9.29 csp-s模拟测试55 反思总结

    不咕咕咕是一种美德[大雾] 头一次体会到爆肝写题解??? 这次考试我们没赶上,是后来掐着时间每个人自己考的.我最后的分数能拿到152…熟悉的一题AC两题爆炸. 强烈吐槽出题人起名走心 T1联: 发现每 ...

  7. java-日期类

    一 显示系统时间 package cn.itcast.api.a.date; import java.text.DateFormat; import java.util.Date; public cl ...

  8. iTerm2+oh-my-zsh配色

      效果图,很帅气有木有 一.首先安装iTem2 安装好后的截图如下:   安装好后的截图 二.安装oh-my-zsh. sh -c "$(curl -fsSL https://raw.gi ...

  9. php pdo操作数据库的方法

    PDO 安装 你可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展. 1.在 Unix /linux系统上安装 PDO 在Unix上或Linux上你需要添加以下扩展: exten ...

  10. FPGA按键功能

    1.如何判断按键成功按下? 2.在什么时候采集数据? 按键在按下的过程中会产生大约2ms-3ms抖动,如果此时此刻采集数据来判断按键是不准确的,那么为了采集到准确的数据需要设置一个大约10ms左右的计 ...