[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50032] branches/ge_harmony/source: Rendering point lights as spheres instead of full screen quads for performance improvements .
Daniel Stokes
kupomail at gmail.com
Mon Aug 20 01:55:38 CEST 2012
Revision: 50032
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50032
Author: kupoman
Date: 2012-08-19 23:55:37 +0000 (Sun, 19 Aug 2012)
Log Message:
-----------
Rendering point lights as spheres instead of full screen quads for performance improvements. This also means all point lights are now treated as having the sphere option enabled.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp
branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2012-08-19 23:55:37 UTC (rev 50032)
@@ -1,3 +1,5 @@
+#version 120
+
#define SPOT 0
#define SUN 1
#define HEMI 2
@@ -28,18 +30,18 @@
uniform sampler2D prepass2;
uniform vec2 magic;
+uniform vec2 bounds;
void main()
{
-
vec3 L;
float attenuation = 1.0;
- vec3 N = normalize(texture2D(prepass1, gl_TexCoord[0].st).rgb);
+ vec3 N = normalize(texture2D(prepass1, gl_FragCoord.xy/bounds.xy).rgb);
vec3 V;
// V.z = texture2D(prepass1, gl_TexCoord[0].st).a;
// V.xy = V.zz * magic * varposition.xy;
- V = texture2D(prepass2, gl_TexCoord[0].st).rgb;
+ V = texture2D(prepass2, gl_FragCoord.xy/bounds.xy).rgb;
if (light.type == SUN || light.type == HEMI)
L = light.vector;
@@ -56,6 +58,8 @@
attenuation = light.dist/(light.dist + light.att[0]*dist);
attenuation *= distkw/(distkw + light.att[1]*dist*dist);
}
+
+ attenuation *= max((light.dist - dist), 0.0)/light.dist;
}
vec3 H = normalize(L - V);
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2012-08-19 23:55:37 UTC (rev 50032)
@@ -1316,9 +1316,11 @@
#endif
// prepass
+ m_rasterizer->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
m_rasterizer->BeginPrePass();
scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
m_rasterizer->EndPrePass();
+ m_rasterizer->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_DISABLED);
// light pass
m_rasterizer->BeginLightPass();
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp 2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp 2012-08-19 23:55:37 UTC (rev 50032)
@@ -173,8 +173,6 @@
{
BucketList::iterator bit;
- rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
-
for (bit = m_SolidBuckets.begin(); bit != m_SolidBuckets.end(); ++bit) {
#if 1
RAS_MaterialBucket* bucket = *bit;
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2012-08-19 23:55:37 UTC (rev 50032)
@@ -169,10 +169,42 @@
m_light_shader = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
+ init_sphere();
+
return true;
}
+void RAS_OpenGLRasterizer::init_sphere()
+{
+ //radius == 1
+ int rings = 16;
+ int sectors = 16;
+ float R = 1./(rings-1);
+ float S = 1./(sectors-1);
+ int r, s;
+
+ m_sphere_vertices = new float[rings * sectors * 3];
+ m_sphere_indices = new unsigned short[rings * sectors * 4];
+ m_sphere_size = rings*sectors*4;
+
+ int v=0, i=0;
+ for (r = 0; r < rings; r++) {
+ for (s = 0; s < sectors; s++) {
+ m_sphere_vertices[v++] = cos(2*M_PI * s * S) * sin(M_PI * r * R);
+ m_sphere_vertices[v++] = sin(-M_PI/2 + M_PI * r * R);
+ m_sphere_vertices[v++] = sin(2*M_PI * s * S) * sin(M_PI * r * R);
+
+ m_sphere_indices[i++] = r * sectors + s;
+ m_sphere_indices[i++] = r * sectors + (s+1);
+ m_sphere_indices[i++] = (r+1) * sectors + (s+1);
+ m_sphere_indices[i++] = (r+1) * sectors + s;
+ }
+ }
+
+}
+
+
void RAS_OpenGLRasterizer::SetAmbientColor(float red, float green, float blue)
{
m_ambr = red;
@@ -310,6 +342,9 @@
glDeleteTextures(2, m_prepass_target);
glDeleteTextures(1, &m_depth_target);
glDeleteFramebuffersEXT(1, &m_fbo);
+
+ delete m_sphere_vertices;
+ delete m_sphere_indices;
EndFrame();
}
@@ -1422,7 +1457,7 @@
void RAS_OpenGLRasterizer::BeginLightPass()
{
int bind;
- glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
+ glPushAttrib(GL_COLOR_BUFFER_BIT);
bind = GPU_texture_opengl_bindcode(m_light_target);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, bind, 0);
GLenum targets[1] = {GL_COLOR_ATTACHMENT0_EXT};
@@ -1432,18 +1467,10 @@
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
- // in case the previous material was wire
glPolygonMode(GL_FRONT, GL_FILL);
- glPushMatrix(); //GL_MODELVIEW
- glLoadIdentity(); // GL_MODELVIEW
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glViewport(0, 0, m_width, m_height);
-
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
@@ -1462,14 +1489,18 @@
m_magic[0] = -1/m_projmatrix[0][0];
m_magic[1] = -1/m_projmatrix[1][1];
+
+ bind = GPU_shader_get_uniform(m_light_shader, "magic");
+ GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, m_magic);
+
+ float bounds[2] = {m_width, m_height};
+ bind = GPU_shader_get_uniform(m_light_shader, "bounds");
+ GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, bounds);
}
void RAS_OpenGLRasterizer::RenderLight(RAS_LightObject *light)
{
int bind;
- bind = GPU_shader_get_uniform(m_light_shader, "magic");
- GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, m_magic);
-
bind = GPU_shader_get_uniform(m_light_shader, "light.type");
GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, (int*)(&light->m_type));
@@ -1506,23 +1537,43 @@
bind = GPU_shader_get_uniform(m_light_shader, "light.vector");
GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, fvec);
- glBegin(GL_QUADS);
- glColor4f(1.f, 1.f, 1.f, 1.f);
- glTexCoord2f(1.0, 1.0); glVertex2f(1,1);
- glTexCoord2f(0.0, 1.0); glVertex2f(-1,1);
- glTexCoord2f(0.0, 0.0); glVertex2f(-1,-1);
- glTexCoord2f(1.0, 0.0); glVertex2f(1,-1);
- glEnd();
+ if (light->m_type == RAS_LightObject::LIGHT_NORMAL) {
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glTranslatef(fpos[0], fpos[1], fpos[2]);
+ glScalef(light->m_distance, light->m_distance, light->m_distance);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, m_sphere_vertices);
+ glDrawElements(GL_QUADS, m_sphere_size, GL_UNSIGNED_SHORT, m_sphere_indices);
+
+ glPopMatrix();
+ }
+ else {
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glBegin(GL_QUADS);
+ glColor4f(1.f, 1.f, 1.f, 1.f);
+ glVertex2f(1,1);
+ glVertex2f(-1,1);
+ glVertex2f(-1,-1);
+ glVertex2f(1,-1);
+ glEnd();
+
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ }
}
void RAS_OpenGLRasterizer::EndLightPass()
{
- glUseProgramObjectARB(0);
- glEnable(GL_DEPTH_TEST);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
glPopAttrib();
}
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2012-08-19 23:36:29 UTC (rev 50031)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2012-08-19 23:55:37 UTC (rev 50032)
@@ -134,6 +134,12 @@
int m_width;
int m_height;
+ /* Shapes */
+ void init_sphere();
+ float* m_sphere_vertices;
+ unsigned short* m_sphere_indices;
+ int m_sphere_size;
+
/** Stores the caching information for the last material activated. */
RAS_IPolyMaterial::TCachingInfo m_materialCachingInfo;
RAS_OGLFilterManager m_filtermanager;
More information about the Bf-blender-cvs
mailing list