Advertisement
genpfault

Untitled

Aug 6th, 2018
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <GL/glew.h>
  2. #include <GLFW/glfw3.h>
  3. #include <vector>
  4. #include <iostream>
  5. #include <cstdarg>
  6.  
  7. struct Program
  8. {
  9.     static GLuint Load( const char* shader, ... )
  10.     {
  11.         GLuint prog = glCreateProgram();
  12.         va_list args;
  13.         va_start( args, shader );
  14.         while( shader )
  15.         {
  16.             const GLenum type = va_arg( args, GLenum );
  17.             AttachShader( prog, type, shader );
  18.             shader = va_arg( args, const char* );
  19.         }
  20.         va_end( args );
  21.         glLinkProgram( prog );
  22.         CheckStatus( prog );
  23.         return prog;
  24.     }
  25.  
  26. private:
  27.     static void CheckStatus( GLuint obj )
  28.     {
  29.         GLint status = GL_FALSE;
  30.         if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
  31.         if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
  32.         if( status == GL_TRUE ) return;
  33.         GLchar log[ 1 << 15 ] = { 0 };
  34.         if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
  35.         if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
  36.         std::cerr << log << std::endl;
  37.         std::exit( EXIT_FAILURE );
  38.     }
  39.  
  40.     static void AttachShader( GLuint program, GLenum type, const char* src )
  41.     {
  42.         GLuint shader = glCreateShader( type );
  43.         glShaderSource( shader, 1, &src, NULL );
  44.         glCompileShader( shader );
  45.         CheckStatus( shader );
  46.         glAttachShader( program, shader );
  47.         glDeleteShader( shader );
  48.     }
  49. };
  50.  
  51. const char* vert = R"GLSL(
  52. #version 330 core
  53. layout ( location = 0 ) in vec4 inPos;
  54. void main()
  55. {
  56.    gl_Position = inPos;
  57. }
  58. )GLSL";
  59.  
  60. const char* frag = R"GLSL(
  61. #version 330 core
  62. out vec4 outColor;
  63. void main()
  64. {
  65.    outColor = vec4( 1.0, 0.0, 0.0, 1.0 );
  66. }
  67. )GLSL";
  68.  
  69. int main( int argc, char** argv )
  70. {
  71.     glfwInit();
  72.     glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 );
  73.     glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 );
  74.     glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
  75.     GLFWwindow* window = glfwCreateWindow( 640, 480, "Test", NULL, NULL );
  76.     glfwMakeContextCurrent( window );
  77.     glewInit();
  78.     glfwSwapInterval( 1 );
  79.  
  80.     GLuint prog = Program::Load( vert, GL_VERTEX_SHADER, frag, GL_FRAGMENT_SHADER, NULL );
  81.     glUseProgram( prog );
  82.  
  83.     GLuint vao = 0;
  84.     glGenVertexArrays( 1, &vao );
  85.     glBindVertexArray( vao );
  86.  
  87.     GLuint vbo = 0;
  88.     glGenBuffers( 1, &vbo );
  89.     glBindBuffer( GL_ARRAY_BUFFER, vbo );
  90.     std::vector<float> data =
  91.     {
  92.         -0.5f, 0.5f,
  93.         -0.5f, -0.5f,
  94.         0.5f, 0.5f,
  95.         0.5f, 0.5f,
  96.         -0.5f, -0.5f,
  97.         0.5f, -0.5f
  98.     };
  99.     glBufferData( GL_ARRAY_BUFFER, data.size() * sizeof( std::vector<float>::value_type ), data.data(), GL_STATIC_DRAW );
  100.     glVertexAttribPointer( 0 , 2, GL_FLOAT, GL_FALSE, 0, 0 );
  101.     glEnableVertexAttribArray( 0 );
  102.  
  103.     while( !glfwWindowShouldClose( window ) )
  104.     {
  105.         glfwPollEvents();
  106.  
  107.         int w, h;
  108.         glfwGetFramebufferSize( window, &w, &h );
  109.         glViewport( 0, 0, w, h );
  110.  
  111.         glClear( GL_COLOR_BUFFER_BIT );
  112.  
  113.         glUseProgram( prog );
  114.         glBindVertexArray( vao );
  115.         glDrawArrays( GL_TRIANGLES, 0, 6 );
  116.  
  117.         glfwSwapBuffers( window );
  118.     }
  119.  
  120.     glfwDestroyWindow( window );
  121.     glfwTerminate();
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement