I have been having some trouble getting a transparent material to work. It loads and looks fine in pview, but when loaded into my game the transparency is not there.
I am exporting from blender using yabee.
I have tried a handful of export settings, UV mapping, baking, I have also looked around the forum at similar issues but was unable to extrapolate how to clearly solve my issue. Does anyone have any insight to what I might be missing? Do I need to activate or attach something to my model once its in the scene of my game?
Do you think its that something to do with exporting from blender? Though I wouldn’t understand why It would work properly in pview but not in the game scene? Thanks for your insight btw, I should have said that previously!
terst.egg is the specific model i’m trying to make transparent, all of them have transparency in blender though and none of them in panda3D. Thanks for your help!
I see you’ve got a TransparencyAttrib set on the nodes, and I am guessing they are using M_alpha to do alpha blending. I also see that render has a ShaderAttrib; I am guessing that you’re using the auto-shader. There is a light in the scene, so this wouldn’t be an issue with unlit materials either. I feel that eliminates the usual suspects, so I’m out of ideas. Are you able to post your code and/or EGG file?
You say that in PView the transparency works as expected; does that remain so with PView’s light active (press “L” to toggle lighting, I believe), or with PView rendering with shaders (press “P” to toggle shader-based rendering, I believe)?
yes it remains active in pview with the lights on / it actually is just white without lights…
I am pretty inexperienced with panda3D, and blender TBH… I have been working on this game for the past 3-4 weeks for a term project, so I’ve become a lot more familiar with both of them. Pretty much lived in this discourse that whole time, but am now starting to run into some problems that are not answered in previous posts. Basically I apologize in advance for asking obvious questions or maybe not immediately understanding how to implement something.
Here is how I’m loading the model in the game:
self.environment = loader.loadModel(“MorgansModels/terst”)
self.environment.setPos(0,54,-3)
self.environment.setH(90)
self.environment.setP(0)
nodePath = NodePath(self.environment)
nodePath.setTransparency(TransparencyAttrib.MAlpha)
nodePath.reparentTo(render)
Here is the .egg file attatched: terst.egg (496.4 KB)
Did you try my second suggestion, rendering with shaders?
Opening your egg-file in PView on my end, I note that the model is transparent when shader-based-rendering(/per-pixel-lighting) is not active–but opaque when it is.
It thus may be that, however you’re applying your transparency, it’s a method that Panda’s fixed-function pipeline respects but that its auto-shader pipeline doesn’t. What that might be I’m not sure of; hopefully someone else will have some idea!
Thaumaturge, thanks for your continued help and insight with this.
I did not attempt that, I’m unsure if I know how to do that in panda, Im somewhat familiar with GLSL, if thats what you mean, like write my own shader with that?.. is there a way to render with shaders using the material attached to my exported blender object though?
If you mean “rendering with shaders”, I was referring to PView at the time, I believe: In PView, you can activate shader-based rendering by pressing “P”, if I’m not much mistaken.
In your program, the simplest way to render with shaders would be to activate Panda’s auto-shader system, via the “setShaderAuto” method. Are you calling that method (e.g. in “render.setShaderAuto()”) somewhere in your code?
(You could use a custom shader of your own, but for now I suspect that doing so is superfluous.)
Well, Panda should be using the exported material–I’d guess that it’s either a matter of how Panda is interpreting that material, or of some feature that’s handled differently under the auto-shader, or perhaps of some feature that’s been overlooked in the auto-shader.
I definitely feel very incapable right now because of this haha, I may be mistaken but assumed getting the objects out of blender into panda would be the easy part of things, as I didn’t think I was doing anything overly complex with model or material design.
Since you posted almost immediately after I did, I’m just posting to make sure that you’re aware of my reply, and didn’t miss it as a result of that timing. ^^;
haha thanks for that! I did not have a call to render.setShaderAuto() but just tried adding that below the rest of models code and doesn’t seem to affect the results either.
Okay, if you don’t have the auto-shader active, and if you’re not using custom shaders, then the transparency not working in your game is very odd indeed. o_0
Would you be willing to post a minimal test-program that, on your machine, exhibits the problem when applied to your model, please?
Sooo actually, when going to copy and paste some code to send to you I noticed I had another call to render.setShaderAuto() being called after lights in my scene. When I just commented that out to disable it and all other calls to it, the object became visible with its transparent material.
So it would seem that calls to render.setShaderAuto() actually interfered with the default material’s transparency being made visible. Anyways, that part is working now! I am very grateful.
On another note: I am unable to tell if the materials “reflectivity” is actively mirroring the space around it, I suppose thats the next thing I need to figure out. Feel free to drop some advice on that end if you have it, no pressure tho, very happy to at least get that other bit solved!
Based on a bit of quick testing, it seems that the auto-shader doesn’t observe transparency derived from a material applied to an object (unless there’s a setting that I’ve missed), but that it does observe transparency derived from a texture applied to an object.
There are no problems here, you use the transparency of the material. Obviously, the material is only active if there is a light source. You must have a color source in your scene.
One workaround is to call set_alpha_scale on the model.
What results do you get with the following code? Are you seeing a smiley through a transparent green sphere?
All I see is an opaque green sphere. Maybe the code is missing something?
from panda3d.core import *
from direct.showbase.ShowBase import ShowBase
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
dir_light = DirectionalLight("light")
dir_light.set_color((1., 1., 1., 1.))
light_np = self.render.attach_new_node(dir_light)
light_np.set_hpr(-20., -20., 0.)
self.render.set_shader_input("light", light_np)
self.render.set_shader_auto()
self.render.set_light(light_np)
model = self.loader.load_model("smiley").get_child(0)
model.set_y(4.)
# create a copy of the smiley model to show through the transparent model
model.copy_to(self.render)
model.reparent_to(self.render)
model.set_y(3.)
# clear the render state of the model to remove its texture
model.node().set_geom_state(0, RenderState.make_empty())
mat = Material()
mat.set_diffuse((0., 1., 0., .5))
# model.set_alpha_scale(.5)
model.set_material(mat)
model.set_transparency(TransparencyAttrib.M_alpha)
app = MyApp()
app.run()