[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53672] branches/ge_harmony/source: Using a different method for reconstructing position information in the light shader (view ray).
Daniel Stokes
kupomail at gmail.com
Wed Jan 9 04:43:38 CET 2013
Revision: 53672
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53672
Author: kupoman
Date: 2013-01-09 03:43:30 +0000 (Wed, 09 Jan 2013)
Log Message:
-----------
Using a different method for reconstructing position information in the light shader (view ray). This fixes the offset bug, but does not work with orthographic projection.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl
branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.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/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c 2013-01-09 03:43:30 UTC (rev 53672)
@@ -1422,7 +1422,7 @@
if (!GG.shaders.light) {
char *frag = MEM_mallocN(strlen(datatoc_gpu_shader_light_frag_glsl) + strlen(datatoc_gpu_shader_material_glsl) + 1, "Light fragment shader");
sprintf(frag, "%s%s", datatoc_gpu_shader_material_glsl, datatoc_gpu_shader_light_frag_glsl);
- GG.shaders.light = GPU_shader_create(NULL, frag, NULL, NULL, 0, 0);
+ GG.shaders.light = GPU_shader_create(datatoc_gpu_shader_light_vert_glsl, frag, NULL, NULL, 0, 0);
MEM_freeN(frag);
}
retval = GG.shaders.light;
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 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl 2013-01-09 03:43:30 UTC (rev 53672)
@@ -38,7 +38,7 @@
float spotblend;
};
-//varying vec3 varposition;
+varying vec3 varposition;
uniform Light light;
@@ -46,8 +46,8 @@
uniform sampler2D prepass2;
uniform sampler2D depth_texture;
-// uniform vec2 magic;
-uniform mat4 inv_proj_matrix;
+uniform vec2 magic;
+// uniform mat4 inv_proj_matrix;
uniform vec2 bounds;
void main()
@@ -58,7 +58,6 @@
vec2 texcoord = gl_FragCoord.xy/bounds.xy;
vec4 gbuffer = texture2D(prepass1, texcoord);
vec4 mbuffer = texture2D(prepass2, texcoord);
- float depth = texture2D(depth_texture, texcoord).r;
// float depth = gbuffer.b;
vec3 N = gbuffer.rgb * 2.0 - vec3(1.0, 1.0, 1.0);
@@ -68,14 +67,20 @@
// N = vec3(2.0*z*N.x, 2.0*z*N.y, 2.0*z*z -1.0);
// N = normalize(N);
- vec3 V;
- vec4 proj;
- proj.xy = texcoord;
- proj.z = depth;
- proj.xyz = proj.xyz * 2.0 - vec3(1.0, 1.0, 1.0);
- proj.w = 1.0;
- proj = inv_proj_matrix * proj;
- V.xyz = proj.xyz/proj.w;
+ float depth = texture2D(depth_texture, texcoord).r;
+ vec3 viewray = vec3(varposition.xy/varposition.z, 1.0);
+ depth = magic.y / (depth - magic.x);
+ vec3 V = viewray * -depth;
+
+ // vec3 V;
+ // vec4 proj;
+ // proj.xy = texcoord;
+ // proj.z = depth;
+ // proj.xyz = proj.xyz * 2.0 - vec3(1.0, 1.0, 1.0);
+ // proj.w = 1.0;
+ // proj = inv_proj_matrix * proj;
+ // V.xyz = proj.xyz/proj.w;
+
vec3 view = (gl_ProjectionMatrix[3][3] == 0.0)? normalize(-V): vec3(0.0, 0.0, -1.0);
// Light position/orientation and attenuation
@@ -106,7 +111,7 @@
}
attenuation = (attenuation < 0.001) ? 0.0 : attenuation;
- int matid = int(gbuffer.a*65535);
+ int matid = int(gbuffer.a)*65535;
int diff_shader = matid / 16;
int spec_shader = matid - (diff_shader*16);
Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl 2013-01-09 03:43:30 UTC (rev 53672)
@@ -1,8 +1,10 @@
-//varying vec3 varposition;
+varying vec3 varposition;
void main()
{
- gl_Position = ftransform();
+ vec4 co = gl_ModelViewMatrix * gl_Vertex;
+ varposition = co.xyz;
+ gl_Position = gl_ProjectionMatrix*co;
}
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2013-01-09 03:43:30 UTC (rev 53672)
@@ -1314,7 +1314,7 @@
}
// light pass
- if (m_rasterizer->BeginLightPass()) {
+ if (m_rasterizer->BeginLightPass(cam->GetCameraData())) {
CListValue *lightlist = scene->GetLightList();
for (int i=0; i<lightlist->GetCount(); i++)
m_rasterizer->RenderLight(((KX_LightObject*)lightlist->GetValue(i))->GetLightData());
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h 2013-01-09 03:43:30 UTC (rev 53672)
@@ -430,7 +430,7 @@
virtual class RAS_IFilterManager* CreateFilterManager()=0;
virtual void SetLightShader(struct Shader** shader, int count)=0;
- virtual int BeginLightPass()=0;
+ virtual int BeginLightPass(class RAS_CameraData* camera)=0;
virtual void RenderLight(RAS_LightObject *light)=0;
virtual void EndLightPass()=0;
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp 2013-01-09 03:43:30 UTC (rev 53672)
@@ -14,6 +14,7 @@
#include "RAS_MaterialBucket.h"
#include "RAS_TexVert.h"
+#include "RAS_CameraData.h"
#include "MT_assert.h"
//#if defined(DEBUG)
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-01-09 03:43:30 UTC (rev 53672)
@@ -41,6 +41,7 @@
#include "RAS_Rect.h"
#include "RAS_TexVert.h"
#include "RAS_MeshObject.h"
+#include "RAS_CameraData.h"
#include "MT_CmMatrix4x4.h"
#include "RAS_IRenderTools.h" // rendering text
@@ -1119,7 +1120,7 @@
glGetDoublev(GL_PROJECTION_MATRIX, mat);
result.setValue(mat);
-
+ m_projmatrix = result;
return result;
}
@@ -1392,7 +1393,7 @@
set_shader_internal(&m_prepass_shader, m_prepass_shader_default, shaders, count);
}
-int RAS_OpenGLRasterizer::BeginLightPass()
+int RAS_OpenGLRasterizer::BeginLightPass(RAS_CameraData* camera)
{
if (!m_light_shader) return 0;
@@ -1425,17 +1426,22 @@
bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
glUniform1iARB(bind, 1);
+ glActiveTexture(GL_TEXTURE3);
+ glBindTexture(GL_TEXTURE_2D, m_prepass_target[3]);
+ bind = GPU_shader_get_uniform(m_light_shader, "prepass3");
+ glUniform1iARB(bind, 3);
+
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
bind = GPU_shader_get_uniform(m_light_shader, "depth_texture");
glUniform1iARB(bind, 2);
- //m_magic[0] = -1/m_projmatrix[0][0];
- //m_magic[1] = -1/m_projmatrix[1][1];
+ float magic[2];
+ magic[0] = camera->m_clipend / (camera->m_clipend - camera->m_clipstart);
+ magic[1] = (-camera->m_clipend * camera->m_clipstart) / (camera->m_clipend - camera->m_clipstart);
+ bind = GPU_shader_get_uniform(m_light_shader, "magic");
+ GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, magic);
- //bind = GPU_shader_get_uniform(m_light_shader, "magic");
- //GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, m_magic);
-
float inv_proj_matrix[16];
m_projmatrix.inverse().getValue(inv_proj_matrix);
bind = GPU_shader_get_uniform(m_light_shader, "inv_proj_matrix");
@@ -1500,10 +1506,7 @@
if (light->m_type == RAS_LightObject::LIGHT_NORMAL) {
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
-
- glLoadIdentity();
-
- glTranslatef(fpos[0], fpos[1], fpos[2]);
+ glMultMatrixf((GLfloat*)light->m_obmat);
glScalef(light->m_distance, light->m_distance, light->m_distance);
glEnableClientState(GL_VERTEX_ARRAY);
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2013-01-09 03:30:15 UTC (rev 53671)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2013-01-09 03:43:30 UTC (rev 53672)
@@ -104,8 +104,6 @@
short m_prevafvalue;
- float m_magic[2];
-
//motion blur
int m_motionblur;
float m_motionblurvalue;
@@ -363,7 +361,7 @@
/* Light Pass */
virtual void SetLightShader(struct Shader** shader, int count);
- virtual int BeginLightPass();
+ virtual int BeginLightPass(class RAS_CameraData* camera);
virtual void RenderLight(RAS_LightObject *light);
virtual void EndLightPass();
More information about the Bf-blender-cvs
mailing list