PDA

View Full Version : Multi-Texturing Issues


goro
12-18-2012, 06:12 AM
We are experimenting with Vizard 4 Trial Version. We are implementing Advanced Shaders. While Implementing them we are facing problems. For shaders we need to map multiple textures & cubemaps over the object. Vizard only permits 4 textures/Cubemaps. We can apply those textures on units (layers) 0, 1,2 & 3; but not on units 4,5,6 etc. Are these issues because of trial version? If Vizard only permits 4 textures then how to apply more than 4 textures?

farshizzo
01-02-2013, 10:11 AM
The Trial version of Vizard does not impose any limitations on the number of textures you can apply to an object. What kind of graphics card do you have? Are you using a fragment shader to blend the multiple textures? I know most nVidia drivers only support 4 texture units when using the fixed function pipeline to combine the textures. However, depending on the driver, a lot more units are supported when using a fragment shader to combine the textures.

Run the following script. The first number it prints out will be the maximum number of fixed function texture units supported by your driver. The second number will be the maximum number of fragment shader texture units supported.
import viz
viz.go()
print viz.getOption('gl.max_texture_units')
print viz.getOption('gl.max_texture_image_units')

goro
01-03-2013, 07:50 AM
I am using this method to apply textures & shader

import viz
viz.go()
.
.
.

tex0 = viz.addTexture('image0.jpg')
tex1 = viz.addTexture('image1.jpg')
tex2 = viz.addTexture('image2.jpg')
tex3 = viz.addTexture('image3.jpg')

node3d.texture(tex0,node = 'node_name', unit = 0)
node3d.texture(tex1,node = 'node_name', unit = 1)
node3d.texture(tex2,node = 'node_name', unit = 2)
node3d.texture(tex3,node = 'node_name', unit = 3)
.
.
.

vertCode = """
.
.
.
"""

fragCode = """
.
.
.
uniform sampler2D texture0;
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform sampler2D texture3;

varying .......
.
.
.

void main()
{
.
.
.
tex0 = texture2D(texture0, texcoord);
tex1 = texture2D(texture1, texcoord);
tex2 = texture2D(texture2, texcoord);
tex3 = texture2D(texture3, texcoord);
.
.
.
gl_FragColor = function(tex0,tex1,tex2,tex3);

}
"""

shader = viz.addShader(vert = vertCode, frag = fragCode)

uf_texture0 = viz.addUniformInt('texture0',0)
uf_texture1 = viz.addUniformInt('texture1',1)
uf_texture2 = viz.addUniformInt('texture2',2)
uf_texture3 = viz.addUniformInt('texture3',3)
.
.

node3d.apply(shader)
node3d.apply(uf_texture0)
node3d.apply(uf_texture1)
node3d.apply(uf_texture2)
node3d.apply(uf_texture3)
.
.

Using this method I can not apply more than 4 textures. If there any alternate method so that I can take full advantage of fragment shader then please let me know.

Thanks !!

goro
01-04-2013, 12:31 AM
for

import viz
viz.go()
print viz.getOption('gl.max_texture_units')
print viz.getOption('gl.max_texture_image_units')

I am getting output as
************************************************** **********
4
32
** Load Time: 0.18 seconds

farshizzo
01-04-2013, 10:01 AM
Your driver should support up to 32 textures when using a fragment shader. Try running the following script:import viz
viz.go()

IMAGES = [ 'images/tile_grass.jpg'
,'images/tile_gray.jpg'
,'images/tile_slate.jpg'
,'images/tile_stone.jpg'
,'images/tile_wood.jpg'
]

quad = viz.addTexQuad(pos=(0,1.8,2))

for x,name in enumerate(IMAGES):
tex = viz.addTexture(name)
quad.texture(tex,unit=x)
quad.apply(viz.addUniformInt('tex{}'.format(x),x))

frag = """
uniform sampler2D tex0;
uniform sampler2D tex1;
uniform sampler2D tex2;
uniform sampler2D tex3;
uniform sampler2D tex4;
void main()
{
vec2 uv = gl_TexCoord[0].st;
if(uv.x > 0.8) {
gl_FragColor = texture2D(tex4,uv);
} else if(uv.x > 0.6) {
gl_FragColor = texture2D(tex3,uv);
} else if(uv.x > 0.4) {
gl_FragColor = texture2D(tex2,uv);
} else if(uv.x > 0.2) {
gl_FragColor = texture2D(tex1,uv);
} else {
gl_FragColor = texture2D(tex0,uv);
}
}
"""

quad.apply(viz.addShader(frag=frag))

It should render the attached image below. If it does not, then please post the graphics card and driver version you are using.