代码实现了一个简单的三角形,并且使用着色器给三角形着色,参考这篇教程书写的点击打开链接   这个教程中的源代码链接不好的话到它的英文版找源码连接

shader.h代码

#ifndef SHADER_H
#define SHADER_H
#include<string>
#include<fstream>
#include<sstream>
#include<iostream>
#include<GL/glew.h>
using namespace std;
class Shader
{
public://程序的IDGLuint Program;//读取渲染程序并创建ShaderShader(const GLchar * vertexSourcePath,const GLchar *fragmentSource);{//1.从文件路径获得vertex/fragment源码string vertexCode;string fragmentCode;try{//打开文件Open filesifstream vShaderFile(vertexPath);ifstream fShaderFile(fragmentPath);stringstream vShaderStream,fShaderStream;//读取文件缓冲到流、vShaderStream<<vShaderFile.rdbuf();fShaderStream<<fShaderFile.rdbuf();//关闭文件句柄vShaderFile.close();fShaderFile.close();//将流转为GLchar数组vertexCode = vShaderStream.str(); fragmentCode = fShaderStream.str(); }catch(std::exception e) { std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;  }const GLchar* vShaderCode = vertexCode.c_str();const GLchar * fShaderCode = fragmentCode.c_str();// 2.编译着色器GLuint vertex, fragment;GLint success;GLchar infoLog[512];// 顶点着色器vertex = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertex, 1, &vShaderCode, NULL);glCompileShader(vertex);// 打印着色器是否错误glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertex, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// 片段着色器fragment = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragment, 1, &fShaderCode, NULL);glCompileShader(fragment);// 打印是否有任何错误glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragment, 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}// 着色器程序this->Program = glCreateProgram();glAttachShader(this->Program, vertex);glAttachShader(this->Program, fragment);glLinkProgram(this->Program);// 打印是否有错误glGetProgramiv(this->Program, GL_LINK_STATUS, &success);if (!success){glGetProgramInfoLog(this->Program, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}// 删除着色器程序glDeleteShader(vertex);glDeleteShader(fragment);}//使用Programvoid Use();{
glUseProgram(this->Program);}
}
#endif

shader.cpp代码

#include<iostream>
//GLew
#define GLEW_STATIC
#include<GL/glew.h>
#include<FreeImage.h>
//GLFW
#include<GLFW/glfw3.h>
//着色器头文件
#include<shader.h>
using namespace std;
//函数原型
void key_callback(GLFWwindow* window,int key,int scancode,int action,int mode);
//窗口尺寸
const GLuint WIDTH=800,HEIGHT=600;
//主函数
int main()
{//I初始化GLFWglfwInit();//设置全部GLFW要求的设置glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//创造一个GLFWwindow 项目 我们可以使用GLFW的功能GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);glfwMakeContextCurrent(window);//设置回调函数的注册glfwSetKeyCallback(window, key_callback);//glew设置为true  让glew知道使用现在的方法去恢复指针和扩展glewExperimental = GL_TRUE;//初始化glew 去设置opengl功能指针glewInit();//定义和编译我们的着色器程序Shader ourShader("D:/C语言/openglflew/shader/shader.vs", "D:/C语言/openglflew/shader/shader.frag");//设置顶点数据(和缓冲)和属性指针GLfloat vertices[] = {// 顶点颜色        // 颜色0.5f, -0.5f, 0.0f,   1.0f, 0.0f, 0.0f,  // 右下方-0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,  // 左下方0.0f,  0.5f, 0.0f,   0.0f, 0.0f, 1.0f   // 上面顶点};//获取IDGLuint VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);//首先绑定顶点数组对象,然后绑定和设置顶点缓存和属性指针glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//位置属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);//启动//颜色属性glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);glBindVertexArray(0);//解绑VAo//循环while (!glfwWindowShouldClose(window)){//检查任何事件 有活动(按键和移动鼠标等等)并且调用当前响应的功能glfwPollEvents();// 渲染// 清楚颜色缓存glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 画三角形ourShader.Use();glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);glBindVertexArray(0);// 释放屏幕的缓存glfwSwapBuffers(window);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);// Terminate GLFW, clearing any resources allocated by GLFW.glfwTerminate();return 0;
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)glfwSetWindowShouldClose(window, GL_TRUE);
}

像素着色器shader.frag代码(后缀frag可以随便通常是frag,在记事本中直接把代码书写完后更改文件后缀就可以)

#version 330 core
in vec3 ourColor;
out vec4 color;
void main()
{ color = vec4(ourColor, 1.0f);
}

顶点着色器shader.vs代码

#version 330 core
layout (location = 0) in vec3 position; // 位置变量的属性position为 0
layout (location = 1) in vec3 color; // 颜色变量的属性position为 1 out vec3 ourColor; // 向fragment shader输出一个颜色 void main()
{ gl_Position = vec4(position, 1.0); ourColor = color; // 把ourColor设置为我们从顶点数据那里得到的输入颜色
}

运行的效果图

用glew,glfw实现opengl-学习笔记3着色器相关推荐

  1. OpenGL超级宝典学习笔记:着色器存储区块、原子内存操作、内存屏障

    前言 本篇在讲什么 本篇为蓝宝书学习笔记 着色器存储区块 原子内存操作 内存屏障 本篇适合什么 适合初学Open的小白 本篇需要什么 对 C++语法有简单认知 对 OpenGL有简单认知 最好是有 O ...

  2. LearnOpenGL学习笔记——几何着色器

    几何着色器 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点.几何着色器可以在顶点发送到下一着色器阶段之前对它们随意 ...

  3. dx12 龙书第十二章学习笔记 -- 几何着色器

    如果不启用曲面细分(tessellation)这一环节,那么几何着色器(geometry shader)这个可选阶段便会位于顶点着色器与像素着色器之间.顶点着色器以顶点作为输入数据,而几何着色器的输入 ...

  4. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  5. OpenGL 学习笔记 II:初始化 API,第一个黑窗,游戏循环和帧率,OpenGL 默认垂直同步,glfw 帧率

    前情提要: 上一篇: OpenGL 学习笔记 I:OpenGL glew glad glfw glut 的关系,OpenGL 状态机,现代操作系统的窗口管理器,OpenGL 窗口和上下文 OpenGL ...

  6. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  7. 【OpenGL学习笔记】地月系

    OpenGL学习笔记2-地月系 文章目录 OpenGL学习笔记2-地月系 前言 运行结果 纹理图片 一.TexturePool 1.**TexturePool.h** 2.**TexturePool. ...

  8. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  9. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

  10. OpenGL学习笔记(一)绘制点线面及多面体

    OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...

最新文章

  1. SAP MM PR单据中采购组为空带来的问题
  2. 在Mac OS X macOS Sierra上进行VirtualBox和GNS3链接
  3. oracle按照时间过滤
  4. 智能集群理论优化控制_探索群体智能的奥妙——ROB-MAS多智能体协作
  5. project进行it项目管理案例_全景项目案例集第18期:给团队打鸡血的最好方式
  6. 【转载】Weka入门教程
  7. SpringMVC @ResponseBody 406
  8. Q109:用PBRT渲染Blender导出的模型
  9. python怎样装pandas_小白学python:坑一:如何安装pandas和numpy
  10. JavaScript如何实现汉字按拼音首字母分组拼序
  11. xml文件中SQL语句的大于号、小于号、等于号的转义问题
  12. 华师大 OJ 3036
  13. 笔记本 WIFI 热点批处理文件
  14. 牛客网-《刷C语言百题》第三期
  15. Java实现项目电影购票系统(swing界面)
  16. 万网虚拟主机开启short_open_tag短标签支持
  17. 平安金融卫士 互联网理财“安全第一”
  18. 关于app2sd、a2sd、data2sd、a2sd+的区别的解释
  19. git merge的三种操作merge, squash merge, 和rebase merge
  20. RSD的面向对象分类设计

热门文章

  1. 网站如何经过身份验证_如何配置TLS?
  2. HDFS如何检测并删除多余副本块
  3. 【快学springboot】2.Restful简介,SpringBoot构建Restful接口
  4. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
  5. Redis学习笔记~关于空间换时间的查询案例
  6. SQLite 3.7.13的加密解密(三)—— 创建加密解密函数
  7. 邬建国教授受聘为浙江大学光彪教授
  8. Python 爬取 猫眼 top100 电影例子
  9. leetcode56. Merge Intervals
  10. Provisioning Services 7.8 入门系列教程之四 目标设备安装