Advertisement
Guest User

Untitled

a guest
Feb 28th, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.57 KB | None | 0 0
  1. deferred = {}
  2.  
  3. local gbuffershader = love.graphics.newShader
  4. [[
  5. extern Image normaltex;
  6. extern Image materialtex;
  7.  
  8. void effects( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
  9. {
  10.     love_Canvases[0] = Texel(texture, texture_coords);
  11.     love_Canvases[1] = Texel(normaltex, texture_coords);
  12.     love_Canvases[2] = Texel(materialtex, texture_coords);
  13. }
  14. ]]
  15.  
  16. local directionalshader = love.graphics.newShader
  17. [[
  18.     extern Image colorbuffer;
  19.     extern Image normalbuffer;
  20.     extern Image materialbuffer;
  21.  
  22.     extern Image ramp;
  23.  
  24.     extern vec3 lightvec;
  25.  
  26.     vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords )
  27.     {
  28.         screen_coords = screen_coords / love_ScreenSize.xy;
  29.         screen_coords.y = 1.0 - screen_coords.y;
  30.  
  31.         vec4 tcol = Texel(colorbuffer, screen_coords);
  32.         vec4 material = Texel(materialbuffer, screen_coords);
  33.  
  34.         float emission = material.g;
  35.         float specintensity = material.r;
  36.         float specpower = material.b;  
  37.  
  38.         vec4 lcol = color;
  39.  
  40.         vec3 E = vec3(0, 0, -1);
  41.         vec3 N = 2 * Texel(normalbuffer, screen_coords).xyz - 1;
  42.         vec3 L = normalize(lightvec);
  43.         vec3 R = reflect(L, N);
  44.         float NdotL = dot(N, L);
  45.         float EdotR = pow(dot(E, R), specpower*255);
  46.  
  47.         float diffuse = NdotL;
  48.         float specular;
  49.         if(NdotL < 0)
  50.         {
  51.             specular = 0;
  52.         }
  53.         else
  54.         {
  55.             specular = EdotR * specintensity;
  56.         }
  57.         return tcol * lcol * (Texel(ramp, vec2(diffuse, 0)) + Texel(ramp, vec2(specular, 0))) + emission*tcol;
  58.         //return color;
  59.     }
  60. ]]
  61.  
  62. function deferred.initialize()
  63.     deferred.normalbuffer = love.graphics.newCanvas()
  64.     deferred.materialbuffer = love.graphics.newCanvas()
  65.     deferred.colorbuffer = love.graphics.newCanvas()
  66.  
  67.     deferred.ramp = love.graphics.newImage("ramp.png")
  68.     deferred.ramp:setFilter("nearest", "nearest")
  69. end
  70.  
  71. function deferred.newImage(path, normalpath, materialpath)
  72.     if not normalpath then
  73.         normalpath = string.gsub(path, "%.", "_normals.")
  74.         materialpath = string.gsub(path, "%.", "_material.")
  75.     end
  76.  
  77.     dsprite = {}
  78.     table.insert(dsprite, love.graphics.newImage(path))
  79.     table.insert(dsprite, love.graphics.newImage(normalpath))
  80.     table.insert(dsprite, love.graphics.newImage(materialpath))
  81.  
  82.     dsprite[1]:setFilter("nearest", "nearest")
  83.     dsprite[2]:setFilter("nearest", "nearest")
  84.     dsprite[3]:setFilter("nearest", "nearest")
  85.  
  86.     return dsprite
  87. end
  88.  
  89. function deferred.beginSpritePass()
  90.     love.graphics.setShader(gbuffershader)
  91.     love.graphics.setCanvas(deferred.colorbuffer, deferred.normalbuffer, deferred.materialbuffer)
  92.     love.graphics.clear()
  93.  
  94. end
  95.  
  96. function deferred.endSpritePass()
  97.     love.graphics.setCanvas()
  98.     love.graphics.setShader()
  99. end
  100.  
  101. function deferred.beginLightPass()
  102.     love.graphics.setBlendMode("additive")
  103. end
  104.  
  105. function deferred.endLightPass()
  106.     love.graphics.setBlendMode("alpha")
  107.     love.graphics.setShader()
  108. end
  109.  
  110. function deferred.draw(image, x, y, r, sx, sy, ox, oy, kx, ky)
  111.     love.graphics.setShader(gbuffershader)
  112.     gbuffershader:send("normaltex", image[2])
  113.     gbuffershader:send("materialtex", image[3])
  114.  
  115.     love.graphics.draw(image[1], x, y, r, sx, sy, ox, oy, kx, ky)
  116. end
  117.  
  118. function deferred.drawDirectionalLight(color, vector)
  119.     scw, sch = love.graphics.getDimensions()
  120.     love.graphics.setShader(directionalshader)
  121.     directionalshader:send("colorbuffer", deferred.colorbuffer)
  122.     directionalshader:send("normalbuffer", deferred.normalbuffer)
  123.     directionalshader:send("materialbuffer", deferred.materialbuffer)
  124.     directionalshader:send("ramp", deferred.ramp)
  125.     directionalshader:send("lightvec", vector)
  126.  
  127.     love.graphics.setColor(color)
  128.     love.graphics.rectangle("fill", 0, 0, scw, sch)
  129. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement