mirror of
https://github.com/godotengine/godot.git
synced 2024-11-15 16:43:10 +00:00
Strive for maximum compatibility in GLES2 regarding depth buffers.
This commit is contained in:
parent
2363c38d87
commit
8799f69b2c
@ -83,7 +83,11 @@ void RasterizerSceneGLES2::shadow_atlas_set_size(RID p_atlas, int p_size) {
|
||||
|
||||
// erase the old atlast
|
||||
if (shadow_atlas->fbo) {
|
||||
glDeleteTextures(1, &shadow_atlas->depth);
|
||||
if (storage->config.use_rgba_3d_shadows) {
|
||||
glDeleteRenderbuffers(1, &shadow_atlas->depth);
|
||||
} else {
|
||||
glDeleteTextures(1, &shadow_atlas->depth);
|
||||
}
|
||||
glDeleteFramebuffers(1, &shadow_atlas->fbo);
|
||||
if (shadow_atlas->color) {
|
||||
glDeleteTextures(1, &shadow_atlas->color);
|
||||
@ -111,18 +115,15 @@ void RasterizerSceneGLES2::shadow_atlas_set_size(RID p_atlas, int p_size) {
|
||||
|
||||
// create a depth texture
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glGenTextures(1, &shadow_atlas->depth);
|
||||
glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, storage->config.depth_internalformat, shadow_atlas->size, shadow_atlas->size, 0, GL_DEPTH_COMPONENT, storage->config.depth_type, NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadow_atlas->depth, 0);
|
||||
|
||||
if (storage->config.use_rgba_3d_shadows) {
|
||||
|
||||
//maximum compatibility, renderbuffer and RGBA shadow
|
||||
glGenRenderbuffers(1, &shadow_atlas->depth);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, directional_shadow.depth);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, storage->config.depth_internalformat, shadow_atlas->size, shadow_atlas->size);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, shadow_atlas->depth);
|
||||
|
||||
glGenTextures(1, &shadow_atlas->color);
|
||||
glBindTexture(GL_TEXTURE_2D, shadow_atlas->color);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, shadow_atlas->size, shadow_atlas->size, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
@ -131,6 +132,18 @@ void RasterizerSceneGLES2::shadow_atlas_set_size(RID p_atlas, int p_size) {
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, shadow_atlas->color, 0);
|
||||
} else {
|
||||
//just depth texture
|
||||
glGenTextures(1, &shadow_atlas->depth);
|
||||
glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, storage->config.depth_internalformat, shadow_atlas->size, shadow_atlas->size, 0, GL_DEPTH_COMPONENT, storage->config.depth_type, NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadow_atlas->depth, 0);
|
||||
}
|
||||
glViewport(0, 0, shadow_atlas->size, shadow_atlas->size);
|
||||
|
||||
@ -475,7 +488,8 @@ RID RasterizerSceneGLES2::reflection_probe_instance_create(RID p_probe) {
|
||||
glGenTextures(1, &rpi->color[i]);
|
||||
}
|
||||
|
||||
glGenTextures(1, &rpi->depth);
|
||||
glGenRenderbuffers(1, &rpi->depth);
|
||||
|
||||
rpi->cubemap = 0;
|
||||
//glGenTextures(1, &rpi->cubemap);
|
||||
|
||||
@ -524,8 +538,8 @@ bool RasterizerSceneGLES2::reflection_probe_instance_begin_render(RID p_instance
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, rpi->depth);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, storage->config.depth_internalformat, size, size, 0, GL_DEPTH_COMPONENT, storage->config.depth_type, NULL);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rpi->depth);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, storage->config.depth_internalformat, size, size);
|
||||
|
||||
if (rpi->cubemap != 0) {
|
||||
glDeleteTextures(1, &rpi->cubemap);
|
||||
@ -547,7 +561,7 @@ bool RasterizerSceneGLES2::reflection_probe_instance_begin_render(RID p_instance
|
||||
glBindTexture(GL_TEXTURE_2D, rpi->color[i]);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, internal_format, size, size, 0, format, type, NULL);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rpi->color[i], 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rpi->depth, 0);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rpi->depth);
|
||||
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||
ERR_CONTINUE(status != GL_FRAMEBUFFER_COMPLETE);
|
||||
}
|
||||
@ -566,8 +580,6 @@ bool RasterizerSceneGLES2::reflection_probe_instance_begin_render(RID p_instance
|
||||
//adjust framebuffer
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, rpi->fbo[i]);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, _cube_side_enum[i], rpi->cubemap, 0);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rpi->depth);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, size, size); // Note: used to be _DEPTH_COMPONENT24_OES. GL_DEPTH_COMPONENT untested.
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rpi->depth);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
@ -2977,7 +2989,7 @@ void RasterizerSceneGLES2::render_shadow(RID p_light, RID p_shadow_atlas, int p_
|
||||
|
||||
if (light->type == VS::LIGHT_OMNI) {
|
||||
// cubemap only
|
||||
if (light->omni_shadow_mode == VS::LIGHT_OMNI_SHADOW_CUBE && storage->config.support_write_depth) {
|
||||
if (light->omni_shadow_mode == VS::LIGHT_OMNI_SHADOW_CUBE && storage->config.support_shadow_cubemaps) {
|
||||
int cubemap_index = shadow_cubemaps.size() - 1;
|
||||
|
||||
// find an appropriate cubemap to render to
|
||||
@ -3075,7 +3087,7 @@ void RasterizerSceneGLES2::render_shadow(RID p_light, RID p_shadow_atlas, int p_
|
||||
state.scene_shader.set_conditional(SceneShaderGLES2::RENDER_DEPTH_DUAL_PARABOLOID, false);
|
||||
|
||||
// convert cubemap to dual paraboloid if needed
|
||||
if (light->type == VS::LIGHT_OMNI && (light->omni_shadow_mode == VS::LIGHT_OMNI_SHADOW_CUBE && storage->config.support_write_depth) && p_pass == 5) {
|
||||
if (light->type == VS::LIGHT_OMNI && (light->omni_shadow_mode == VS::LIGHT_OMNI_SHADOW_CUBE && storage->config.support_shadow_cubemaps) && p_pass == 5) {
|
||||
ShadowAtlas *shadow_atlas = shadow_atlas_owner.getornull(p_shadow_atlas);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, shadow_atlas->fbo);
|
||||
@ -3172,7 +3184,7 @@ bool RasterizerSceneGLES2::free(RID p_rid) {
|
||||
if (reflection_instance->cubemap != 0) {
|
||||
glDeleteTextures(1, &reflection_instance->cubemap);
|
||||
}
|
||||
glDeleteTextures(1, &reflection_instance->depth);
|
||||
glDeleteRenderbuffers(1, &reflection_instance->depth);
|
||||
|
||||
reflection_probe_release_atlas_index(p_rid);
|
||||
reflection_probe_instance_owner.free(p_rid);
|
||||
@ -3253,7 +3265,7 @@ void RasterizerSceneGLES2::initialize() {
|
||||
}
|
||||
|
||||
// cubemaps for shadows
|
||||
if (storage->config.support_write_depth) { //not going to be used
|
||||
if (storage->config.support_shadow_cubemaps) { //not going to be used
|
||||
int max_shadow_cubemap_sampler_size = 512;
|
||||
|
||||
int cube_size = max_shadow_cubemap_sampler_size;
|
||||
@ -3302,19 +3314,13 @@ void RasterizerSceneGLES2::initialize() {
|
||||
glGenFramebuffers(1, &directional_shadow.fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, directional_shadow.fbo);
|
||||
|
||||
glGenTextures(1, &directional_shadow.depth);
|
||||
glBindTexture(GL_TEXTURE_2D, directional_shadow.depth);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, storage->config.depth_internalformat, directional_shadow.size, directional_shadow.size, 0, GL_DEPTH_COMPONENT, storage->config.depth_type, NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, directional_shadow.depth, 0);
|
||||
|
||||
if (storage->config.use_rgba_3d_shadows) {
|
||||
//maximum compatibility, renderbuffer and RGBA shadow
|
||||
glGenRenderbuffers(1, &directional_shadow.depth);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, directional_shadow.depth);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, storage->config.depth_internalformat, directional_shadow.size, directional_shadow.size);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, directional_shadow.depth);
|
||||
|
||||
glGenTextures(1, &directional_shadow.color);
|
||||
glBindTexture(GL_TEXTURE_2D, directional_shadow.color);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, directional_shadow.size, directional_shadow.size, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
@ -3323,6 +3329,19 @@ void RasterizerSceneGLES2::initialize() {
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, directional_shadow.color, 0);
|
||||
} else {
|
||||
//just a depth buffer
|
||||
glGenTextures(1, &directional_shadow.depth);
|
||||
glBindTexture(GL_TEXTURE_2D, directional_shadow.depth);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, storage->config.depth_internalformat, directional_shadow.size, directional_shadow.size, 0, GL_DEPTH_COMPONENT, storage->config.depth_type, NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, directional_shadow.depth, 0);
|
||||
}
|
||||
|
||||
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||
|
@ -475,7 +475,7 @@ public:
|
||||
virtual void light_instance_set_transform(RID p_light_instance, const Transform &p_transform);
|
||||
virtual void light_instance_set_shadow_transform(RID p_light_instance, const CameraMatrix &p_projection, const Transform &p_transform, float p_far, float p_split, int p_pass, float p_bias_scale = 1.0);
|
||||
virtual void light_instance_mark_visible(RID p_light_instance);
|
||||
virtual bool light_instances_can_render_shadow_cube() const { return storage->config.support_write_depth; }
|
||||
virtual bool light_instances_can_render_shadow_cube() const { return storage->config.support_shadow_cubemaps; }
|
||||
|
||||
LightInstance **render_light_instances;
|
||||
int render_directional_lights;
|
||||
|
@ -1308,7 +1308,19 @@ void RasterizerStorageGLES2::_update_shader(Shader *p_shader) const {
|
||||
actions->uniforms = &p_shader->uniforms;
|
||||
|
||||
if (p_shader->spatial.uses_screen_texture && p_shader->spatial.uses_depth_texture) {
|
||||
WARN_PRINT("Using both SCREEN_TEXTURE and DEPTH_TEXTURE is not supported in GLES2");
|
||||
static bool show_warning = true; //show warning only once
|
||||
if (show_warning) {
|
||||
ERR_PRINT("Using both SCREEN_TEXTURE and DEPTH_TEXTURE is not supported in GLES2");
|
||||
show_warning = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (p_shader->spatial.uses_depth_texture && !config.support_depth_texture) {
|
||||
static bool show_warning = true; //show warning only once
|
||||
if (show_warning) {
|
||||
ERR_PRINT("Using DEPTH_TEXTURE is not permitted on this hardware, operation will fail.");
|
||||
show_warning = false;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
|
||||
@ -4306,24 +4318,36 @@ void RasterizerStorageGLES2::_render_target_allocate(RenderTarget *rt) {
|
||||
|
||||
// depth
|
||||
|
||||
glGenTextures(1, &rt->depth);
|
||||
glBindTexture(GL_TEXTURE_2D, rt->depth);
|
||||
if (config.support_depth_texture) {
|
||||
glGenTextures(1, &rt->depth);
|
||||
glBindTexture(GL_TEXTURE_2D, rt->depth);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, config.depth_internalformat, rt->width, rt->height, 0, GL_DEPTH_COMPONENT, config.depth_type, NULL);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, config.depth_internalformat, rt->width, rt->height, 0, GL_DEPTH_COMPONENT, config.depth_type, NULL);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0);
|
||||
} else {
|
||||
glGenRenderbuffers(1, &rt->depth);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rt->depth);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, config.depth_internalformat, rt->width, rt->height);
|
||||
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth);
|
||||
}
|
||||
|
||||
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||
|
||||
if (status != GL_FRAMEBUFFER_COMPLETE) {
|
||||
|
||||
glDeleteFramebuffers(1, &rt->fbo);
|
||||
glDeleteTextures(1, &rt->depth);
|
||||
if (config.support_depth_texture) {
|
||||
glDeleteTextures(1, &rt->depth);
|
||||
} else {
|
||||
glDeleteRenderbuffers(1, &rt->depth);
|
||||
}
|
||||
glDeleteTextures(1, &rt->color);
|
||||
rt->fbo = 0;
|
||||
rt->width = 0;
|
||||
@ -4395,7 +4419,12 @@ void RasterizerStorageGLES2::_render_target_clear(RenderTarget *rt) {
|
||||
}
|
||||
|
||||
if (rt->depth) {
|
||||
glDeleteTextures(1, &rt->depth);
|
||||
if (config.support_depth_texture) {
|
||||
glDeleteTextures(1, &rt->depth);
|
||||
} else {
|
||||
glDeleteRenderbuffers(1, &rt->depth);
|
||||
}
|
||||
|
||||
rt->depth = 0;
|
||||
}
|
||||
|
||||
@ -4533,17 +4562,10 @@ RID RasterizerStorageGLES2::canvas_light_shadow_buffer_create(int p_width) {
|
||||
glGenFramebuffers(1, &cls->fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
|
||||
|
||||
glGenTextures(1, &cls->depth);
|
||||
glBindTexture(GL_TEXTURE_2D, cls->depth);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, config.depth_internalformat, cls->size, cls->height, 0, GL_DEPTH_COMPONENT, config.depth_type, NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, cls->depth, 0);
|
||||
glGenRenderbuffers(1, &cls->depth);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, cls->depth);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, config.depth_internalformat, cls->size, cls->height);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, cls->depth);
|
||||
|
||||
glGenTextures(1, &cls->distance);
|
||||
glBindTexture(GL_TEXTURE_2D, cls->distance);
|
||||
@ -4908,7 +4930,7 @@ bool RasterizerStorageGLES2::free(RID p_rid) {
|
||||
|
||||
CanvasLightShadow *cls = canvas_light_shadow_owner.get(p_rid);
|
||||
glDeleteFramebuffers(1, &cls->fbo);
|
||||
glDeleteTextures(1, &cls->depth);
|
||||
glDeleteRenderbuffers(1, &cls->depth);
|
||||
glDeleteTextures(1, &cls->distance);
|
||||
canvas_light_shadow_owner.free(p_rid);
|
||||
memdelete(cls);
|
||||
@ -4986,21 +5008,17 @@ void RasterizerStorageGLES2::initialize() {
|
||||
config.pvrtc_supported = config.extensions.has("IMG_texture_compression_pvrtc");
|
||||
config.support_npot_repeat_mipmap = config.extensions.has("GL_OES_texture_npot");
|
||||
|
||||
if (config.extensions.has("GL_OES_depth24")) {
|
||||
config.depth_internalformat = _DEPTH_COMPONENT24_OES;
|
||||
config.depth_type = GL_UNSIGNED_INT;
|
||||
} else {
|
||||
config.depth_internalformat = GL_DEPTH_COMPONENT16;
|
||||
config.depth_type = GL_UNSIGNED_SHORT;
|
||||
}
|
||||
|
||||
#endif
|
||||
#ifdef GLES_OVER_GL
|
||||
config.use_rgba_2d_shadows = false;
|
||||
config.support_depth_texture = true;
|
||||
config.use_rgba_3d_shadows = false;
|
||||
config.support_depth_cubemaps = true;
|
||||
#else
|
||||
config.use_rgba_2d_shadows = !(config.float_texture_supported && config.extensions.has("GL_EXT_texture_rg"));
|
||||
config.use_rgba_3d_shadows = config.extensions.has("GL_OES_depth_texture");
|
||||
config.support_depth_texture = config.extensions.has("GL_OES_depth_texture");
|
||||
config.use_rgba_3d_shadows = !config.support_depth_texture;
|
||||
config.support_depth_cubemaps = config.extensions.has("GL_OES_depth_texture_cube_map");
|
||||
#endif
|
||||
|
||||
#ifdef GLES_OVER_GL
|
||||
@ -5024,6 +5042,55 @@ void RasterizerStorageGLES2::initialize() {
|
||||
config.support_half_float_vertices = true;
|
||||
#endif
|
||||
|
||||
//determine formats for depth textures (or renderbuffers)
|
||||
if (config.support_depth_texture) {
|
||||
// Will use texture for depth
|
||||
// have to manually see if we can create a valid framebuffer texture using UNSIGNED_INT,
|
||||
// as there is no extension to test for this.
|
||||
GLuint fbo;
|
||||
glGenFramebuffers(1, &fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
||||
GLuint depth;
|
||||
glGenTextures(1, &depth);
|
||||
glBindTexture(GL_TEXTURE_2D, depth);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 32, 32, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0);
|
||||
|
||||
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||
|
||||
if (status == GL_FRAMEBUFFER_COMPLETE) {
|
||||
config.depth_internalformat = GL_DEPTH_COMPONENT;
|
||||
config.depth_type = GL_UNSIGNED_INT;
|
||||
} else {
|
||||
config.depth_internalformat = GL_DEPTH_COMPONENT16;
|
||||
config.depth_type = GL_UNSIGNED_SHORT;
|
||||
}
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, system_fbo);
|
||||
glDeleteFramebuffers(1, &fbo);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glDeleteTextures(1, &depth);
|
||||
|
||||
} else {
|
||||
// Will use renderbuffer for depth
|
||||
if (config.extensions.has("GL_OES_depth24")) {
|
||||
config.depth_internalformat = _DEPTH_COMPONENT24_OES;
|
||||
config.depth_type = GL_UNSIGNED_INT;
|
||||
} else {
|
||||
config.depth_internalformat = GL_DEPTH_COMPONENT16;
|
||||
config.depth_type = GL_UNSIGNED_SHORT;
|
||||
}
|
||||
}
|
||||
|
||||
//picky requirements for these
|
||||
config.support_shadow_cubemaps = config.support_depth_texture && config.support_write_depth && config.support_depth_cubemaps;
|
||||
|
||||
frame.count = 0;
|
||||
frame.delta = 0;
|
||||
frame.current_rt = NULL;
|
||||
|
@ -85,6 +85,10 @@ public:
|
||||
bool support_write_depth;
|
||||
bool support_half_float_vertices;
|
||||
bool support_npot_repeat_mipmap;
|
||||
bool support_depth_texture;
|
||||
bool support_depth_cubemaps;
|
||||
|
||||
bool support_shadow_cubemaps;
|
||||
|
||||
GLuint depth_internalformat;
|
||||
GLuint depth_type;
|
||||
|
Loading…
Reference in New Issue
Block a user