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时已经没有问题,但是处 ...
随机推荐
- 设置IIS下PHP环境的DOCUMENT_ROOT
这两天把一网站架到了IIS服务器上,却发现在读取 $_SERVER['DOCUMENT_ROOT'] 的时候是空值.翻阅了PHP的文档,发现对该变量的解释为:“当前运行脚本所在的文档根目录.在服务器配 ...
- sql表命名规范
tb_new_Count 新闻内容表:首先表加tb_,如果是视图则加V_存储过程加_p. 下划线后面要大写. 切记.(萌萌的国庆要加油)
- Linux中kettle连接hadoop并传数据(5)
http://wiki.pentaho.com/display/BAD/Loading+Data+into+HDFS 新建job
- 2015 ACM/ICPC Asia Regional Changchun Online
1001 Alisha’s Party 比赛的时候学长stl吃T.手写堆过. 赛后我贴了那两份代码都过.相差.2s. 于是用stl写水果. # include <iostream> # i ...
- Minigui开发之遥控控制逻辑算法
引言 在开发公司的minigui产品时,需要用遥控器来切换显示屏上的图标和控件,这就涉及到一个问题,如何获得下一个选中的图标或控件呢? 解决思路 利用每个控件自身的ID号,建立一张类似矩阵的表,用坐标 ...
- robotframework+seleniumlibrary自动化测试:测试环境搭建
robotframework是由python编写的自动化测试框架,使用robotframework需要安装 python库 python 和 robotframework 的下载地址都可百度到 环境搭 ...
- Chapter 2 Open Book——1
The next day was better… and worse. 明天会更好也会更坏. It was better because it wasn't raining yet, though t ...
- thinkphp整合系列之短信验证码、订单通知
现在这个短信通知泛滥的年代:应用如果没有个短信注册:你都不敢说你是搞开发的: 这个验证码搞起来是不难的:但是如果刚接触也是有点不知从哪下手的迷茫: 先讲下概念: 要想发送验证码:需要至少三项:appi ...
- JS电子文档链接
http://www.oschina.net/translate/learning-javascript-design-patterns 学用 JavaScript 设计模式 http://es6 ...
- 利用JFreeChart绘制股票K线图完整解决方案
http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) ...