bool Res::Init() { Shader* shader = nullptr; Texture* texture = nullptr; // block shader shader = new Shader(); if (!shader->Init("res/block.vert", "res/block.frag")) return false; AddShader("block", shader); // simpler color shader shader = new Shader(); if (!shader->Init("res/color.vert", "res/color.frag")) return false; AddShader("color", shader); std::vector<byte> buffer, image; LodePNG::loadFile(buffer, "res/blocks.png"); LodePNG::Decoder decoder; decoder.decode(image, buffer); int dim = decoder.getWidth(); texture = Texture::Create3DTexture(dim, dim, decoder.getHeight() / dim, image.data()); AddTexture("blocks", texture); return true; }
ShaderManager::Shader* ShaderManager::CreateProgram( int flags ) { static const int LEN = 200; char buf[LEN]; int outLen = 0; for( int i=0; i<shaderArr.Size(); ++i ) { if ( shaderArr[i].prog && shaderArr[i].flags == flags ) { return &shaderArr[i]; } if ( shaderArr[i].prog == 0 ) { break; } } Shader* shader = shaderArr.Push(); shader->Init(); shader->flags = flags; shader->vertexProg = glCreateShader( GL_VERTEX_SHADER ); shader->fragmentProg = glCreateShader( GL_FRAGMENT_SHADER ); header = ""; AppendFlag( &header, "TEXTURE0", flags & TEXTURE0 ); AppendFlag( &header, "TEXTURE0_ALPHA_ONLY", flags & TEXTURE0_ALPHA_ONLY ); AppendFlag( &header, "TEXTURE0_TRANSFORM", flags & TEXTURE0_TRANSFORM ); AppendFlag( &header, "TEXTURE0_3COMP", flags & TEXTURE0_3COMP ); AppendFlag( &header, "TEXTURE1", flags & TEXTURE1 ); AppendFlag( &header, "TEXTURE1_ALPHA_ONLY", flags & TEXTURE1_ALPHA_ONLY ); AppendFlag( &header, "TEXTURE1_TRANSFORM", flags & TEXTURE1_TRANSFORM ); AppendFlag( &header, "TEXTURE1_3COMP", flags & TEXTURE1_3COMP ); AppendFlag( &header, "COLORS", flags & COLORS ); AppendFlag( &header, "COLOR_MULTIPLIER", flags & COLOR_MULTIPLIER ); AppendFlag( &header, "LIGHTING_DIFFUSE", flags & LIGHTING_DIFFUSE ); const char* vertexSrc[2] = { header.c_str(), fixedpipe_vert }; glShaderSource( shader->vertexProg, 2, vertexSrc, 0 ); glCompileShader( shader->vertexProg ); glGetShaderInfoLog( shader->vertexProg, LEN, &outLen, buf ); if ( outLen > 0 ) { GLOUTPUT(( "Vertex %d:\n%s\n", flags, buf )); } CHECK_GL_ERROR; const char* fragmentSrc[2] = { header.c_str(), fixedpipe_frag }; glShaderSource( shader->fragmentProg, 2, fragmentSrc, 0 ); glCompileShader( shader->fragmentProg ); glGetShaderInfoLog( shader->fragmentProg, LEN, &outLen, buf ); if ( outLen > 0 ) { GLOUTPUT(( "Fragment %d:\n%s\n", flags, buf )); } CHECK_GL_ERROR; shader->prog = glCreateProgram(); glAttachShader( shader->prog, shader->vertexProg ); glAttachShader( shader->prog, shader->fragmentProg ); glLinkProgram( shader->prog ); glGetProgramInfoLog( shader->prog, LEN, &outLen, buf ); if ( outLen > 0 ) { GLOUTPUT(( "Link %d:\n%s\n", flags, buf )); } CHECK_GL_ERROR; // glUseProgram return shader; }
int main(int argc, char **argv) { atexit(cleanup); // parse arguments char *model_path = NULL; char *vertexshader_path = NULL; char *fragmentshader_path = NULL; char *texture_path = NULL; bool use_smoothed_normals; if (argc >= 6) { texture_path = argv[5]; useTexture = 1; } if (argc >= 5) { model_path = argv[1]; vertexshader_path = argv[2]; fragmentshader_path = argv[3]; use_smoothed_normals = *argv[4] != '0'; } else { std::cerr << "Usage:" << std::endl; std::cerr << argv[0] << " <model::path> " << " <vertex-shader::path> " << " <fragment-shader::path> " << " <smooth-normals::{0,1}>" << " (<texture::path>)" << std::endl; exit(1); } // initialise OpenGL glutInit(&argc, argv); glutInitWindowSize(windowX, windowY); glutCreateWindow("CG-CW1"); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glEnable(GL_DEPTH_TEST); // set display and keyboard callbacks glutDisplayFunc(display_handler); glutKeyboardFunc(keyboard_handler); // initialise the OpenGL Extension Wrangler library for VBOs GLenum err = glewInit(); if (err != GLEW_OK){ std::cerr << "Error!" << std::endl; exit(1); } if (!GLEW_VERSION_2_1) { std::cerr << "Error 2.1!" << std::endl; exit(1); } // create shader, prepare data for OpenGL trig.LoadFile(model_path); shader.Init(vertexshader_path, fragmentshader_path); setup_texture(texture_path, &textureID); setup_vertex_position_buffer_object(); setup_vertex_uv_buffer_object(); setup_vertex_normal_buffer_object(use_smoothed_normals); // set up camera and object transformation matrices projectionMatrix = get_default_projectionMatrix(); viewMatrix = get_default_viewMatrix(); modelMatrix = get_default_modelMatrix(); normalMatrix = get_default_normalMatrix(); glutMainLoop(); }