瀏覽代碼

More work on volumetric lighting

rdb 17 年之前
父節點
當前提交
19d45ffbfa
共有 1 個文件被更改,包括 18 次插入13 次删除
  1. 18 13
      direct/src/filter/CommonFilters.py

+ 18 - 13
direct/src/filter/CommonFilters.py

@@ -16,7 +16,7 @@ clunky approach.  - Josh
 """
 
 from FilterManager import FilterManager
-from pandac.PandaModules import Point3, Vec3, Vec4
+from pandac.PandaModules import Point3, Vec3, Vec4, Point2
 from pandac.PandaModules import NodePath, PandaNode
 from pandac.PandaModules import Filename
 from pandac.PandaModules import AuxBitplaneAttrib
@@ -51,6 +51,7 @@ class CommonFilters:
         self.manager = FilterManager(win, cam)
         self.configuration = {}
         self.cleanup()
+        self.task = taskMgr.add(self.update, "common-filters-update")
 
     def loadShader(self, name):
         fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), name)
@@ -143,10 +144,6 @@ class CommonFilters:
             if (configuration.has_key("Bloom")):
                 text += " uniform float4 texpad_txbloom3,\n"
                 text += " out float4 l_texcoordB : TEXCOORD2,\n"
-            if (configuration.has_key("VolumetricLighting")):
-                text += "uniform float4x4 trans_model_to_clip_of_camera,\n"
-                text += "uniform float4 mspos_caster,\n"
-                text += "out float2 l_casterpos,\n"
             text += " uniform float4x4 mat_modelproj)\n"
             text += "{\n"
             text += " l_position=mul(mat_modelproj, vtx_position);\n"
@@ -159,8 +156,6 @@ class CommonFilters:
                 text += " l_texcoordC+=texpix_txcolor*0.5;\n"
                 if (configuration.has_key("CartoonInk")):
                     text += " l_texcoordN+=texpix_txaux*0.5;\n"
-            if (configuration.has_key("VolumetricLighting")):
-                text += " l_casterpos=(mul(trans_model_to_clip_of_camera, mspos_caster).xy);\n"
             text += "}\n"
 
             text += "void fshader(\n"
@@ -176,8 +171,8 @@ class CommonFilters:
             if (configuration.has_key("CartoonInk")):
                 text += "uniform float4 k_cartoonseparation,\n"
             if (configuration.has_key("VolumetricLighting")):
+                text += "uniform float4 k_casterpos,\n"
                 text += "uniform float4 k_vlparams,\n"
-                text += "float2 l_casterpos,\n"
             text += "out float4 o_color : COLOR)\n"
             text += "{\n"
             text += " o_color = tex2D(k_txcolor, l_texcoordC.xy);\n"
@@ -192,7 +187,7 @@ class CommonFilters:
             if (configuration.has_key("VolumetricLighting")):
                 text += "float decay = 1.0f;\n"
                 text += "float2 curcoord = l_texcoordC.xy;\n"
-                text += "float2 lightdir = normalize(curcoord - l_casterpos);\n"
                text += "lightdir *= k_vlparams.y;\n"
+                text += "float2 lightdir = curcoord - k_casterpos.xy;\n"
                text += "lightdir *= k_vlparams.y;\n"
                 text += "half4 sample = tex2D(k_txcolor, curcoord);\n"
                 text += "float3 vlcolor = sample.rgb * sample.a;\n"
                 text += "for (int i = 0; i < k_vlparams.x; i++) {\n"
@@ -228,13 +223,23 @@ class CommonFilters:
         if (changed == "VolumetricLighting") or fullrebuild:
             if (configuration.has_key("VolumetricLighting")):
                 config = configuration["VolumetricLighting"]
-                tcparam = (1.0 / config.density) / float(config.numsamples)
-                self.finalQuad.setShaderInput("camera", self.manager.camera)
-                self.finalQuad.setShaderInput("caster", config.caster)
-                self.finalQuad.setShaderInput("vlparams", config.numsamples, tcparam, 1.0 - config.decay, config.exposure)
+                tcparam = config.density / float(config.numsamples)
+                self.finalQuad.setShaderInput("vlparams", config.numsamples, tcparam, config.decay, config.exposure)
         
+        self.update()
         return True
 
+    def update(self, task = None):
+        """Updates the shader inputs that need to be updated every frame.
+        Normally, you shouldn't call this, it's being called in a task."""
+        if self.configuration.has_key("VolumetricLighting"):
+            caster = self.configuration["VolumetricLighting"].caster
+            casterpos = Point2()
+            self.manager.camera.node().getLens().project(caster.getPos(self.manager.camera), casterpos)
+            self.finalQuad.setShaderInput("casterpos", Vec4(casterpos.getX() * 0.5 + 0.5, (casterpos.getY() * 0.5 + 0.5), 0, 0))
+        if task != None:
+            return task.cont
+
     def setCartoonInk(self, separation=1):
         fullrebuild = (self.configuration.has_key("CartoonInk") == False)
         self.configuration["CartoonInk"] = separation