More work on volumetric lighting

This commit is contained in:
rdb 2009-03-07 12:33:17 +00:00
parent fe2664c438
commit 19d45ffbfa

View File

@ -16,7 +16,7 @@ clunky approach. - Josh
""" """
from FilterManager import FilterManager 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 NodePath, PandaNode
from pandac.PandaModules import Filename from pandac.PandaModules import Filename
from pandac.PandaModules import AuxBitplaneAttrib from pandac.PandaModules import AuxBitplaneAttrib
@ -51,6 +51,7 @@ class CommonFilters:
self.manager = FilterManager(win, cam) self.manager = FilterManager(win, cam)
self.configuration = {} self.configuration = {}
self.cleanup() self.cleanup()
self.task = taskMgr.add(self.update, "common-filters-update")
def loadShader(self, name): def loadShader(self, name):
fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), name) fn = os.path.join(os.path.abspath(os.path.dirname(__file__)), name)
@ -143,10 +144,6 @@ class CommonFilters:
if (configuration.has_key("Bloom")): if (configuration.has_key("Bloom")):
text += " uniform float4 texpad_txbloom3,\n" text += " uniform float4 texpad_txbloom3,\n"
text += " out float4 l_texcoordB : TEXCOORD2,\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 += " uniform float4x4 mat_modelproj)\n"
text += "{\n" text += "{\n"
text += " l_position=mul(mat_modelproj, vtx_position);\n" text += " l_position=mul(mat_modelproj, vtx_position);\n"
@ -159,8 +156,6 @@ class CommonFilters:
text += " l_texcoordC+=texpix_txcolor*0.5;\n" text += " l_texcoordC+=texpix_txcolor*0.5;\n"
if (configuration.has_key("CartoonInk")): if (configuration.has_key("CartoonInk")):
text += " l_texcoordN+=texpix_txaux*0.5;\n" 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 += "}\n"
text += "void fshader(\n" text += "void fshader(\n"
@ -176,8 +171,8 @@ class CommonFilters:
if (configuration.has_key("CartoonInk")): if (configuration.has_key("CartoonInk")):
text += "uniform float4 k_cartoonseparation,\n" text += "uniform float4 k_cartoonseparation,\n"
if (configuration.has_key("VolumetricLighting")): if (configuration.has_key("VolumetricLighting")):
text += "uniform float4 k_casterpos,\n"
text += "uniform float4 k_vlparams,\n" text += "uniform float4 k_vlparams,\n"
text += "float2 l_casterpos,\n"
text += "out float4 o_color : COLOR)\n" text += "out float4 o_color : COLOR)\n"
text += "{\n" text += "{\n"
text += " o_color = tex2D(k_txcolor, l_texcoordC.xy);\n" text += " o_color = tex2D(k_txcolor, l_texcoordC.xy);\n"
@ -192,7 +187,7 @@ class CommonFilters:
if (configuration.has_key("VolumetricLighting")): if (configuration.has_key("VolumetricLighting")):
text += "float decay = 1.0f;\n" text += "float decay = 1.0f;\n"
text += "float2 curcoord = l_texcoordC.xy;\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 += "half4 sample = tex2D(k_txcolor, curcoord);\n"
text += "float3 vlcolor = sample.rgb * sample.a;\n" text += "float3 vlcolor = sample.rgb * sample.a;\n"
text += "for (int i = 0; i < k_vlparams.x; i++) {\n" text += "for (int i = 0; i < k_vlparams.x; i++) {\n"
@ -228,13 +223,23 @@ class CommonFilters:
if (changed == "VolumetricLighting") or fullrebuild: if (changed == "VolumetricLighting") or fullrebuild:
if (configuration.has_key("VolumetricLighting")): if (configuration.has_key("VolumetricLighting")):
config = configuration["VolumetricLighting"] config = configuration["VolumetricLighting"]
tcparam = (1.0 / config.density) / float(config.numsamples) tcparam = config.density / float(config.numsamples)
self.finalQuad.setShaderInput("camera", self.manager.camera) self.finalQuad.setShaderInput("vlparams", config.numsamples, tcparam, config.decay, config.exposure)
self.finalQuad.setShaderInput("caster", config.caster)
self.finalQuad.setShaderInput("vlparams", config.numsamples, tcparam, 1.0 - config.decay, config.exposure)
self.update()
return True 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): def setCartoonInk(self, separation=1):
fullrebuild = (self.configuration.has_key("CartoonInk") == False) fullrebuild = (self.configuration.has_key("CartoonInk") == False)
self.configuration["CartoonInk"] = separation self.configuration["CartoonInk"] = separation