从文件读取Vertex Shader 和 Fragment Shader的工具类。

代码如下:

Shader.h

#ifndef Shader_h
#define Shader_h // GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string> class Shader
{
public:
Shader(); Shader(const GLchar* vsPath, const GLchar* fragPath); ~Shader(); public:
void init(const GLchar* vsPath, const GLchar* fragPath); void useProgram(); GLint getUniformLocation(const GLchar* uniformName); private:
//create vertex shader
void createVertexShader(const GLchar* vsPath); //create fragment shader
void createFragmentShader(const GLchar* fragPath); //create shader program
void createShaderProgram(); //load string from file
std::string loadFile(const GLchar* filePath); private:
GLuint _vertexShader;
GLuint _fragmentShader;
GLuint _shaderProgram; }; #endif //Shader_h

Shader.cpp

#include "Shader.h"

Shader::Shader(){
} Shader::Shader(const GLchar* vsPath, const GLchar* fragPath){
init(vsPath, fragPath);
} Shader::~Shader(){
} void Shader::init(const GLchar* vsPath, const GLchar* fragPath){
this->createVertexShader(vsPath);
this->createFragmentShader(fragPath);
this->createShaderProgram();
} void Shader::useProgram(){
glUseProgram(this->_shaderProgram);
} GLint Shader::getUniformLocation(const GLchar* uniformName){
GLint uniLocation = glGetUniformLocation(_shaderProgram, uniformName);
return uniLocation;
} void Shader::createVertexShader(const GLchar* vsPath){
//compile vertex shader source
std::string vertexShaderStr = this->loadFile(vsPath);
const char *vertexShaderSrc = vertexShaderStr.c_str();
std::cout << "vertexShaderSrc:\n" << vertexShaderSrc;
//GLuint vertexShader; // shader object
_vertexShader = glCreateShader(GL_VERTEX_SHADER); // create vertex shader object
glShaderSource(_vertexShader, , &vertexShaderSrc, NULL); // shader source attach to shader object
glCompileShader(_vertexShader); // compile shader
//compile result check
GLint success;
GLchar infoLog[];
glGetShaderiv(_vertexShader, GL_COMPILE_STATUS, &success);
if (!success){
glGetShaderInfoLog(_vertexShader, , NULL, infoLog);
std::cout << "vertex shader source compile failed...\n" << infoLog << std::endl;
std::cout << vertexShaderSrc;
}
} void Shader::createFragmentShader(const GLchar* fragPath){
//compile fragment shader source
std::string fragmentShaderStr = this->loadFile(fragPath);
const char *fragmentShaderSrc = fragmentShaderStr.c_str();
std::cout << "\n\nfragmentShaderSrc:\n" << fragmentShaderSrc;
//GLuint fragmentShader;
_fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(_fragmentShader, , &fragmentShaderSrc, NULL);
glCompileShader(_fragmentShader);
} void Shader::createShaderProgram(){
if (_vertexShader == NULL || _fragmentShader == NULL){
return;
}
//shader program, link vertex shader object and fragment shader object
//GLuint shaderProgram;
_shaderProgram = glCreateProgram(); // create shader program
glAttachShader(_shaderProgram, _vertexShader); // attach vertex shader
glAttachShader(_shaderProgram, _fragmentShader); // attach fragment shader
glLinkProgram(_shaderProgram); // linking
//check link result
GLint success;
GLchar infoLog[];
glGetProgramiv(_shaderProgram, GL_LINK_STATUS, &success);
if (!success){
glGetProgramInfoLog(_shaderProgram, , NULL, infoLog);
std::cout << "shader program linking failed...\n" << infoLog << std::endl;
return;
}
//delete vertex shader object and fragment shader object
glDeleteShader(_vertexShader);
glDeleteShader(_fragmentShader);
} //load string from file
std::string Shader::loadFile(const GLchar* filePath){
std::ifstream fileStream;
fileStream.exceptions(std::ifstream::badbit);
try{
fileStream.open(filePath);
std::stringstream ss;
ss << fileStream.rdbuf();
fileStream.close();
return ss.str();
}
catch (std::ifstream::failure e){
std::cout << "read file failed, filePath = " << filePath <<std::endl;
}
return NULL;
}

使用方法:

const GLchar* vsPath = "D:\\code\\OpenGL\\opengl-learn\\hi-opengl\\003-shader\\triangles.vs";
const GLchar* fragPath = "D:\\code\\OpenGL\\opengl-learn\\hi-opengl\\003-shader\\triangles.frag";
Shader shader(vsPath, fragPath);

while (...)
{
shader.useProgram();
drawSomthing();
}

使用实例:
TrianglesFile.h

#ifndef  TrianglesFile_h
#define TrianglesFile_h #include "Shader.h" class TrianglesFile
{
public:
TrianglesFile(); ~TrianglesFile(); public:
virtual void init(); virtual void draw(); private:
Shader* _shader; }; #endif // TrianglesFile_h

TrianglesFile.cpp

#include "TrianglesFile.h"

