Implement raytraced lightmap

This commit is contained in:
2019-01-09 23:32:10 +01:00
parent 3dde1e1083
commit 9787175b13
12 changed files with 240 additions and 28 deletions

View File

@@ -509,6 +509,7 @@ void App::initShaders()
"uniform mat4 mvp;\n"
"in vec4 pos;\n"
"in vec3 nor;\n"
"in vec2 uvs;\n"
"out vec3 n;\n"
"void main() {\n"
" n = nor;\n"
@@ -522,6 +523,61 @@ void App::initShaders()
"void main() {\n"
" mediump float d = max(0.0, dot(normalize(n), light_dir));\n"
" frag = vec4(vec3(d), 1.0);\n"
//" frag = vec4(normalize(n) * 0.5 + 0.5, 1.0);\n"
"}\n";
// LAMBERT LIGHTMAP
static const char* shader_lambert_lightmap_v =
SHADER_VERSION
"uniform mat4 mvp;\n"
"in vec4 pos;\n"
"in vec3 nor;\n"
"in vec2 uvs;\n"
"out vec3 n;\n"
"out vec2 uv;\n"
"void main() {\n"
" n = nor;\n"
" uv = uvs;\n"
" gl_Position = mvp * pos;\n"
"}\n";
static const char* shader_lambert_lightmap_f =
SHADER_VERSION
"uniform mediump sampler2D tex;\n"
"uniform mediump vec3 light_dir;\n"
"in mediump vec3 n;\n"
"in mediump vec2 uv;\n"
"out mediump vec4 frag;\n"
"void main() {\n"
" mediump float d = max(0.0, dot(normalize(n), light_dir));\n"
" mediump vec4 c = texture(tex, uv);\n"
" frag = vec4(c.rgb * d, 1.0);\n"
"}\n";
// BAKE UVS
static const char* shader_bakeuv_v =
SHADER_VERSION
"uniform mat4 mvp;\n"
"in vec4 pos;\n"
"in vec3 nor;\n"
"in vec2 uvs;\n"
"out vec3 n;\n"
"out vec3 p;\n"
"void main() {\n"
" n = nor;\n"
" p = vec3(mvp * pos);\n"
" gl_Position = vec4(uvs * 2.0 - 1.0, 0.0, 1.0);\n"
"}\n";
static const char* shader_bakeuv_f =
SHADER_VERSION
"uniform int mode;\n"
"in highp vec3 n;\n"
"in highp vec3 p;\n"
"out highp vec3 frag;\n"
"void main() {\n"
" switch(mode) {\n"
" case 0: frag = normalize(n); break;\n"
" case 1: frag = p; break;\n"
" }\n"
"}\n";
@@ -566,6 +622,10 @@ void App::initShaders()
LOG("Failed to create shader VertexColor");
if (!ShaderManager::create(kShader::Lambert, shader_lambert_v, shader_lambert_f))
LOG("Failed to create shader Lambert");
if (!ShaderManager::create(kShader::LambertLightmap, shader_lambert_lightmap_v, shader_lambert_lightmap_f))
LOG("Failed to create shader LambertLightmap");
if (!ShaderManager::create(kShader::BakeUV, shader_bakeuv_v, shader_bakeuv_f))
LOG("Failed to create shader BakeUV");
LOG("shaders initialized");
}