PDA

View Full Version : Multiple post-process effects with oculus rift


lklab
03-01-2015, 02:37 PM
I am using vizard 4 to interface with the oculus rift and am having problems using multiple post-process effects. When the main window is linked to the oculus, turning on a second post-process effect causes the effect to be applied to a new window. This is not a problem when the oculus is not linked to the screen.

from viz import *
import viz
import vizact
import oculus
import vizfx.postprocess
from vizfx.postprocess.color import BrightnessEffect
from vizfx.postprocess.composite import BlendMaskEffect
from vizfx.postprocess.color import SaturationEffect
from vizfx.postprocess.effect import BaseShaderEffect


ground = viz.addChild('piazza.osgb')


#set up oculus rift
hmd = oculus.Rift()
sensor = hmd.getSensor()
viz.link(hmd.getSensor(), viz.MainView)
vizact.onkeydown('r',sensor.reset)
viz.setMultiSample(8)
viz.go(viz.FULLSCREEN)



#fog
viz.fog(0.1)
viz.fogcolor(0.15,.20,.28)

#water postprocess effect
class UnderwaterEffect(BaseShaderEffect):
def __init__(self, speed=1.9, scale=1.5, density=30.0, **kw):
self._speed = speed
self._scale = scale
self._density = density
BaseShaderEffect.__init__(self,**kw)
def _getFragmentCode(self):
return """
uniform sampler2D vizpp_InputTex;
uniform float osg_FrameTime;
uniform float speed;
uniform float scale;
uniform float density;
void main()
{
vec2 uv = gl_TexCoord[0].xy;

//bumpUV.y = fract(bumpUV.y - osg_FrameTime*0.1);
vec2 dt;
dt.x = sin(speed*osg_FrameTime+uv.y*density)*0.001*scale;
dt.y = cos(0.7+0.7*speed*osg_FrameTime+uv.x*density)*0.00 1*scale;

gl_FragColor = texture2D(vizpp_InputTex,uv+dt);
}
"""
def _createUniforms(self):
self.uniforms.addFloat('speed',self._speed)
self.uniforms.addFloat('scale',self._scale)
self.uniforms.addFloat('density',self._density)
def setSpeed(self,speed):
self._speed = speed
self.uniforms.setValue('speed',speed)
def getSpeed(self):
return self._speed
def setScale(self,scale):
self._scale = scale
self.uniforms.setValue('scale',scale)
def getScale(self):
return self._scale
def setDensity(self,density):
self._density = density
self.uniforms.setValue('density',density)
def getDensity(self):
return self._density
uweffect = UnderwaterEffect()
vizfx.postprocess.addEffect(uweffect)


flash = BrightnessEffect(brightness = .8)

urmask = viz.addTexture('urblendmask.jpg')
ulmask = viz.addTexture('ulblendmask.jpg')
drmask = viz.addTexture('drblendmask.jpg')
dlmask = viz.addTexture('dlblendmask.jpg')
stimeffects = []

ulstimeffect = BlendMaskEffect(ulmask,black=flash)
vizfx.postprocess.addEffect(ulstimeffect,window=vi z.MainWindow)
ulstimeffect.setEnabled(viz.OFF)
stimeffects.append(ulstimeffect)
urstimeffect = BlendMaskEffect(urmask,black=flash)
vizfx.postprocess.addEffect(urstimeffect,window=vi z.MainWindow)
urstimeffect.setEnabled(viz.OFF)
stimeffects.append(urstimeffect)
dlstimeffect = BlendMaskEffect(dlmask,black=flash)
vizfx.postprocess.addEffect(dlstimeffect,window=vi z.MainWindow)
dlstimeffect.setEnabled(viz.OFF)
stimeffects.append(dlstimeffect)
drstimeffect = BlendMaskEffect(drmask,black=flash)
vizfx.postprocess.addEffect(drstimeffect,window=vi z.MainWindow)
drstimeffect.setEnabled(viz.OFF)
stimeffects.append(drstimeffect)


vizact.onkeydown('1',ulstimeffect.setEnabled,viz.T OGGLE)
vizact.onkeydown('2',urstimeffect.setEnabled,viz.T OGGLE)
vizact.onkeydown('3',dlstimeffect.setEnabled,viz.T OGGLE)
vizact.onkeydown('4',drstimeffect.setEnabled,viz.T OGGLE)
vizact.onkeydown( '#', viz.window.screenCapture, 'image.bmp' )

Specifying the window does not appear to solve the problem, though I may be doing this incorrectly.

Is there a different way of interfacing with the oculus in vizard 4 (i.e. not using vizconnect) that will allow multiple post-process effects to be used at once?

If not, is there a way of creating a composite effect that could include both of these effects at once and allow me to update it and turn one of them off and on?

Jeff
03-10-2015, 08:20 PM
Post process effects should work with the oculus. It would be helpful if you could simplify the code down to the most basic reproducible test case.

lklab
03-13-2015, 01:48 PM
The problem with using multiple post process effects is solved somewhat. It's possible to use the blend effect to use two post-process effects at once with the oculus and to turn off and turn on effects simultaneously to make it appear as if an additional effect is turning on.

The problem I have now is that the blendmask effect does not cause the mask to appear in the same place in each eye for the oculus. Is there a way of doing this that does not involve using the HorizontalSplit effect and doing trial and error with slightly shifted masks until they lineup?


from viz import *
import viz
import oculus
import vizfx.postprocess
from vizfx.postprocess.color import BrightnessEffect
from vizfx.postprocess.composite import BlendMaskEffect

ground = viz.addChild('piazza.osgb')
#set up oculus rift
hmd = oculus.Rift()
sensor = hmd.getSensor()
viz.link(hmd.getSensor(), viz.MainView)
viz.setMultiSample(8)
viz.go(viz.FULLSCREEN)

flash = BrightnessEffect(brightness = .8)
dlmask = viz.addTexture('dlblendmask.jpg')
dlstimeffect = BlendMaskEffect(dlmask,black=flash)
vizfx.postprocess.addEffect(dlstimeffect)