read depth fixes
This commit is contained in:
parent
ad634876b5
commit
7fc4059b13
4 changed files with 73 additions and 7 deletions
|
@ -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)));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue