1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| // string to char*
const char *LDEstc( string st )
{
const char *ch = st.c_str();
return ch;
}
//
struct LDEshader
{
GLuint fragment_shader,
vertex_shader,
program;
GLint compiled,
linked;
string line,
page;
istringstream iss;
char shader_link_error[4096];
void init()
{
program = glCreateProgram();
}
void fragment(string name)
{
// read file
ifstream file( LDEstc(name) );
if ( file.is_open() )
{
while ( getline(file,line) ) page += line;
file.close();
line.erase();
// create stuff
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar *page_char = LDEstc(page); page.erase();
glShaderSource( fragment_shader,1,&page_char,NULL );
glCompileShader(fragment_shader);
glGetShaderiv(fragment_shader,GL_COMPILE_STATUS,&compiled);
if( !compiled )
{
cout<<"Couldn't compile "<<name<<"\n{\n";
glGetInfoLogARB( fragment_shader, sizeof(shader_link_error), NULL, shader_link_error );
cout<<shader_link_error<<"}\n";
}
glAttachShader(program,fragment_shader);
}
}
void vertex(string name)
{
// read file
ifstream file( LDEstc(name) );
if ( file.is_open() )
{
while ( getline(file,line) ) page += line;
file.close();
line.erase();
// create stuff
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
const GLchar *page_char = LDEstc(page); page.erase();
glShaderSource( vertex_shader,1,&page_char,NULL );
glCompileShader(vertex_shader);
glGetShaderiv(vertex_shader,GL_COMPILE_STATUS,&compiled);
if ( !compiled )
{
cout<<"Couldn't compile "<<name<<"\n{\n";
glGetInfoLogARB( vertex_shader, sizeof(shader_link_error), NULL, shader_link_error );
cout<<shader_link_error<<"}\n";
}
glAttachShader(program,vertex_shader);
}
}
void link()
{
glLinkProgram(program);
glGetObjectParameterivARB( program, GL_OBJECT_LINK_STATUS_ARB, &linked );
}
void use()
{
glUseProgram(program);
}
}; |
Partager