shadows done

This commit is contained in:
2023-02-17 14:51:27 +03:00
parent 3c9386de63
commit eb5f50fc9d
6 changed files with 124 additions and 88 deletions

View File

@@ -88,6 +88,10 @@ bool Texture2DArray::resize(QOpenGLExtraFunctions * f, QSize new_size, int layer
bformat = GL_RED;
btype = GL_FLOAT;
}
if (format_ == GL_DEPTH_COMPONENT || format_ == GL_DEPTH_COMPONENT16 || format_ == GL_DEPTH_COMPONENT24 ||
format_ == GL_DEPTH_COMPONENT32) {
bformat = GL_DEPTH_COMPONENT;
}
f->glTexImage3D(target_, 0, format_, size_.width(), size_.height(), layers_, 0, bformat, btype, nullptr);
return true;
}

View File

@@ -69,6 +69,7 @@ Renderer::Renderer(QGLView * view_)
cam_light = new Light();
cam_light->intensity = 0.75;
cam_light->setName("Camera_Light");
cam_light->setCastShadows(false);
shader_files[srSelectionFill] = "selection.glsl";
shader_files[srSelectionHalo] = "selection_halo.glsl";
@@ -151,7 +152,7 @@ void Renderer::reloadShaders() {
shader_fxaa = nullptr;
if (tone_proc.shader_sum) delete tone_proc.shader_sum;
tone_proc.shader_sum = nullptr;
QString dir = "./shaders/";
QString dir = ":/shaders/";
while (it.hasNext()) {
it.next();
loadShadersMulti(shaders[it.key()], dir + it.value(), true, shader_defines.value(it.key()));
@@ -362,7 +363,14 @@ void Renderer::renderConeShadows() {
textures_empty.bind(f, tarEmpty);
textures_maps.bind(f, tarMaps);
auto cone_ll = cur_lights.value(Light::Cone);
shadow_maps_cone.resize(f, view->shadow_map_size, cone_ll.size());
if (shadow_maps_cone.resize(f, view->shadow_map_size, cone_ll.size())) {
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
}
for (int i = 0; i < cone_ll.size(); ++i) {
Light * l = cone_ll[i];
QMatrix4x4 pm = glMatrixPerspective(l->angle_end, 1., 0.1), om, vm;
@@ -391,7 +399,15 @@ void Renderer::renderOmniShadows() {
textures_empty.bind(f, tarEmpty);
textures_maps.bind(f, tarMaps);
auto omni_ll = cur_lights.value(Light::Omni);
shadow_maps_omni.resize(f, view->shadow_map_size, omni_ll.size());
if (shadow_maps_omni.resize(f, view->shadow_map_size, omni_ll.size())) {
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
// f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
}
for (int i = 0; i < omni_ll.size(); ++i) {
Light * l = omni_ll[i];
QMatrix4x4 om;
@@ -417,8 +433,9 @@ void Renderer::renderConeShadow(int index, Light * light) {
light->shadow_map.resize(view->shadow_map_size, force_resize);
light->shadow_map.bind();
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, shadow_maps_cone.ID(), 0, index);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadow_maps_cone.ID(), 0, index);
// glDrawBuffer(GL_COLOR_ATTACHMENT0);
// glClearDepth(0.);
glClearFramebuffer();
renderObjects(scene, rpSolid);
light->shadow_map.release();
@@ -439,7 +456,7 @@ void Renderer::renderOmniShadow(int index, Light * light, QOpenGLShaderProgram *
QMatrix4x4 vm = mat_proj_90 * mat_faces[i] * om;
prog->setUniformValue("qgl_ViewProjMatrix", vm);
int buff_ind = GL_COLOR_ATTACHMENT0 + i;
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, buff_ind, shadow_maps_omni.ID(), 0, index * 6 + i);
view->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadow_maps_omni.ID(), 0, index * 6 + i);
// static GLenum faces[6] = {GL_COLOR_ATTACHMENT0,
// GL_COLOR_ATTACHMENT1,
// GL_COLOR_ATTACHMENT2,
@@ -447,7 +464,7 @@ void Renderer::renderOmniShadow(int index, Light * light, QOpenGLShaderProgram *
// GL_COLOR_ATTACHMENT4,
// GL_COLOR_ATTACHMENT5};
// view->glDrawBuffers(6, faces);
glDrawBuffer(buff_ind);
// glDrawBuffer(buff_ind);
glClearFramebuffer();
renderObjects(scene, rpSolid);
}
@@ -665,7 +682,8 @@ void Renderer::renderScene() {
tprog->bind();
shadow_maps_cone.bind(f, tarShadowsCone);
shadow_maps_omni.bind(f, tarShadowsOmni);
quad->draw(f, 1);*/
quad->draw(f, 1);
*/
}

View File

@@ -37,8 +37,8 @@ RendererBase::RendererBase(QGLView * view_)
, buffer_lights_pos(GL_UNIFORM_BUFFER, GL_STREAM_DRAW)
, textures_empty(GL_RGBA, false)
, textures_maps(GL_RGBA, true)
, shadow_maps_cone(GL_R32F, false)
, shadow_maps_omni(GL_R32F, false) {
, shadow_maps_cone(GL_DEPTH_COMPONENT, false)
, shadow_maps_omni(GL_DEPTH_COMPONENT, false) {
textures_manager = new TextureManager(view);
maps_size = QSize(1024, 1024);
maps_hash = 0;
@@ -64,6 +64,16 @@ void RendererBase::initTextureArrays() {
textures_empty.load(f, im, emrBlue);
shadow_maps_cone.init(f);
shadow_maps_omni.init(f);
shadow_maps_cone.bind(f, tarShadowsCone);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
f->glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
shadow_maps_omni.bind(f, tarShadowsOmni);
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
f->glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
}

View File

@@ -596,7 +596,7 @@ void AimedObject::orbitXY(const float & a) {
void AimedObject::transformChanged() {}
Light::Light(const QVector3D & p, const QColor & c, float i): AimedObject(), shadow_map(nullptr, 0, true, GL_R32F) {
Light::Light(const QVector3D & p, const QColor & c, float i): AimedObject(), shadow_map(nullptr, 0, false) {
type_ = glLight;
light_type = Omni;
intensity = i;