Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <GL/glew.h>
- #include <GLFW/glfw3.h>
- #include <vector>
- #include <iostream>
- #include <cstdarg>
- struct Program
- {
- static GLuint Load( const char* shader, ... )
- {
- GLuint prog = glCreateProgram();
- va_list args;
- va_start( args, shader );
- while( shader )
- {
- const GLenum type = va_arg( args, GLenum );
- AttachShader( prog, type, shader );
- shader = va_arg( args, const char* );
- }
- va_end( args );
- 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;
- std::exit( EXIT_FAILURE );
- }
- 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 );
- }
- };
- const char* vert = R"GLSL(
- #version 330 core
- layout ( location = 0 ) in vec4 inPos;
- void main()
- {
- gl_Position = inPos;
- }
- )GLSL";
- const char* frag = R"GLSL(
- #version 330 core
- out vec4 outColor;
- void main()
- {
- outColor = vec4( 1.0, 0.0, 0.0, 1.0 );
- }
- )GLSL";
- int main( int argc, char** argv )
- {
- glfwInit();
- glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 );
- glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 );
- glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
- GLFWwindow* window = glfwCreateWindow( 640, 480, "Test", NULL, NULL );
- glfwMakeContextCurrent( window );
- glewInit();
- glfwSwapInterval( 1 );
- GLuint prog = Program::Load( vert, GL_VERTEX_SHADER, frag, GL_FRAGMENT_SHADER, NULL );
- glUseProgram( prog );
- GLuint vao = 0;
- glGenVertexArrays( 1, &vao );
- glBindVertexArray( vao );
- GLuint vbo = 0;
- glGenBuffers( 1, &vbo );
- glBindBuffer( GL_ARRAY_BUFFER, vbo );
- std::vector<float> data =
- {
- -0.5f, 0.5f,
- -0.5f, -0.5f,
- 0.5f, 0.5f,
- 0.5f, 0.5f,
- -0.5f, -0.5f,
- 0.5f, -0.5f
- };
- glBufferData( GL_ARRAY_BUFFER, data.size() * sizeof( std::vector<float>::value_type ), data.data(), GL_STATIC_DRAW );
- glVertexAttribPointer( 0 , 2, GL_FLOAT, GL_FALSE, 0, 0 );
- glEnableVertexAttribArray( 0 );
- while( !glfwWindowShouldClose( window ) )
- {
- glfwPollEvents();
- int w, h;
- glfwGetFramebufferSize( window, &w, &h );
- glViewport( 0, 0, w, h );
- glClear( GL_COLOR_BUFFER_BIT );
- glUseProgram( prog );
- glBindVertexArray( vao );
- glDrawArrays( GL_TRIANGLES, 0, 6 );
- glfwSwapBuffers( window );
- }
- glfwDestroyWindow( window );
- glfwTerminate();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement