git-svn-id: svn://db.shs.com.ru/libs@53 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -229,18 +229,22 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters &
|
||||
}
|
||||
|
||||
|
||||
void GLRendererBase::renderShadow(Light * l) {
|
||||
void GLRendererBase::renderShadow(Light * l, QGLShaderProgram * prog, QMatrix4x4 mat) {
|
||||
Camera cam;
|
||||
QVector3D wp = l->worldPos();
|
||||
cam.setPos(wp);
|
||||
cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction, 0).toVector3D()));
|
||||
cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction)).toVector3D());
|
||||
cam.setDepthStart(view.camera().depthStart());
|
||||
cam.setDepthEnd(view.camera().depthEnd());
|
||||
cam.setFOV(l->angle_end / 2.);
|
||||
cam.apply(1.);
|
||||
RenderingParameters rpl;
|
||||
rpl.pass = GLObjectBase::Solid;
|
||||
rpl.shaders = 0;
|
||||
rpl.shaders = prog;
|
||||
rpl.textures = rpl.light = rpl.fog = false;
|
||||
rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
|
||||
rpl.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
|
||||
l->shadow_matrix = mat * (rpl.proj_matrix * rpl.view_matrix);
|
||||
//glPushMatrix();
|
||||
renderSingleShadow(view.objects_, rpl);
|
||||
//glPopMatrix();
|
||||
@@ -251,11 +255,17 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters &
|
||||
if (!o.isInit())
|
||||
o.init();
|
||||
if (!o.visible_) return;
|
||||
setGLMatrix(rpl.view_matrix * o.itransform_);
|
||||
if (rpl.shaders) {
|
||||
//qDebug() << o.name() << curview << curview.determinant();
|
||||
setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * o.itransform_);
|
||||
} else {
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
setGLMatrix(rpl.view_matrix * o.itransform_);
|
||||
}
|
||||
glPolygonMode(GL_FRONT_AND_BACK, o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL));
|
||||
glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_);
|
||||
glPointSize(o.line_width > 0. ? o.line_width : view.lineWidth_);
|
||||
o.draw(0, true);
|
||||
o.draw((QGLShaderProgram*)rpl.shaders, true);
|
||||
foreach (GLObjectBase * i, o.children_)
|
||||
renderSingleShadow(*i, rpl);
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ protected:
|
||||
inline void applyFilteringParameters();
|
||||
void renderObjects(int pass, int light_pass, void * shaders = 0, bool textures = true, bool light = true, bool fog = true);
|
||||
void renderSingleObject(GLObjectBase & o, RenderingParameters & rpl);
|
||||
void renderShadow(Light * l);
|
||||
void renderShadow(Light * l, QGLShaderProgram * prog = 0, QMatrix4x4 mat = QMatrix4x4());
|
||||
void renderSingleShadow(GLObjectBase & o, RenderingParameters & rpl);
|
||||
|
||||
RenderingParameters rp;
|
||||
|
||||
@@ -65,7 +65,7 @@ const char qgl_structs[] =
|
||||
" float constantAttenuation;\n"
|
||||
" float linearAttenuation;\n"
|
||||
" float quadraticAttenuation;\n"
|
||||
" sampler2DShadow shadow;\n"
|
||||
" sampler2D shadow;\n"
|
||||
" mat4 shadowMatrix;\n"
|
||||
"};\n"
|
||||
"struct QGLMap {\n"
|
||||
|
||||
@@ -30,7 +30,8 @@ fbo_g(5, true, GL_RGBA16F), fbo_out(3, false, GL_RGB16F), fbo_hsmall(1, false, G
|
||||
<< ShaderPair("bloom_pass_0", &shader_bloom_0)
|
||||
<< ShaderPair("bloom_pass_1", &shader_bloom_1)
|
||||
<< ShaderPair("fbo_add", &shader_fbo_add)
|
||||
<< ShaderPair("motion_blur", &shader_motion_blur);
|
||||
<< ShaderPair("motion_blur", &shader_motion_blur)
|
||||
<< ShaderPair("shadow", &shader_shadow);
|
||||
for (int i = 0; i < shaders.size(); ++i)
|
||||
*(shaders[i].second) = 0;
|
||||
lights_per_pass = 2;
|
||||
@@ -63,6 +64,7 @@ void RendererDeferredShading::renderScene() {
|
||||
QMatrix4x4 mproj = rp.proj_matrix;
|
||||
QMatrix4x4 mproji = rp.proj_matrix_i;
|
||||
QMatrix4x4 mview = rp.view_matrix;
|
||||
QMatrix4x4 mprojviewi = rp.view_matrix_i * rp.proj_matrix_i;
|
||||
rp.prev_proj_matrix = prev_proj;
|
||||
rp.prev_view_matrix = prev_view;
|
||||
corner_dirs[0] = (QVector4D(-1, -1, 1, 1) * rp.viewproj_matrix).normalized();
|
||||
@@ -104,6 +106,7 @@ void RendererDeferredShading::renderScene() {
|
||||
//glReleaseShaders();
|
||||
fbo_g.release();
|
||||
|
||||
shader_shadow->bind();
|
||||
if (view.isFeatureEnabled(QGLView::qglShadowsEnabled)) {
|
||||
int sms = view.feature(QGLView::qglShadowsMapSize).toInt();
|
||||
glDisable(GL_TEXTURE_1D);
|
||||
@@ -123,8 +126,10 @@ void RendererDeferredShading::renderScene() {
|
||||
if (l->light_type == Light::Omni) continue;
|
||||
l->shadow_map.resize(sms, sms);
|
||||
l->shadow_map.bind();
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
renderShadow(l);
|
||||
l->shadow_map.setWriteBuffer(0);
|
||||
glClearFramebuffer();
|
||||
//glClear(GL_DEPTH_BUFFER_BIT);
|
||||
renderShadow(l, shader_shadow, mprojviewi);
|
||||
l->shadow_map.release();
|
||||
}
|
||||
}
|
||||
@@ -360,7 +365,7 @@ void RendererDeferredShading::setupDSLights(int pass, const QMatrix4x4 & view_ma
|
||||
for (int i = light_start; i < light_end; ++i) {
|
||||
lv << view.lights()[i];
|
||||
glActiveTextureChannel(shadow_start + i - light_start);
|
||||
glBindTexture(GL_TEXTURE_2D, lv.back()->shadow_map.depthTexture());
|
||||
glBindTexture(GL_TEXTURE_2D, lv.back()->shadow_map.colorTexture());
|
||||
}
|
||||
amb_light.setName("null");
|
||||
for (int i = light_end; i < lmax; ++i)
|
||||
|
||||
@@ -47,6 +47,7 @@ private:
|
||||
GLFramebuffer fbo_g, fbo_out, fbo_hsmall;
|
||||
QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;
|
||||
QGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add;
|
||||
QGLShaderProgram * shader_shadow;
|
||||
QVector<ShaderPair> shaders;
|
||||
|
||||
QMatrix4x4 prev_view, prev_proj;
|
||||
|
||||
@@ -92,6 +92,10 @@ void main(void) {
|
||||
qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texture(t_pp, tc).rgb;
|
||||
//qgl_FragData[0].rgb = vec3(abs(lpos.xyz - pos.xyz)/10);
|
||||
//qgl_FragData[0].rgb = vec3(ldist/1000);
|
||||
qgl_FragData[0].rgb = vec3(texture(qgl_Light[0].shadow, vec3(qgl_FragTexture.xy, 0.))*1000+0.5);
|
||||
vec2 shp = (vec4(qgl_FragTexture.xy, 1, 1) *transpose(qgl_Light[0].shadowMatrix)).xy;
|
||||
float shd = 1./texture(qgl_Light[0].shadow, shp).r;
|
||||
shd = shd*shd;// - ldist;
|
||||
qgl_FragData[0].rgb = vec3(abs(shd)/1000000);
|
||||
//qgl_FragData[0].rgb = vec3(*1000);
|
||||
//qgl_FragData[0].a = 0.;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#version 130
|
||||
#version 150
|
||||
|
||||
in vec4 pos;
|
||||
|
||||
void main(void) {
|
||||
gl_FragColor.r = 1. / gl_FragCoord.w;
|
||||
qgl_FragData[0].r = 1. / pos.w;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#version 130
|
||||
#version 150
|
||||
|
||||
out vec4 pos;
|
||||
|
||||
void main(void) {
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||
gl_Position = ftransform();
|
||||
pos = qgl_ftransform();
|
||||
qgl_FragTexture = qgl_Texture;
|
||||
gl_Position = pos;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user