With the recent changes to the Effect and Renderer, it's finally possible
to avoid the need to specify the shadow map texture unit everywhere, and
get rid of the hardcoded gl_EyePlane* indices.
const char *standard_vertex_src[] =
{
const char *standard_vertex_src[] =
{
+ "s", "uniform int shadow_unit;\n",
"n", "attribute vec3 tangent;\n",
"n", "attribute vec3 binormal;\n",
"t|n", "varying vec2 v_texcoord;\n",
"n", "attribute vec3 tangent;\n",
"n", "attribute vec3 binormal;\n",
"t|n", "varying vec2 v_texcoord;\n",
"p|en", "\tv_eye_dir = vec3(dot(eye_tangent, eye_dir), dot(eye_binormal, eye_dir), dot(eye_normal, eye_dir));\n",
"p|e!n", "\tv_eye_dir = eye_dir;\n",
"t|n", "\tv_texcoord = gl_MultiTexCoord0.xy;\n",
"p|en", "\tv_eye_dir = vec3(dot(eye_tangent, eye_dir), dot(eye_binormal, eye_dir), dot(eye_normal, eye_dir));\n",
"p|e!n", "\tv_eye_dir = eye_dir;\n",
"t|n", "\tv_texcoord = gl_MultiTexCoord0.xy;\n",
- "s", "\tv_shadowcoord = vec3(dot(gl_EyePlaneS[3], eye_pos), dot(gl_EyePlaneT[3], eye_pos), dot(gl_EyePlaneR[3], eye_pos));\n",
+ "s", "\tv_shadowcoord = vec3(dot(gl_EyePlaneS[shadow_unit], eye_pos), dot(gl_EyePlaneT[shadow_unit], eye_pos), dot(gl_EyePlaneR[shadow_unit], eye_pos));\n",
"!lm", "\tv_color = gl_Color;\n",
0, "}",
0, 0
"!lm", "\tv_color = gl_Color;\n",
0, "}",
0, 0
Effect(r),
size(s),
light(l),
Effect(r),
size(s),
light(l),
radius(1)
{
depth_buf.set_min_filter(LINEAR);
radius(1)
{
depth_buf.set_min_filter(LINEAR);
depth_buf.set_wrap(CLAMP_TO_EDGE);
depth_buf.storage(DEPTH_COMPONENT, size, size);
fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0);
depth_buf.set_wrap(CLAMP_TO_EDGE);
depth_buf.storage(DEPTH_COMPONENT, size, size);
fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0);
}
void ShadowMap::set_target(const Vector3 &t, float r)
}
void ShadowMap::set_target(const Vector3 &t, float r)
void ShadowMap::set_texture_unit(unsigned u)
{
unit = u;
void ShadowMap::set_texture_unit(unsigned u)
{
unit = u;
+
+ int i = unit;
+ shdata.uniform("shadow", i);
+ shdata.uniform("shadow_unit", i);
}
void ShadowMap::render(Renderer &renderer, const Tag &tag) const
}
void ShadowMap::render(Renderer &renderer, const Tag &tag) const
tg_r.bind_to(RCOORD);
TexUnit::activate(0);
tg_r.bind_to(RCOORD);
TexUnit::activate(0);
+ Renderer::Push _push_rend(renderer);
+ renderer.add_shader_data(shdata);
renderable.render(renderer, tag);
Texture::unbind_from(unit);
renderable.render(renderer, tag);
Texture::unbind_from(unit);
#include "effect.h"
#include "framebuffer.h"
#include "effect.h"
#include "framebuffer.h"
+#include "programdata.h"
#include "texture2d.h"
#include "vector.h"
#include "texture2d.h"
#include "vector.h"
Texture2D depth_buf;
Vector3 target;
float radius;
Texture2D depth_buf;
Vector3 target;
float radius;
public:
ShadowMap(unsigned, const Renderable &, const Light &);
public:
ShadowMap(unsigned, const Renderable &, const Light &);