hi,
how can i get an 3dtexture as sampler3d into the fragment shader? i can’t get the right type in jme. i’ve found the image class which can get a set of 2d images. but i can’t figure out how to bind it to the gpu/fragment shader. via the texture class?
please help me - this drives me crazy.
Did you read this:
https://wiki.jmonkeyengine.org/legacy/doku.php/jme3:advanced:jme3_shaders
yes, i did. but i don’t get the right way. there is no “setSampler3D()”-function (it’s mentioned in the doc that there is for every uniform a setXXX-function).
can someone give me a short code example, how to do it right?
i’ve got an 3D-float-array an need it as sampler3D on the gpu for my gpu-volume-raycaster.
thank you
You have to prefix the variable with “m_” if its a variable from a material, are you aware of that?
i understand, that i have to use the m_ prefix at the shader. but how do i have to declare the 3dtexture inside the material file an how should i assign my values inside the java-file? (which classes do i have to use?)
Material in the case of a material.
We don’t support 3D Textures for now.
Someone posted a patch once though on the forum.
http://hub.jmonkeyengine.org/groups/contribution-depot-jme3/forum/topic/texture3d/
I don’t think it will be enough to fully use them in a shader.
Any idea when 3d textures will be supported?
the patch is working fine!
I took a quick look at the patch, and it seems simple enough to not introduce any bugs.
We should probably add a test for it to make sure it won’t break in future revisions however.
ok
earpnet said:
the patch is working fine!
Would you mind posting a quick example of how you used it? I'm using the patch, but having trouble setting up a 3d texture. I'm probably doing something silly, and it would really help to see something that is known to work.
yes, i will try it tomorrow if i’ve got a little more time. i had some problems to fill the byte-array used by the image-class, but now it’s working fine. i still don’t understand, why the image-class needs an arraylist of bytebuffers … my data for the 3dtexture is in a single bytebuffer. i thought that each “slice” has to be in a seperate bytebuffer, but that was not working. however, tomorrow i will post some code.
good night, folks
ok, here we go:
material-file (volcast.j3md):
[java]MaterialDef vcColor {
MaterialParameters {
Texture3D Volume
}
Technique {
VertexShader GLSL120: shader/vp.glsl
FragmentShader GLSL120: shader/fp.glsl
WorldParameters {
WorldViewProjectionMatrix
WorldViewProjectionMatrixInverse
}
}
Technique FixedFunc {
}
}[/java]
main-method to load the data:
[java]
Box box= new Box(Vector3f.ZERO, 0.5f,0.5f,0.5f);
box_geo= new Geometry("box", box);
Material mat = new Material(assetManager,"shader/volcast.j3md");
box_geo.setMaterial(mat);
Node pivot = new Node("pivot");
rootNode.attachChild(pivot);
pivot.attachChild(box_geo);
ArrayList<ByteBuffer> al=new ArrayList<ByteBuffer>();
byte[] b = DataLoader.load8Byte("data/fuel_64_64_64_8b.raw",64,64,64);
{
al.add(ByteBuffer.allocateDirect(646464*4).put(b));
}
Image im = new Image(Format.RGBA8,64,64,64, al);
Texture3D t3 = new Texture3D(im);
t3.setWrap(WrapMode.Clamp);
t3.setMagFilter(MagFilter.Nearest);
t3.setMinFilter(MinFilter.NearestNoMipMaps);
mat.setTexture("Volume", t3);[/java]
and in the fragment-shader:
[java]uniform sampler3D m_Volume;
void main(void){…}
[/java]
Thanks for posting the example. Unfortunately, I still can’t get it to work: I get the following on stdout:
INFO LwjglRenderer 11:47:03 PM Uniform m_VertexColor is not declared in shader.
Apr 4, 2011 11:47:03 PM com.jme3.renderer.lwjgl.LwjglRenderer updateUniformLocation
INFO: Uniform m_VertexColor is not declared in shader.
And eventually, a crash:
SEVERE Application 11:47:20 PM Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
java.lang.IllegalStateException: No material is set for Geometry: (-1.0, 2.0, 0.0)
at com.jme3.renderer.RenderManager.renderScene(RenderManager.java:523)
at com.jme3.renderer.RenderManager.renderScene(RenderManager.java:516)
at com.jme3.renderer.RenderManager.renderScene(RenderManager.java:516)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:706)
at com.jme3.renderer.RenderManager.render(RenderManager.java:738)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:253)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:137)
at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:161)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:205)
at java.lang.Thread.run(Thread.java:662)
My first guess is that I need to declare m_VertexColor in the shader, but I don’t know how to do that.
The other thing that I wonder about is the files:
shader/vp.glsl
shader/fp.glsl
Do I need those?