TrianglesFile::TrianglesFile(){
} TrianglesFile::~TrianglesFile(){
delete _shader;
} void TrianglesFile::init(){
// x,y,z opengl coordinates, the vertex data, three 3d point in normalized device coordinates
GLfloat vertexs[] = {
-0.6f, 0.9f, 0.0f, 0.0f, 0.0f, 1.0f, // top
-0.3f, 0.2f, 0.0f, 0.0f, 1.0f, 0.0f, // left down
-0.9f, 0.2f, 0.0f, 1.0f, 0.0f, 0.0f, // right down
};
//define VAO, vertex array object
//GLuint VAO;
glGenVertexArrays(, &VAO);
glBindVertexArray(VAO); // bind vertex array object
//define VBO, vertex buffer object
GLuint VBO;
glGenBuffers(, &VBO); // gen buffer object
glBindBuffer(GL_ARRAY_BUFFER, VBO); // bind buffer to the target
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexs), vertexs, GL_STATIC_DRAW); // copy vertex data to VBO
//set vertex attribute point, position
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(GLfloat), (GLvoid*));
glEnableVertexAttribArray();
//set vertex attribute point, color
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat)* ));
glEnableVertexAttribArray();
glBindVertexArray();//unbind vertex array object //create shader program
const GLchar* vsPath = "D:\\code\\OpenGL\\opengl-learn\\hi-opengl\\003-shader\\triangles.vs";
const GLchar* fragPath = "D:\\code\\OpenGL\\opengl-learn\\hi-opengl\\003-shader\\triangles.frag";
this->_shader = new Shader(vsPath, fragPath);
} void TrianglesFile::draw(){
//use shader programs
this->_shader->useProgram(); //set uniform value
GLfloat currentTime = glfwGetTime(); // current time
GLfloat redColor = (sin( * currentTime) + 1.0f) / 2.0f; // sin value, like [0.0f, 1.0f]
GLfloat blueColor = (cos( * currentTime) + 1.0f) / 2.0f;
GLfloat alphaValue = (sin( * currentTime) + 1.0f) / 2.0f;
GLint uniColorLocation = this->_shader->getUniformLocation("uniColor");
glUniform4f(uniColorLocation, redColor, 0.0f, blueColor, 1.0f); // reset uniform color //draw the triangles
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, , );
glBindVertexArray();
}

triangles.vs

#version  core
layout (location = ) in vec3 pos;
layout (location = ) in vec3 color;
out vec4 vertexColor; void main () {
gl_Position = vec4(pos, 1.0);
//vertexColor = vec4(0.99f, 0.5f, 0.2f, 1.0f);
vertexColor = vec4(color, 1.0f);
}

triangles.frag

#version  core
in vec4 vertexColor;
out vec4 color;
uniform vec4 uniColor; // define uniform color void main () {
//color = vertexColor; // set out color as vertex color
//color = uniColor; // set out color as unifrom color
color = vertexColor + uniColor / ;
}

运行结果:

OpenGL学习——自定义Shader工具类的更多相关文章

  1. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  2. Java学习-049-正则工具类

    自去年九月份决定再次入学和职业资格进阶,开始备战二者考试至今,以及当下进行中的职称申请,犹如孤独的狼,不断前行在路上,而今凡凡总总的已历8月... 不感慨了,如下为一园友需要的正则工具类,直接上码: ...

  3. Android 自定义Dialog工具类

    由于项目的需要,系统的弹出框已经不能满足我们的需求,我们需要各式各样的弹出框,这时就需要我们去自定义弹出框了. 新建布局文件 dialog_layout.xml,将下面内容复制进去 <?xml ...

  4. Java的精确整数计算-Bigdecimal学习总结和工具类

    随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...

  5. spring-boot-jpa 自定义查询工具类

    1.pom文件中添加如下配置 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  6. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

  7. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  8. Java学习:数组工具类Arrays

    数组工具类Arrays java.util.Arrays是一个与数组相关的工具类,里面提供了大量的静态方法,用来实现数组常见的操作. public static String toString(数组) ...

  9. Java核心知识点学习----线程同步工具类,CyclicBarrier学习

    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...

随机推荐

  1. 选择恐惧症的福音!教你认清MVC,MVP和MVVM(转:示例挺好,不太赞同画图)

    转自:http://zjutkz.net/2016/04/13/%E9%80%89%E6%8B%A9%E6%81%90%E6%83%A7%E7%97%87%E7%9A%84%E7%A6%8F%E9%9 ...

  2. 力扣——single number 2(只出现一次的数字 2) python实现

    题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...

  3. 关键字group by 、 Having的 用法

    概述 GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类似Excel里面的透视表. GRO ...

  4. beautifhulsoup4的使用

    Beautiful: - 基本使用 from bs4 import BeautifulSoup   - 解析器:       lxml, html.parser​   soup = Beautiful ...

  5. Springboot与jsp使用404错误

    未加依赖包时出现:Did not find handler method for [/WEB-INF/views/login.jsp] 加入下面依赖包: <dependency> < ...

  6. mysql中int的长度与值的问题

    我们在数据库中设置一个int类型,设置好长度,然后会发现并没有受到长度的限制,这是因为,int值的范围和这个长度根本没有关系. int的存储大小是4个字节(B), 计算机存储单位的换算: 1B=8b ...

  7. (转)Spring Boot干货系列:(四)开发Web应用之Thymeleaf篇

    转:http://tengj.top/2017/03/13/springboot4/ 前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Sp ...

  8. windows环境下如何安装memcached教程

    Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached. 工具/原料   memcach ...

  9. 三.通过jenkins对系统的监控(2)

    在这记录下,通过HTTP Request Plugin监控系统的异常.和上一篇原理差不多. 1.首先需要安装HTTP Request Plugin.插件安装好后,在系统设置下面会新增如下配置: 具体有 ...

  10. Java 从入门到进阶之路(十七)

    在之前的文章我们介绍了一下 Java 中类的内部类,本章我们来看一下 Java 中的正则表达式. 在任何一种语言中,都绕不开正则表达式,而且大部分语言的正则表达式都有预定义的字符集,且预定义的字符集也 ...