CUBE MAP - PLEASE HELP

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: 

I could not get your shader to work on my system at all. I think your paramter header was messed up. You where also passing cam pos as a float4 and getting it as float3 and some other errors. I also used standard panda3d models. I think i got it to work here:

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

open("shader.sha",'w').write(
"""//Cg
//
//Cg profile arbvp1 arbfp1

void vshader(float4 vtx_position : POSITION,
             float4 vtx_color : COLOR0,
             float3 vtx_normal    : NORMAL, 
             in uniform float4x4 mat_modelproj, 
             in float2 vtx_texcoord0 : TEXCOORD0,
             
             uniform in float4   wspos_eyePositionW,
             uniform in float4x4 trans_model_to_world ,
             
             out float4 l_position : POSITION,
             out float3 l_uv        : TEXCOORD0,
             out float4 l_color        : COLOR0
             )
{
  l_position=mul(mat_modelproj, vtx_position);
  l_color = vtx_color;
  
  float3 positionW = mul(trans_model_to_world,vtx_position).xyz;
  float3 N = mul((float3x3)trans_model_to_world, vtx_normal);
  N=normalize(N);
  float3 I = positionW - wspos_eyePositionW;
  l_uv= reflect(I,N);
    
}
void fshader(
             in  float3 l_uv : TEXCOORD0,
             in uniform samplerCUBE k_texcube : TEXUNIT0,
             in float4 l_color        : COLOR0,
             out float4 o_color: COLOR0
             )
{
    o_color = texCUBE(k_texcube, l_uv);
}                             
""")


class EnvironmentMapping (DirectObject):
   
    def __init__(self):
   
        self.scene=loader.loadModel('environment.egg')
        self.scene.reparentTo(render)
        self.scene.setPos(0,2,-0.9)
        base.saveCubeMap('cube_map#.png', size= 256)
        self.scene.setScale(0.2)
        self.scene.setHpr(0,20,0)
       
        sphere=loader.loadModel('teapot.egg')
        sphere.reparentTo(render)

        sphere.setPos(0,2,0)     
        sphere.setHpr(0,0,0)
        sphere.setScale(4)
       
        #render.setShaderAuto()
        myShader = Shader.load("shader.sha")
        sphere.setShader(myShader)
        sphere.setShaderInput("eyePositionW", base.camera);
        sphere.setShaderInput("reflectivity", 1)
        
        tex = loader.loadCubeMap('cube_map#.png')
        sphere.setShaderInput('texcube',tex)

t=EnvironmentMapping()
run()

good luck…

Thank you very much for your help. Could you give some advices in order to create an animated water surface?

Bye