read depth fixes

This commit is contained in:
Juan Linietsky 2015-03-31 17:57:16 -03:00
parent ad634876b5
commit 7fc4059b13
4 changed files with 73 additions and 7 deletions

View file

@ -8559,6 +8559,7 @@ RID RasterizerGLES2::canvas_light_shadow_buffer_create(int p_width) {
#ifdef GLEW_ENABLED #ifdef GLEW_ENABLED
glDrawBuffer(GL_NONE); glDrawBuffer(GL_NONE);
#endif #endif
} else { } else {
// We'll use a RGBA texture into which we pack the depth info // 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, 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 // Attach the RGBA texture to FBO color attachment point
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, cls->depth, 0); GL_TEXTURE_2D, cls->depth, 0);
cls->rgba=cls->depth;
// Allocate 16-bit depth buffer // Allocate 16-bit depth buffer
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, cls->size, cls->height); 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 h = 10;
int w = viewport.width; int w = viewport.width;
int ofs = h; int ofs = h;
//print_line(" debug lights ");
while(light) { while(light) {
// print_line("debug light");
if (light->shadow_buffer.is_valid()) { if (light->shadow_buffer.is_valid()) {
// print_line("sb is valid");
CanvasLightShadow * sb = canvas_light_shadow_owner.get(light->shadow_buffer); CanvasLightShadow * sb = canvas_light_shadow_owner.get(light->shadow_buffer);
if (sb) { if (sb) {
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
@ -9858,9 +9864,9 @@ void RasterizerGLES2::free(const RID& p_rid) {
glDeleteFramebuffers(1,&cls->fbo); glDeleteFramebuffers(1,&cls->fbo);
glDeleteRenderbuffers(1,&cls->rbo); glDeleteRenderbuffers(1,&cls->rbo);
glDeleteTextures(1,&cls->depth); glDeleteTextures(1,&cls->depth);
if (!read_depth_supported) { //if (!read_depth_supported) {
glDeleteTextures(1,&cls->rgba); // glDeleteTextures(1,&cls->rgba);
} //}
canvas_light_shadow_owner.free(p_rid); canvas_light_shadow_owner.free(p_rid);
memdelete(cls); memdelete(cls);
@ -10366,6 +10372,62 @@ void RasterizerGLES2::_update_blur_buffer() {
} }
#endif #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() { void RasterizerGLES2::init() {
#ifdef GLEW_ENABLED #ifdef GLEW_ENABLED
@ -10438,7 +10500,7 @@ void RasterizerGLES2::init() {
#ifdef GLEW_ENABLED #ifdef GLEW_ENABLED
read_depth_supported=true;
pvr_supported=false; pvr_supported=false;
etc_supported=false; etc_supported=false;
use_depth24 =true; use_depth24 =true;
@ -10456,7 +10518,10 @@ void RasterizerGLES2::init() {
use_anisotropic_filter=true; use_anisotropic_filter=true;
float_linear_supported=true; float_linear_supported=true;
float_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); glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,&anisotropic_level);
anisotropic_level=MIN(anisotropic_level,float(GLOBAL_DEF("rasterizer/anisotropic_filter_level",4.0))); anisotropic_level=MIN(anisotropic_level,float(GLOBAL_DEF("rasterizer/anisotropic_filter_level",4.0)));

View file

@ -1288,6 +1288,7 @@ class RasterizerGLES2 : public Rasterizer {
void _copy_screen_quad(); void _copy_screen_quad();
void _copy_to_texscreen(); void _copy_to_texscreen();
bool _test_depth_shadow_buffer();
Vector3 chunk_vertex; Vector3 chunk_vertex;
Vector3 chunk_normal; Vector3 chunk_normal;

View file

@ -24,7 +24,7 @@ def get_opts():
('NDK_TOOLCHAIN', 'toolchain to use for the NDK',"arm-eabi-4.4.0"), ('NDK_TOOLCHAIN', 'toolchain to use for the NDK',"arm-eabi-4.4.0"),
#android 2.3 #android 2.3
('ndk_platform', 'compile for platform: (2.2,2.3)',"2.2"), ('ndk_platform', 'compile for platform: (2.2,2.3)',"2.2"),
('NDK_TARGET', 'toolchain to use for the NDK',"arm-linux-androideabi-4.9"), ('NDK_TARGET', 'toolchain to use for the NDK',"arm-linux-androideabi-4.8"),
('android_stl','enable STL support in android port (for modules)','no'), ('android_stl','enable STL support in android port (for modules)','no'),
('armv6','compile for older phones running arm v6 (instead of v7+neon+smp)','no'), ('armv6','compile for older phones running arm v6 (instead of v7+neon+smp)','no'),
('x86','Xompile for Android-x86','no') ('x86','Xompile for Android-x86','no')

View file

@ -7155,7 +7155,7 @@ void VisualServerRaster::_draw_viewport(Viewport *p_viewport,int p_ofs_x, int p_
} }
//rasterizer->canvas_debug_viewport_shadows(lights_with_shadow); // rasterizer->canvas_debug_viewport_shadows(lights_with_shadow);
} }
//capture //capture