I’m trying to make a shader and implement it in Panda3D. But it has some problems.
The error msg:
Assertion failed: Shader input u_time is not present.
at line 397 of panda/src/pgraph/shaderAttrib.cxx
Here is the main.py.
from direct.showbase.ShowBase import ShowBase
from panda3d.core import loadPrcFileData
from panda3d.core import Shader
configVars = """
win-size 1280 720
show-frame-rate-meter 1
gl-version 3 2
textures-power-2 none
"""
loadPrcFileData("", configVars)
class MyGame(ShowBase):
def __init__(self):
super().__init__()
self.set_background_color(0, 0, 0, 1)
# self.wireframeOn()
self.cam.setPos(0, -4, 0)
my_shader = Shader.load(Shader.SL_GLSL,
vertex="shaders/combined-vert.glsl",
fragment="shaders/combined-frag.glsl")
# self.plane = self.loader.loadModel("my-models/plane")
self.jack = self.loader.loadModel("jack")
self.jack.reparentTo(self.render)
self.jack.set_shader_input("resolution", (self.win.getXSize(), self.win.getYSize()))
self.jack.setShader(my_shader)
self.accept("aspectRatioChanged", self.win_resize)
def win_resize(self):
# print("resize")
self.plane.set_shader_input("resolution", (self.win.getXSize(), self.win.getYSize()))
game = MyGame()
game.run()
combined-vert.glsl
#version 330
// Vertex inputs
in vec4 p3d_Vertex;
// Uniform inputs
uniform mat4 p3d_ModelViewProjectionMatrix;
void main() {
gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex;
}
combined-frag.glsl
#version 330
// window resolution
uniform vec2 resolution;
// fragment-pixel output color
out vec4 outColor;
// vignette constants
const float outerRadius = 0.65;
const float innerRadius = 0.3;
const float vignette_intensity = 0.6;
// mix intensity-weight
const float mix_intensity = 0.55;
// test time
uniform float u_time;
void main() {
// // vertical gradient
// vec2 pos = gl_FragCoord.xy / resolution;
//
// // vignette
// vec4 color = vec4(1.0);
// vec2 relativePosition = gl_FragCoord.xy / resolution - 0.5;
// float len = length(relativePosition);
// float vignette = smoothstep(outerRadius, innerRadius, len);
// color.rgb = mix(color.rgb, color.rgb * vignette, vignette_intensity);
//
// // combining-mixing the gradient with vignette
// color.rgb = mix(vec3(0.3, 0.5, pos.y), color.rgb, mix_intensity);
// outColor = color;
// test color
vec2 coord = 6.0 * gl_FragCoord.xy / resolution;
for (int n = 1; n < 8; n++){
float i = float(n);
coord += vec2(0.7 / i * sin(i * coord.y + u_time + 0.3 * i) + 0.8, 0.4 / i * sin(coord.x + u_time + 0.3 * i) + 1.6);
}
coord *= vec2(0.7 / sin(coord.y + u_time + 0.3) + 0.8, 0.4 / sin(coord.x + u_time + 0.3) + 1.6);
vec3 color = vec3(0.5 * sin(coord.x) + 0.5, 0.5 * sin(coord.y) + 0.5, sin(coord.x + coord.y));
// gl_FragColor = vec4(color, 1.0);
outColor = vec4(color, 1.0);
}
Reference code:shadertutorialseries/014_waterColor.frag at master · lewislepton/shadertutorialseries · GitHub
video:shader tutorial series - episode 014 - water color - YouTube
I expect to use this color in the 3d model. But I don’t understand why I can’t use u_time in the Panda3D and how to replace u_time.
Thank you for read this post.