OpenGL中shader读取实现
1.需要shader在OpenGL中工作,必须经过如下过程

2.代码实现
/**********
* loadshader.h
**********/
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define WIN32_LEAN_AND_MEAN 1
#define GLFW_NO_GLU 1
#include <Windows.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <cmath>
#include <iostream>
#include <stdio.h>
#include <string.h>
#define GLFW_INCLUDE_GLCOREARB 1
GLuint CreateShaderProgram();
GLuint LoadShader(const char *shader_path, GLenum shader_type);
void LinkShader(GLuint shader_pragram, ...); /// 以0结束
bool compileShader(GLuint &shader_id, const char *path);
static const GLchar *getFileData(const char * path);
static const int MAX_LOG_LEN = 16 * 1024;
static void _log(const char *format, va_list args)
{
char buf[MAX_LOG_LEN];
vsnprintf(buf, MAX_LOG_LEN - 3, format, args);
strcat(buf, "\n");
WCHAR wszBuf[MAX_LOG_LEN] = {0};
MultiByteToWideChar(CP_UTF8, 0, buf, -1, wszBuf, sizeof(wszBuf));
OutputDebugStringW(wszBuf);
WideCharToMultiByte(CP_ACP, 0, wszBuf, -1, buf, sizeof(buf), nullptr, FALSE);
printf("%s", buf);
fflush(stdout);
}
void log(const char *format, ...);
/**********
* loadshader.cpp
**********/
#include "LoadShader.h"
#include <fstream>
#include <vector>
GLuint LoadShader( const char *shader_path, GLenum shader_type )
{
GLuint shader_id = glCreateShader(shader_type);
bool bRet = compileShader(shader_id, shader_path);
if(!bRet)
{
glDeleteShader(shader_id);
return 0;
}
return shader_id;
}
static const GLchar* getFileData( const char * path )
{
FILE* infile;
fopen_s(&infile, path, "rb");
if(!infile)
{
return NULL;
}
fseek(infile, 0, SEEK_END);
int len = ftell(infile);
fseek(infile, 0, SEEK_SET);
GLchar *source = new GLchar[len + 1];
fread(source, 1, len, infile);
fclose(infile);
source[len] = 0;
return const_cast<const GLchar *>(source);
}
bool compileShader( GLuint &shader_id, const char *path )
{
const GLchar *shader_code = getFileData(path);
if(strlen(shader_code) <= 0 )
return 0;
GLint Result = GL_FALSE;
GLint InfoLogLength;
glShaderSource(shader_id, 1, &shader_code, NULL);
glCompileShader(shader_id);
delete []shader_code;
glGetShaderiv(shader_id, GL_COMPILE_STATUS, &Result);
if ( !Result ){
glGetShaderiv(shader_id, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(shader_id, InfoLogLength, NULL, &ShaderErrorMessage[0]);
//printf("%s\n", &ShaderErrorMessage[0]);
log("%s", &ShaderErrorMessage[0]);
return false;
}
return true;
}
void log( const char *format, ... )
{
va_list args;
va_start(args, format);
_log(format, args);
va_end(args);
}
bool LoadTessellationShader( GLuint shader_program, const char *tes_shader_path )
{
GLuint shader = glCreateShader(GL_TESS_CONTROL_SHADER);
bool bRet = compileShader(shader, tes_shader_path);
if(!bRet)
return false;
glAttachShader(shader_program, shader);
glLinkProgram(shader_program);
glDeleteProgram(shader);
return true;
}
void LinkShader( GLuint shader_pragram, ... )
{
va_list args;
va_start(args, shader_pragram);
while (true)
{
GLuint shader_id = va_arg(args, GLuint);
if(shader_id <= 0)
break;
glAttachShader(shader_pragram, shader_id);
glDeleteShader(shader_id);
}
va_end(args);
glLinkProgram(shader_pragram);
}
GLuint CreateShaderProgram()
{
return glCreateProgram();
}
OpenGL中shader读取实现的更多相关文章
- OpenGL中shader使用
学了接近一个月的OpenGL,最终要排上用场了...好吧,就从学到的shader(着色器)开刀吧. 先简单的介绍shader,shader事实上是显卡的功能,就是利用显卡的GPU去做图像处理的工作,而 ...
- OpenGL Compute Shader靠谱例子及读取二进制Shader,SPIR-V
学OpenGL以来一直苦恼没有像DX那样可以读取二进制Shader使用的方法,除去有时不想公开自己写的牛逼Shader的心理(虽然目前还从没写过什么牛逼的Shader), 主要是不用现场编译,加快读取 ...
- GLSL 在OpenGL中向shader传递信息【转】
http://blog.csdn.net/hgl868/article/details/7872219 引言 一个OpenGL程序可以用多种方式和shader通信.注意这种通信是单向的,因为shade ...
- 【GLSL教程】(三)在OpenGL中向shader传递信息 【转】
http://blog.csdn.net/racehorse/article/details/6634830 引言 一个OpenGL程序可以用多种方式和shader通信.注意这种通信是单向的,因为sh ...
- 【OpenGL】Shader实例分析(九)- AngryBots中的主角受伤特效
转发请保持地址:http://blog.csdn.net/stalendp/article/details/40859441 AngryBots是Unity官方的一个非常棒的样例.非常有研究价值. 曾 ...
- OpenGL中的数据——Buffer
OpenGL中主要包括了两种数据——Buffer和Texture. Buffer用于储存线性数无类型据块,可以看成普通的内存块,而Texture则用于储存多维数据,一般储存图像或者其他数据. Buff ...
- OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是 ...
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现
Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/t ...
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2)
Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2) 上一篇里介绍了Color-Coded Picking的思路和最基本的实现.在处理GL_POINTS时已经没有问题,但是处 ...
随机推荐
- 整体认识flume:Flume介绍、分布式安装、常见问题及解决方案
问题导读 1.什么是flume? 2.flume包含哪些组件? 3.Flume在读取utf-8格式的文件时会出现解析不了时间戳,该如何解决? Flume是一个分布式.可靠.和高可用的海量日志采集.聚合 ...
- hdu_5193_Go to movies Ⅱ(带插入删除的逆序对,块状链表)
题目链接:hdu_5193_Go to movies Ⅱ 题意: 有n个人站成一排,每个人的身高为Hi.每次有人加入或者有人离开,就要判断有多少人站反了(i < j&&Hi> ...
- HttpPost与HttpVerbs.Post属性的区别
1. the HttpPost attribute is a short for the HttpVerbs.Post one but since MVC 2.0. 从MVC 2.0之后HttpPos ...
- Django的用户认证
Django中用户登陆的实例: 逻辑流程 1.客户端发起请求,根据url规则会首先转至index函数, 2.在index函数上添加一个装饰器('@login_required',django自带).加 ...
- osg + cuda
#include <osg/Notify> #include <osgViewer/Viewer> #include <osgCompute/Memory> #in ...
- 官方解答:Vultr VPS常见问题
VULTR VPS配置高,价格低廉,是非常优秀的vps品牌.今天我来翻译vultr官方FAQ,相信你能找到具体答案. Q 请介绍VULTR VPS机器硬件配置 Intel CPU 3+ GHz Cor ...
- MathML转换成OfficeML
public XslCompiledTransform XslTransforms; XslTransforms = new XslCompiledTransform(); XslTransforms ...
- solr与tomcat整合
一.准备工作:我使用的是tomcat7.0,solr-4.8.1 solr-4.8.1解压后是这样的. 二.开始配置了 1.首先要创建两个文件夹.home和server.我是创建在与solr-4.8. ...
- 移动端touch事件影响click事件的相关解决方法
preventDefault()的方法,阻止事件的默认行为. 在移动端,手指点击一个元素,会经过:touchstart --> touchmove -> touchend -->cl ...
- STM32F407的串口采用DMA收发数据
源:STM32F407的串口采用DMA收发数据