用可编程管线绘制一个三角形

1.以上一节window为基准,进行绘制。

2.下载编译glew,并在.pro添加动态链接,并在头文件中引用。

LIBS +=-L/usr/lib64 -lGLEW

可能根据安装路径不同,修改动态链接库的路径,-L是路径的索引 -l是名称索引,去掉lib或so.

3.下载编译安装glm,并在头文件中引用。这个不需要添加动态链接库。

4.按照如下编写代码。

#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;
//上传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, ); 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, , );
glBindBuffer(GL_ARRAY_BUFFER, ); glUseProgram();
/* Swap front and back buffers */
glfwSwapBuffers(window); /* Poll for and process events */
glfwPollEvents();
} glfwTerminate();
return ;
}

最后的效果:

QT_OPENGL-------- 2.shader的更多相关文章

  1. OpenGL shader 中关于顶点坐标值的思考

    今天工作中需要做一个事情: 在shader内部做一些空间距离上的计算,而且需要对所有的点进行计算,符合条件的显示,不符合条件的点不显示. 思路很简单,在vertex shader内知道顶点坐标,进行计 ...

  2. CSharpGL(14)用geometry shader渲染模型的法线(normal)

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(14)用geometry shader渲染模型的法线(normal) +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 ...

  3. 【译】Unity3D Shader 新手教程(6/6) —— 更好的卡通Shader

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你想了解以下几件事,我建议你阅读以下这篇教程: 想知道如何写一个multipass的toon shade ...

  4. 【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想学习片段着色器(Fragment Shader). 你想实现 ...

  5. 【译】Unity3D Shader 新手教程(4/6) —— 卡通shader(入门版)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 暗黑系 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想了解更多有关表面着色器的细节知识. 你想实现一个入门 ...

  6. 【译】Unity3D Shader 新手教程(3/6) —— 更加真实的积雪

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你满足以下条件,我建议你阅读这篇教程: 你想知道如何在表面着色器中进行混色(blend colour) 你想实 ...

  7. 【译】Unity3D Shader 新手教程(2/6) —— 积雪Shader

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你是一个shader编程的新手,并且你想学到下面这些酷炫的技术,我觉得你可以看看这篇教程: 实现一个积雪效果的 ...

  8. 【译】Unity3D Shader 新手教程(1/6)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...

  9. 多材质(Shader)实现

    最近在cocos creator上打算写个U3D中shader功能的插件(能在属性面板调整shader属性). 对其中一个功能有点疑惑,就是U3D中一个渲染物体上可以挂多个材质,后来查询了下,一个物体 ...

  10. unity的固定管线shader

    最近shader学习中,看的视频. 练习的固定管线的shader如下: ps.在unity5中半透明不好用,其他的还好 //不区分大小写 //这是固定管线的Shader Shader "Sh ...

随机推荐

  1. idea2018.1.5永久破解过程

    可以根据官网推荐注册idea:http://idea.lanyus.com/ 步骤如下:1 下载破解(crack) jar 包 链接:https://pan.baidu.com/s/1-COPHVJi ...

  2. MySQL双机热备份配置

    双机热备份,即能够把主数据库中所有的数据同时写到备份的数据库中,从而实现MySQL数据库的热备份. MySQL Replication是MySQL提供的一种主从备份的机制,并且整个复制备份过程是异步进 ...

  3. HDU5412 CRB and Queries 整体二分

    传送门 刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦.. 整体二分模板题,带修改的区间第k小. vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受.. 写得比 ...

  4. MAC中已有的虚拟环境在pycharm 中进行调用

    首先确定虚拟环境的路径: 打开工作环境配置文件,找到工作目录: 在pycharm中解释器中找到工作目录中对应的虚拟环境进行配置就可以了

  5. HDU1709

    /*  * 好奇怪的母函数  */ #include<cstdio> #include<cstring> #include<cmath> #include<a ...

  6. java 7,8 排序异常

    排序报 java.lang.IllegalArgumentException: Comparison method violates its general contract! 要明确返回-1, 0, ...

  7. .net4.6版本前设置window子窗口位置主窗口闪烁

    在安装了.net4.6的版本是不会出现该问题的,但是在4.6以下的版本会出现,当设置之窗体的left和top属性时,会让主窗体闪烁一下. 之前是在load事件下写的: child_window.loa ...

  8. tomcat标准化安装

    操作系统说明: 操作系统 版本 linux red hat release 6.4 关键软件包说明: 软件包 版本 目录 运行用户 jdk-7u79-linux-x64.gz 1.7 /usr/loc ...

  9. CentOS安装fortune+cowsay

    1.先找下看有没 2.安装 yum -y install fortune-mod 3.执行fortune 应该可以输出了,接着去弄中文词库,阮一峰的: git clone git@github.com ...

  10. Javascript-随滚轮匀速滑动的浮动广告窗动画

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...