OpenGL shader使用
2016-06-27 17:03
344 查看
struct Program
{
static GLuint Load( const char* vert, const char* frag )
{
GLuint prog = glCreateProgram();
if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}
private:
static void CheckStatus( GLuint obj )
{
GLint status = GL_FALSE;
if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
if( status == GL_TRUE ) return;
GLchar log[ 1 << 15 ] = { 0 };
if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
std::cerr << log << std::endl;
exit( -1 );
}
static void AttachShader( GLuint program, GLenum type, const char* src )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );
CheckStatus( shader );
glAttachShader( program, shader );
glDeleteShader( shader );
}
};
#define STRINGIFY(A) #A
const char* vert = STRINGIFY(
attribute vec4 a_position;
void main()
{
gl_Position = a_position;
}
);
const char* frag = STRINGIFY(
uniform vec4 color;
void main(void)
{
gl_FragColor = color;
}
);
使用方式:
GLuint prog = Program::Load( vert, frag );
glUseProgram( prog );
使用流程总结为:
1 glCreateShader:创建shader。
2 glShaderSource:指定shader source。
3 glCompileShader:编译shader。
4 glCreateProgram:创建shader program。
5 glAttachShader,glDeleteShader:加载shader到shader program。标记shader为可删除,当不再使用shader的时候就会自动删除。
6 glLinkProgram:连接,生成最终shader程序。
7 glUseProgram:draw之前应用shader。
{
static GLuint Load( const char* vert, const char* frag )
{
GLuint prog = glCreateProgram();
if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}
private:
static void CheckStatus( GLuint obj )
{
GLint status = GL_FALSE;
if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
if( status == GL_TRUE ) return;
GLchar log[ 1 << 15 ] = { 0 };
if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
std::cerr << log << std::endl;
exit( -1 );
}
static void AttachShader( GLuint program, GLenum type, const char* src )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );
CheckStatus( shader );
glAttachShader( program, shader );
glDeleteShader( shader );
}
};
#define STRINGIFY(A) #A
const char* vert = STRINGIFY(
attribute vec4 a_position;
void main()
{
gl_Position = a_position;
}
);
const char* frag = STRINGIFY(
uniform vec4 color;
void main(void)
{
gl_FragColor = color;
}
);
使用方式:
GLuint prog = Program::Load( vert, frag );
glUseProgram( prog );
使用流程总结为:
1 glCreateShader:创建shader。
2 glShaderSource:指定shader source。
3 glCompileShader:编译shader。
4 glCreateProgram:创建shader program。
5 glAttachShader,glDeleteShader:加载shader到shader program。标记shader为可删除,当不再使用shader的时候就会自动删除。
6 glLinkProgram:连接,生成最终shader程序。
7 glUseProgram:draw之前应用shader。
相关文章推荐
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- OpenMP对临界区/变量的保护方法
- Linux内核同步机制--转发自蜗窝科技
- centos ddd 安装,注意版本
- Linux的文件,管理管理指令
- linux 命令pidof - 找出正在运行程序的进程PID
- centos 安装 rabbitmq
- Linux防火墙iptables详解(二)--参数指令
- centos7挂载U盘笔记
- 深入理解SELinux SEAndroid(最后部分)
- Linux防火墙iptables详解(一) --入门要领
- 各种系统架构图及其简介
- 深入理解SELinux SEAndroid之二
- 深入理解SELinux SEAndroid(第一部分)
- Linux进程间通信-匿名管道
- Jmeter中利用BeanShell Sampler与控制台进行交互
- HADOOP+SPARK安装
- getResources().getColor(R.color.color_name) is deprecated和drawableTop
- WIN7系统JavaEE(tomcat7 Eclipse)环境配置教程(二)
- Linux设备模型