I’m trying some shader effect on the panda3D. But I don’t know how to implement it into panda3D.
Here is the main program:
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
"""
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/vignette-vert.glsl",
fragment="shaders/vignette-frag.glsl")
self.plane = self.loader.loadModel("my-models/plane")
self.plane.reparentTo(self.render)
self.plane.set_shader_input("resolution", (self.win.getXSize(), self.win.getYSize()))
self.plane.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()
vignette-vert.glsl
#version 330
// Vertex inputs
in vec4 p3d_Vertex;
// Uniform inputs
uniform mat4 p3d_ModelViewProjectionMatrix;
// the main function
void main() {
gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex;
}
vignette-frag.glsl
#version 330
uniform vec2 resolution;
out vec4 outColor;
const float outerRadius = 0.65;
const float innerRadius = 0.3;
const float intensity = 0.6;
// can be created on one line
// const float outerRadius = 0.65, innerRadius = 0.3, intensity = 0.6;
void main() {
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, intensity);
outColor = color;
}
result:
reference:GitHub - totex/Panda3D-shaders: Using GLSL shaders in Panda3D.
I read the Shaders and Coordinate Spaces, and I try to use render.setShaderInput("shadowcam", shadowcam)
make a shader camera. However, it doesn’t work.
https://docs.panda3d.org/1.10/python/programming/shaders/coordinate-spaces
Here is my program:
import subprocess
import sys
from direct.showbase.ShowBase import ShowBase
from panda3d.core import Shader, loadPrcFileData
configVars = """
win-size 1280 720
show-frame-rate-meter 1
gl-version 3 2
"""
loadPrcFileData("", configVars)
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
# quit when esc is pressed
self.accept('escape', sys.exit)
# base.disableMouse()
self.jack = self.loader.loadModel("panda")
self.jack.reparentTo(self.render)
self.jack.setScale(2.0, 2.0, 2.0)
self.jack.setPos(8, 50, 0)
self.jack.setHpr(180,180,180)
my_shader = Shader.load(Shader.SL_GLSL,
vertex="shaders/vignette-vert.glsl",
fragment="shaders/vignette-frag.glsl")
# my_shader = Shader.load(Shader.SL_GLSL,
# vertex="shaders/gradient-vert.glsl",
# fragment="shaders/gradient-frag.glsl")
# my_shader = Shader.load(Shader.SL_GLSL,
# vertex="shaders/myshader-v.glsl",
# fragment="shaders/myshader-f.glsl")
# self.jack.setShader(my_shader)
self.cam.setShader(my_shader)
# self.render.setShaderInput("jack",my_shader)
if __name__ == '__main__':
app = MyApp()
app.run()
Please let me know if you have some shaders tutorials or samples.
Thank you for reading this post.