-
Notifications
You must be signed in to change notification settings - Fork 2
/
capture_irradiance.go
64 lines (54 loc) · 1.82 KB
/
capture_irradiance.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package pipeline
import (
"github.com/stdiopt/gorge"
"github.com/stdiopt/gorge/static"
"github.com/stdiopt/gorge/systems/render"
"github.com/stdiopt/gorge/systems/render/gl"
)
// CaptureIrradiance processes envMap through a shader
func (pl *PL) CaptureIrradiance(src, target string) PipelineFunc {
srcTex := src
dstTex := target
return func(r *render.Context, next StepFunc) StepFunc {
size := 32
irradianceSD := &gorge.ShaderData{Src: static.MustData("shaders/ibl/irradiance_convolution.glsl")}
irradianceShader := r.NewShader(irradianceSD)
irradianceTex := pl.createCubeMap(size, false)
// We have radiance shader now
return func(p *Step) {
irradianceShader.Bind()
irradianceShader.Set("environmentMap", 0)
irradianceShader.Set("projection", camProj)
tex := p.Samplers[srcTex]
if tex == nil {
next(p)
return
}
gl.ActiveTexture(gl.TEXTURE0)
gl.BindTexture(gl.TEXTURE_CUBE_MAP, tex.ID)
gl.Viewport(0, 0, int32(size), int32(size))
gl.BindFramebuffer(gl.DRAW_FRAMEBUFFER, pl.captureFBO)
{ // For some reason this makes it work on webgl
gl.BindRenderbuffer(gl.RENDERBUFFER, pl.captureRBO)
gl.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT24, size, size)
gl.FramebufferRenderbuffer(gl.DRAW_FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, pl.captureRBO)
}
{
for i := 0; i < 6; i++ {
irradianceShader.Set("view", camTargets[i])
gl.FramebufferTexture2D(
gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0,
gl.Enum(gl.TEXTURE_CUBE_MAP_POSITIVE_X+i), irradianceTex.ID, 0)
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
gl.Disable(gl.BLEND)
gl.Disable(gl.DEPTH_TEST)
pl.renderCube()
}
}
gl.BindVertexArray(gl.Null)
gl.BindFramebuffer(gl.DRAW_FRAMEBUFFER, gl.Null)
p.Samplers[dstTex] = irradianceTex
next(p)
}
}
}