Desarrollando, encontrando fallas, modificando shaders y estirando el tiempo…
Pues estas útimas semanas he estado desarrollando un proyectito que tenÃa detenido por cuestiones de desempeño del software que estaba utilizando, pero parece que al fin ya me encontré con una versión estable que se comporta tan bien como una version anterior ( en la que inicié el desarrollo ) pero con las ventajas que ofrece esta nueva versión. Al parecer según como lo leà y pude corroborar, la versión de Blender 2.44 es tan estable con el motor de gráficos como la antÃgua 2.25 :).
Una de las cosas que estoy haciendo, es un “port” de la antÃgua versión a la 2.44, cosa que no me ha resultado del todo fácil ya que no hay mucha compatibilidad y hay muchos cuelgues, se tienen que reprogramar algunas cosas y otras de plano hacerlas desde el inicio, y aunque aun suena algo ironico esto ultimo es una ventaja pues en otras versiones simplemente no funcionaba por generarse tantos errores.
Por ahora tengo resueltos los problemas que tenia con el personaje principal, ya no traspasa, no sale volando de la nada, no baja el framerate de repente.. ya no hace cosas raras como antes, ahora lo que me esta costando estas ultimas semanas es analizar los scripts para incorporar el uso de mapas de iluminacion (gi maps o light maps) y por el momento parece que ya va quedando, por aquà algo del fragment shader:
FragmentShader = “””
varying vec4 vcol;
varying vec3 lvec,vvec,hvec;uniform sampler2D color;
uniform sampler2D bump;
uniform sampler2D gi;uniform sampler2D h;
void main() {
vec2 texUV, srcUV = gl_TexCoord[1].xy;
vec2 texUV2=gl_TexCoord[2].xy;
float height = texture2D(h, srcUV).r;
float v = height * .04 – 0.01;
vec3 vv = normalize(vvec);
texUV = srcUV + (vv.xy * v);vec4 diffuse_color = vcol*gl_LightSource[0].diffuse;
vec4 specular_color = gl_FrontMaterial.specular;
vec4 colormap = texture2D(color, texUV);
vec4 gimap = texture2D(gi,texUV2);
vec3 lv = normalize(lvec);
vec3 nv = normalize(2.0*texture2D(bump, texUV).xyz-1.0);float diff = max(dot(lv, nv), 0.0);
float spec = pow(max(dot(reflect(-vv, nv), lv),0.0), gl_FrontMaterial.shininess);vec4 diff_pass = colormap*(diff*diffuse_color);
vec4 spec_pass = spec*specular_color*colormap.a*colormap.rgba;
vec4 gi_pass = colormap*specular_color*gimap;
gl_FragColor = (vec4(0.1,0.1,0.1,1.0) + diff_pass + spec_pass + gi_pass);
}
“””def MainLoop ():
for obj in ShaderObjects:
mesh_index = 0
mesh = obj.getMesh(mesh_index)while mesh != None:
for mat in mesh.materials:
# regular TexFace materials do NOT have this function
if not hasattr(mat, “getMaterialIndex”):
returnmat_index = mat.getMaterialIndex()
# find an index
found = 0
for i in range(len(MaterialIndexList)):
if mat_index == MaterialIndexList:
found=1
break
if not found: continueshader = mat.getShader()
if shader != None:
if not shader.isValid():
shader.setSource(VertexShader, FragmentShader,1)shader.setAttrib(g.SHD_TANGENT)
shader.setUniformDef(‘mvi’, g.MODELVIEWMATRIX_INVERSE)
shader.setSampler(‘color’, 0)
shader.setSampler(‘bump’, 1)
shader.setSampler(‘gi’,2)
shader.setSampler(‘h’, 0)
mesh_index += 1
mesh = obj.getMesh(mesh_index)
Aclaro que de GLSL se muy poco, cási nada dirÃa yo pero leyendo algunos tutoriales y viendo otros scripts, y tratando de encontrarle algo de lógica al asunto he tenido algo de suerte y algunas cosas han resultado después de varias horas de estar sentado averiguando pero hasta el momento no tengo exactamente lo que necesito y espero poder tenerlo listo para poder continuar con otras cosas, porque aun falta mucho
Regresando al script anterior, el problema con este es que al parecer no me respeta la asignacion de UVs que tengo para el mapa de iluminacion..
Samplers:
uniform sampler2D color;
uniform sampler2D bump;
uniform sampler2D gi;vec2 texUV, srcUV = gl_TexCoord[1].xy;
vec2 texUV2=gl_TexCoord[2].xy;
texUV y texUV2 son los diferentes canales de textura segun he visto cuando compila, el primero para el mapa de color y para el normal map, el segundo solamente para el light map.
vec4 colormap = texture2D(color, texUV);
vec4 gimap = texture2D(gi,texUV2);
Se asigna a la variable de punto flotante con sus respectivos canales de UVs y samplers…
vec4 gi_pass = colormap*gimap;
Y multiplico el mapa de color por el mapa de iluminación pero por alguna razon no esta funcionando bien un canal UVs y la carga de la imagen 0 (colormap, aunque si se ve cuando compilo :S) , espero esta noche corregirlo y terminarlo y despues de un rato más de desarrollo espero poner algunas capturas de pantalla por aqui
Hora de trabajar..
Rafa, aguántame con la música!
No llego a neófito de GLSL :O. Me alegra que sea estable esta versión de Blender en los videojuegos :D.
Hot cakes, take your time… ya te tocará esperarme :p .
Jaja…. por eso no me quiero tardar demasiado, porque la fecha de entrega se viene encima :S, espero no demorar mas
Salutes
?? jeje
}:D ese omar un gears o q miedo jajajja
Jajaja ese ozipi on tabas! nomas te desapareciste(s) ya tienes micro?,,, por el momento ando sin xbox, pero espero en un par de meses ya este de regreso