Advertisement
Guest User

Help

a guest
Apr 8th, 2014
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.02 KB | None | 0 0
  1. #################################################################
  2. INITIALIZATION
  3. #################################################################
  4.  
  5. //note that some values have already been initialized, things that do not require
  6. //opengl context or call opengl functions were initialized in the constructor, such as glm matrices
  7. //and vectors
  8. void GLWidget::initializeGL()
  9. {
  10.         if(glewInit() != GLEW_OK)
  11.         cout << "Failure Initializing GLEW\n";
  12.    
  13.     //4.0.0 Build 10.18.10.3308
  14.     cout << "openGL Version: " << glGetString(GL_VERSION) << endl;
  15.     cout << "GLSL Version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;
  16.     program = makeProgram("shaders\\vert.glsl", "shaders\\frag.glsl", NULL);
  17.  
  18.     glUseProgram(program);
  19.         checkError("glUseProgram");
  20.     glEnable(GL_DEPTH_TEST);
  21.     glDepthFunc(GL_LEQUAL);
  22.  
  23.     glEnable(GL_CULL_FACE);
  24.     glCullFace(GL_BACK);
  25.     glFrontFace(GL_CCW);
  26.     glClearColor(0, 0.05, 0.2, 1);
  27.  
  28.     pLoc = glGetUniformLocation(program, "P");
  29.     mvLoc = glGetUniformLocation(program, "MV");
  30.     nmlLoc = glGetUniformLocation(program, "NML");
  31.     eyeLoc = glGetUniformLocation(program, "eye");
  32.     lightLoc = glGetUniformLocation(program, "lPos");
  33.  
  34.     glUniformMatrix4fv(mvLoc, 1, false, value_ptr(view));
  35.     glUniformMatrix4fv(pLoc, 1, false, value_ptr(projection));
  36.     glUniformMatrix3fv(nmlLoc, 1, false, value_ptr(normal));
  37.     checkError();
  38.     glUniform3fv(eyeLoc, 1, value_ptr(eye));
  39.     glUniform3fv(lightLoc, 1, value_ptr(lPos));
  40.  
  41.     //model.loadObj("data\\beethovan_bust.obj");
  42.     model.loadObj("data\\box.obj");
  43.     model.loadBuffers(program);
  44.     model.loadTextures(program);
  45.  
  46. }
  47.  
  48. #################################################################
  49. DRAWING
  50. #################################################################
  51.  
  52. void GLWidget::paintGL()
  53. {
  54.     glUseProgram(program);
  55.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  56.     model.render();
  57.     checkError();
  58. }
  59.  
  60. void Model::render()
  61. {
  62.         glActiveTexture(GL_TEXTURE0);
  63.         glBindTexture(GL_TEXTURE_2D, albedo);
  64.  
  65.         glActiveTexture(GL_TEXTURE1);
  66.         glBindTexture(GL_TEXTURE_2D, normal);
  67.  
  68.         glActiveTexture(GL_TEXTURE2);
  69.         glBindTexture(GL_TEXTURE_2D, height);
  70.  
  71.         glBindVertexArray(vao);
  72.         glDrawElements(GL_TRIANGLES, 3 * numTris, GL_UNSIGNED_INT, 0);
  73.         glBindVertexArray(0);
  74. }
  75.  
  76. #################################################################
  77. LOADING TEXTURES
  78. #################################################################
  79.  
  80. void Model::loadTextures(GLint program)
  81. {
  82.     albedo = SOIL_load_OGL_texture("map\\color_map.jpg",
  83.                                         SOIL_LOAD_RGB, SOIL_CREATE_NEW_ID,
  84.                                         SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS);
  85.  
  86.     normal = SOIL_load_OGL_texture("map\\normal_map.jpg",
  87.                                         SOIL_LOAD_RGB, SOIL_CREATE_NEW_ID,
  88.                                         SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS);
  89.  
  90.     height = SOIL_load_OGL_texture("map\\height_map.jpg",
  91.                                         SOIL_LOAD_RGB, SOIL_CREATE_NEW_ID,
  92.                                         SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS);
  93.  
  94.         GLint aLoc = glGetUniformLocation(program, "albedo_map");
  95.         GLint nLoc = glGetUniformLocation(program, "normal_map");
  96.         GLint hLoc = glGetUniformLocation(program, "height_map");
  97.  
  98.         glUseProgram(program);
  99.         glUniform1i(aLoc, 0);
  100.         glUniform1i(nLoc, 1);
  101.         glUniform1i(hLoc, 2);
  102. }
  103.  
  104. #################################################################
  105. GENERATING AND BINDING BUFFERS, AND ATTRIBUTES
  106. #################################################################
  107.  
  108. void Model::loadBuffers(GLint program)
  109. {
  110.     int vertSize = sizeof(Vertex);
  111.     int triSize = sizeof(Triangle);
  112.     int vecSize = sizeof(vec3);
  113.  
  114.     glGenVertexArrays(1, &vao);
  115.         glBindVertexArray(vao);
  116.  
  117.     glGenBuffers(1, &vbo);
  118.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  119.     glBufferData(GL_ARRAY_BUFFER, vertSize * numVerts, verts, GL_STATIC_DRAW);
  120.  
  121.     glGenBuffers(1, &ibo);
  122.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
  123.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, triSize * numTris, tris, GL_STATIC_DRAW);
  124.  
  125.     GLint attrib;
  126.  
  127.     attrib = glGetAttribLocation(program, "position");
  128.     glVertexAttribPointer(attrib, 3, GL_FLOAT, false, vertSize, (GLvoid*)0);
  129.     glEnableVertexAttribArray(attrib);
  130.  
  131.     attrib = glGetAttribLocation(program, "normal");
  132.     glVertexAttribPointer(attrib, 3, GL_FLOAT, false, vertSize, (GLvoid*)vecSize);
  133.     glEnableVertexAttribArray(attrib);
  134.  
  135.     attrib = glGetAttribLocation(program, "vTexCoord");
  136.     glVertexAttribPointer(attrib, 3, GL_FLOAT, false, vertSize, (GLvoid*)(4*vecSize));
  137.     glEnableVertexAttribArray(attrib);
  138.  
  139.     attrib = glGetAttribLocation(program, "tangent");
  140.     glVertexAttribPointer(attrib, 3, GL_FLOAT, false, vertSize, (GLvoid*)(2*vecSize));
  141.     glEnableVertexAttribArray(attrib);
  142.  
  143.     //clear the bindings to avoid state modification.
  144.     glBindVertexArray(0);
  145.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  146.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  147. }
  148.  
  149. #################################################################
  150. COMPILING SHADERS AND LINKING PROGRAM
  151. #################################################################
  152.  
  153. //g is for geometry shader, and it isn't used
  154. GLuint makeProgram(char *v, char *f, char *g)
  155. {
  156.     int p = glCreateProgram();
  157.     int fs, vs;
  158.     char *v_string = readTextFile(v);
  159.     char *f_string = readTextFile(f);
  160.  
  161.     vs = glCreateShader(GL_VERTEX_SHADER);
  162.     const GLchar *vc = v_string;
  163.     glShaderSource(vs, 1, &vc, NULL);
  164.     glCompileShader(vs);
  165.     printShaderLog(vs); //"Failed to compile vertex shader.");
  166.     glAttachShader(p, vs);
  167.  
  168.     fs = glCreateShader(GL_FRAGMENT_SHADER);
  169.     const GLchar *fc = f_string;
  170.     glShaderSource(fs, 1, &fc, NULL);
  171.     glCompileShader(fs); // "Failed to compile fragment shader.");
  172.     printShaderLog(fs);
  173.     glAttachShader(p, fs);
  174.  
  175.     GLint success = GL_FALSE;
  176.     GLint len, written;
  177.     glLinkProgram(p);
  178.     glGetProgramiv(p, GL_LINK_STATUS, &success);
  179.     if(success == GL_FALSE)
  180.         cout << "Program Failed to Link\n";
  181.     glGetProgramiv(p, GL_INFO_LOG_LENGTH, &len);
  182.     if(len > 0)
  183.     {
  184.         GLchar error[len];
  185.         glGetProgramInfoLog(p, len, &written, error);
  186.         cout << error << endl;
  187.     }
  188.     glUseProgram(p);
  189.     return p;
  190. }
  191. #################################################################
  192. VERTEX SHADER
  193. #################################################################
  194.  
  195. #version 130
  196. uniform vec3 lPos;
  197. uniform vec3 eye;
  198. uniform mat4 MV;
  199. uniform mat4 P;
  200. uniform mat3 NML;
  201.  
  202. out vec2 texCoord;
  203. out vec3 vDir;
  204. out vec3 lDir;
  205.  
  206. in vec3 position;
  207. in vec2 vTexCoord;
  208. in vec3 normal;
  209. in vec3 tangent;
  210.  
  211. void main()
  212. {
  213.    vec4 pos = MV * vec4(position,1);
  214.    texCoord = vTexCoord;
  215.    gl_Position = P * pos;
  216.  
  217.    vec3 V  = -pos.xyz;
  218.    vec3 L = lPos - pos.xyz;
  219.  
  220.    vec3 binormal = cross(normal, tangent);
  221.  
  222.    vDir.x  = dot(tangent, V);
  223.    vDir.y  = dot(binormal, V);
  224.    vDir.z  = dot(normal, V);
  225.  
  226.    lDir.x  = dot(tangent, L);
  227.    lDir.y  = dot(binormal, L);
  228.    lDir.z  = dot(normal, L);
  229. }
  230.  
  231. #################################################################
  232. FRAGMENT SHADER
  233. #################################################################
  234.  
  235. uniform sampler2D normal_map;
  236. uniform sampler2D albedo_map;
  237. uniform sampler2D height_map;
  238.  
  239. in vec2 texCoord;
  240. in vec3 vDir;
  241. in vec3 lDir;
  242.  
  243. float S = 25.0;
  244. vec4 Kd = vec4(1,1,1,1);
  245. vec4 Ks = vec4(1,1,1,1);
  246. vec4 Ka = vec4(1,1,1,1);
  247.  
  248. void main( void )
  249. {
  250.    float scale = 0.05;
  251.    float bias = -0.03;
  252.    vec3  V = normalize(vDir);
  253.    float height = texture(height_map, texCoord).x;
  254.    height = height * scale + bias;
  255.    vec2 tex2 = texCoord + height * V.xy;
  256.    vec3  L = normalize(lDir);
  257.    vec3  N = normalize((texture(normal_map, tex2).xyz * 2.0) - 1.0);
  258.    float NDotL = dot(N, L);
  259.  
  260.    vec3  R = normalize(((2.0 * N) * NDotL) - L);
  261.    float RDotV = NDotL * max(0.0, dot(R, V));
  262.  
  263.    vec4 col = texture( albedo_map, tex2);
  264.    vec4 color = col * NDotL * Kd + col * Ka + Ks * pow(RDotV, S);
  265.    gl_FragColor = (color);
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement