|
|
|
|
@ -8559,6 +8559,7 @@ RID RasterizerGLES2::canvas_light_shadow_buffer_create(int p_width) {
|
|
|
|
|
#ifdef GLEW_ENABLED
|
|
|
|
|
glDrawBuffer(GL_NONE);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
// We'll use a RGBA texture into which we pack the depth info
|
|
|
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cls->size, cls->height, 0,
|
|
|
|
|
@ -8567,6 +8568,7 @@ RID RasterizerGLES2::canvas_light_shadow_buffer_create(int p_width) {
|
|
|
|
|
// Attach the RGBA texture to FBO color attachment point
|
|
|
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
|
|
|
|
GL_TEXTURE_2D, cls->depth, 0);
|
|
|
|
|
cls->rgba=cls->depth;
|
|
|
|
|
|
|
|
|
|
// Allocate 16-bit depth buffer
|
|
|
|
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, cls->size, cls->height);
|
|
|
|
|
@ -8845,10 +8847,14 @@ void RasterizerGLES2::canvas_debug_viewport_shadows(CanvasLight* p_lights_with_s
|
|
|
|
|
int h = 10;
|
|
|
|
|
int w = viewport.width;
|
|
|
|
|
int ofs = h;
|
|
|
|
|
|
|
|
|
|
//print_line(" debug lights ");
|
|
|
|
|
while(light) {
|
|
|
|
|
|
|
|
|
|
// print_line("debug light");
|
|
|
|
|
if (light->shadow_buffer.is_valid()) {
|
|
|
|
|
|
|
|
|
|
// print_line("sb is valid");
|
|
|
|
|
CanvasLightShadow * sb = canvas_light_shadow_owner.get(light->shadow_buffer);
|
|
|
|
|
if (sb) {
|
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
|
|
@ -9858,9 +9864,9 @@ void RasterizerGLES2::free(const RID& p_rid) {
|
|
|
|
|
glDeleteFramebuffers(1,&cls->fbo);
|
|
|
|
|
glDeleteRenderbuffers(1,&cls->rbo);
|
|
|
|
|
glDeleteTextures(1,&cls->depth);
|
|
|
|
|
if (!read_depth_supported) {
|
|
|
|
|
glDeleteTextures(1,&cls->rgba);
|
|
|
|
|
}
|
|
|
|
|
//if (!read_depth_supported) {
|
|
|
|
|
// glDeleteTextures(1,&cls->rgba);
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
canvas_light_shadow_owner.free(p_rid);
|
|
|
|
|
memdelete(cls);
|
|
|
|
|
@ -10366,6 +10372,62 @@ void RasterizerGLES2::_update_blur_buffer() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool RasterizerGLES2::_test_depth_shadow_buffer() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int size=16;
|
|
|
|
|
|
|
|
|
|
GLuint fbo;
|
|
|
|
|
GLuint rbo;
|
|
|
|
|
GLuint depth;
|
|
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
|
|
|
|
|
|
|
glGenFramebuffers(1, &fbo);
|
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
|
|
|
|
|
|
|
|
|
// Create a render buffer
|
|
|
|
|
glGenRenderbuffers(1, &rbo);
|
|
|
|
|
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
|
|
|
|
|
|
|
|
|
|
// Create a texture for storing the depth
|
|
|
|
|
glGenTextures(1, &depth);
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, depth);
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
|
|
|
|
|
|
// Remove artifact on the edges of the shadowmap
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// We'll use a depth texture to store the depths in the shadow map
|
|
|
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size, size, 0,
|
|
|
|
|
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
|
|
|
|
|
|
|
|
|
|
#ifdef GLEW_ENABLED
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Attach the depth texture to FBO depth attachment point
|
|
|
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
|
|
|
|
|
GL_TEXTURE_2D, depth, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
|
|
|
|
|
|
|
|
|
glDeleteFramebuffers(1,&fbo);
|
|
|
|
|
glDeleteRenderbuffers(1,&rbo);
|
|
|
|
|
glDeleteTextures(1,&depth);
|
|
|
|
|
|
|
|
|
|
return status == GL_FRAMEBUFFER_COMPLETE;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RasterizerGLES2::init() {
|
|
|
|
|
|
|
|
|
|
#ifdef GLEW_ENABLED
|
|
|
|
|
@ -10438,7 +10500,7 @@ void RasterizerGLES2::init() {
|
|
|
|
|
|
|
|
|
|
#ifdef GLEW_ENABLED
|
|
|
|
|
|
|
|
|
|
read_depth_supported=true;
|
|
|
|
|
|
|
|
|
|
pvr_supported=false;
|
|
|
|
|
etc_supported=false;
|
|
|
|
|
use_depth24 =true;
|
|
|
|
|
@ -10456,7 +10518,10 @@ void RasterizerGLES2::init() {
|
|
|
|
|
use_anisotropic_filter=true;
|
|
|
|
|
float_linear_supported=true;
|
|
|
|
|
float_supported=true;
|
|
|
|
|
use_rgba_shadowmaps=false;
|
|
|
|
|
|
|
|
|
|
read_depth_supported=_test_depth_shadow_buffer();
|
|
|
|
|
use_rgba_shadowmaps=!read_depth_supported;
|
|
|
|
|
//print_line("read depth support? "+itos(read_depth_supported));
|
|
|
|
|
|
|
|
|
|
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,&anisotropic_level);
|
|
|
|
|
anisotropic_level=MIN(anisotropic_level,float(GLOBAL_DEF("rasterizer/anisotropic_filter_level",4.0)));
|
|
|
|
|
|