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
|
||||
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)));
|
||||
|
|
|
@ -1288,6 +1288,7 @@ class RasterizerGLES2 : public Rasterizer {
|
|||
void _copy_screen_quad();
|
||||
void _copy_to_texscreen();
|
||||
|
||||
bool _test_depth_shadow_buffer();
|
||||
|
||||
Vector3 chunk_vertex;
|
||||
Vector3 chunk_normal;
|
||||
|
|
|
@ -24,7 +24,7 @@ def get_opts():
|
|||
('NDK_TOOLCHAIN', 'toolchain to use for the NDK',"arm-eabi-4.4.0"),
|
||||
#android 2.3
|
||||
('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'),
|
||||
('armv6','compile for older phones running arm v6 (instead of v7+neon+smp)','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
|
||||
|
|
Loading…
Reference in a new issue