Advertisement
alestane

OpenGL test code

Feb 23rd, 2016
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.02 KB | None | 0 0
  1. namespace shader {
  2.     std::string vFlat =
  3.     "#version 150" "\n"
  4.  
  5.     "uniform mat4 transform, camera, projection;" "\n"
  6.  
  7.     "in vec3 position, normal;" "\n"
  8.     "in vec2 uv;" "\n"
  9.  
  10.     "out mat4 modelview;" "\n"
  11.  
  12.     "out vec3 frag_position, frag_normal;" "\n"
  13.     "out vec2 frag_uv;" "\n"
  14.  
  15.     "void main() {" "\n"
  16.         "modelview = camera * transform;" "\n"
  17.         "vec4 eye_position = modelview * vec4(position, 1.0);" "\n"
  18.         "gl_Position = projection * eye_position;" "\n"
  19.         "frag_position = eye_position.xyz;" "\n"
  20.         "frag_normal   = (modelview * vec4(normal, 0.0)).xyz;" "\n"
  21.         "frag_uv = uv;" "\n"
  22.     "}";
  23.  
  24.     std::string fFlat =
  25.     "#version 150" "\n"
  26.  
  27.     "in mat4 modelview;" "\n"
  28.  
  29.     "in vec3 frag_position, frag_normal;" "\n"
  30.     "in vec2 frag_uv;" "\n"
  31.  
  32.     "uniform vec4 color;" "\n"
  33.  
  34.     "const vec3 light_direction = vec3(0.408248, -0.816497, -0.408248);" "\n"
  35.  
  36.     "out vec4 fragColor;" "\n"
  37.  
  38.     "void main() {" "\n"
  39.         "vec3 normal = normalize(frag_normal);" "\n"
  40.  
  41.         "float shade = 0.5 * (-dot(normal, normalize(light_direction)) + 1.0);" "\n"
  42.         "fragColor = vec4(color.rgb * shade, color.a);" "\n"
  43.     "}";
  44. }
  45.  
  46. namespace gl {
  47.     struct Vertex {
  48.         glm::vec3 position;
  49.         glm::vec3 normal;
  50.         glm::vec2 uv;
  51.     };
  52.    
  53.     class Object {
  54.     public:
  55.         glm::vec4 color;
  56.         GLuint data;
  57.         vector<GLushort> faces;
  58.         GLuint program;
  59.         mat4 transform;
  60.     };
  61. }
  62.  
  63. class OBJMesh {
  64. public:
  65.     OBJMesh(string const& filename);
  66.     vector<gl::Vertex> verts;
  67.     vector<GLushort> faces;
  68.     vector<GLushort> segments;
  69. }
  70.  
  71. gl::Object* cube = NULL;
  72.  
  73. void load() {  // assumes context is created : no errors up to this point
  74.     GLuint v = glCreateShader(GL_VERTEX_SHADER), f = glCreateShader(GL_FRAGMENT_SHADER);
  75.     GLint length = static_cast<GLint>(shader::vFlat.length());
  76.     char const* text = shader::vFlat.c_str();
  77.     glShaderSource(v, 1, &text, &length);
  78.     glCompileShader(v);
  79.     GLint status = GL_FALSE;
  80.     glGetShaderiv(v, GL_COMPILE_STATUS, &status);
  81.     length = static_cast<GLint>(shader::fFlat.length());
  82.     text = shader::fFlat.c_str();
  83.     glShaderSource(f, 1, &text, &length);
  84.     glCompileShader(f);
  85.     glGetShaderiv(f, GL_COMPILE_STATUS, &status);
  86.    
  87.     plain = glCreateProgram();
  88.     glAttachShader(plain, v);
  89.     glAttachShader(plain, f);
  90.     glBindAttribLocation(plain, 0, "position");
  91.     glBindAttribLocation(plain, 1, "normal");
  92.     glBindAttribLocation(plain, 2, "uv");
  93.     glLinkProgram(plain);
  94.     glGetProgramiv(plain, GL_LINK_STATUS, &status);
  95.     glDetachShader(plain, v);
  96.     glDetachShader(plain, f);
  97.    
  98.     glUseProgram(plain);
  99.     glUniformMatrix4fv(glGetUniformLocation(plain, "camera"), 1, GL_FALSE, glm::value_ptr(glm::lookAt(vec3(0.0f, 2.0f, 4.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f))));
  100.     glUniformMatrix4fv(glGetUniformLocation(plain, "projection"), 1, GL_FALSE, glm::value_ptr(glm::frustum(-2.0f,  2.0f, -1.5f, 1.5f, 02.0f, -5.0f)));
  101.     glUniformMatrix4fv(glGetUniformLocation(plain, "transform"), 1, GL_FALSE, glm::value_ptr(glm::mat4()));
  102.    
  103.     cube = new gl::Object();
  104.     glGenVertexArrays(1, &cube->data);
  105.     cube->program = plain;
  106.     cube->color = glm::vec4(1.0f);
  107.     cube->transform = glm::mat4();
  108.    
  109.     OBJMesh cubeMesh("cube.obj"); // confirmed working
  110.    
  111.     GLuint vbo, ebo;
  112.     glGenBuffers(1, &vbo);
  113.     glGenBuffers(1, &ebo);
  114.    
  115.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  116.     glBufferData(GL_ARRAY_BUFFER, sizeof(gl::Vertex) * cubeMesh.verts.size(), cubeMesh.verts.data(), GL_STATIC_DRAW);
  117.     glBindVertexArray(cube->data);
  118.     glEnableVertexAttribArray(0);
  119.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(gl::Vertex), reinterpret_cast<void*>(0));
  120.     glEnableVertexAttribArray(1);
  121.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(gl::Vertex), reinterpret_cast<void*>(sizeof(glm::vec3)));
  122.     glEnableVertexAttribArray(2);
  123.     glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(gl::Vertex), reinterpret_cast<void*>(sizeof(glm::vec3)+sizeof(glm::vec3)));
  124.     glBindVertexArray(0);
  125.     glDisableVertexAttribArray(0);
  126.     glDisableVertexAttribArray(1);
  127.     glDisableVertexAttribArray(2);
  128.    
  129.     glBindVertexArray(cube->data); // because of C++ wrapper class in original code
  130.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  131.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * cubeMesh.faces.size(), cubeMesh.faces.data(), GL_STATIC_DRAW);
  132.     glBindVertexArray(0);
  133.    
  134.     glDeleteBuffers(1, &ebo);
  135.     glDeleteBuffers(1, &vbo);
  136.  
  137.     cube->faces = cubeMesh.segments();
  138. }
  139.  
  140. void render() {
  141.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  142.    
  143.     glUseProgram(cube->program);
  144.     glUniform4fv(glGetUniformLocation(cube->program, "color"), 1, glm::value_ptr(cube->color));
  145.     glUniformMatrix4fv(glGetUniformLocation(cube->program, "transform"), 1, GL_FALSE, glm::value_ptr(cube->transform));
  146.     glBindVertexArray(cube->data);
  147.     GLushort position = 0;
  148.     for (GLushort range: faces) {
  149.         // THIS glDrawElements LINE YIELDS GL_OUT_OF_MEMORY ON THE FIRST CALL!!!!!
  150.         glDrawElements(GL_TRIANGLE_STRIP, range, GL_UNSIGNED_SHORT, reinterpret_cast<void*>(position * sizeof(GLushort)));
  151.         position += range;
  152.     }
  153.     glBindVertexArray(0);
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement