|
@@ -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)));
|