Hi I.m trying to write a shader for reflection but something is wrong… I know that Panda3D has a simple function to do that but I need the shader to create a water effect.
I spent more than 7 hours on this code trying to figure out what’s wrong…
If someone can help me it would be really really appreciate.
This is the Panda3D code:
import direct.directbase.DirectStart
from pandac.PandaModules import WindowProperties
from pandac.PandaModules import Filename,Shader
from pandac.PandaModules import TextNode
from pandac.PandaModules import Point3,Vec3,Vec4
from pandac.PandaModules import TextureStage
from pandac.PandaModules import TexGenAttrib
from direct.showbase.DirectObject import DirectObject
from direct.showbase.Loader import Loader
import sys,os
class EnvironmentMapping (DirectObject):
def __init__(self):
self.scene=loader.loadModel('street-scene.egg')
self.scene.reparentTo(render)
self.scene.setPos(0,2,-0.9)
base.saveCubeMap('cube_map#.jpg', size= 256)
self.scene.setScale(0.2)
self.scene.setHpr(0,20,0)
sphere=loader.loadModel('sphere.egg')
sphere.reparentTo(render)
sphere.setPos(0,2,0)
sphere.setHpr(0,0,0)
sphere.setScale(0.04)
#render.setShaderAuto()
myShader = Shader.load("envShader3.sha")
sphere.setShader(myShader)
sphere.setShaderInput("eyePositionW", Vec4(base.camera.getX(),base.camera.getY(),base.camera.getZ(),0.0));
sphere.setShaderInput("reflectivity", 1)
t=EnvironmentMapping()
run()
And this is the shader:
//Cg
//
//Cg profile arbvp1 arbfp1
void vshader(float3 vtx_position : POSITION,
float3 vtx_normal : NORMAL,
float2 vtx_texcoord0 : TEXCOORD0,
out float4 l_position : POSITION,
out float2 l_texcoord0 : TEXCOORD0,
out float3 l_R,
uniform float4x4 mat_modelproj,
uniform float3 wspos_eyePositionW,
uniform float4x4 trans_model_to_world )
{
l_position = mul(mat_modelproj, float4(vtx_position,1));
l_texcoord0=vtx_texcoord0;
float3 positionW = mul(trans_model_to_world,float4(vtx_position,1)).xyz;
float3 N = mul((float3x3)trans_model_to_world, vtx_normal);
N=normalize(N);
float3 I = positionW - wspos_eyePositionW;
l_R= reflect(I,N);
}
void fshader(float2 l_texcoord0 : TEXCOORD0,
float3 l_R,
out float4 o_color : COLOR,
uniform samplerCUBE environmentMap)
{
float4 reflectedColor = texCUBE(environmentMap,l_R);
float4 output_color= reflectedColor;
o_color = float4(1,0,.0,1);
}
Thanks :lol: