Julio 22, 2020, 04:11:43 PM Ultima modificación: Agosto 11, 2020, 02:04:26 AM por DarkKRuleR
¡Buenas! Pues yo creo en Create de un objeto controlador modelos usando las funciones d3d_model_create, d3d_model_primitive_begin y d3d_model_vertex_texture. Entonces a la hora de dibujarlo con d3d_model_draw, yo puedo hacerle antes un draw_set_color y un draw_set_alpha sin problemas, y se aplica correctamente. El problema es cuando el modelo lo creo con d3d_model_vertex_texture_colour, pues es necesario que diferentes vértices tengan diferentes alphas y colores. Al dibujarlo, me ignora el draw_set_color y el draw_set_alpha.

Es NECESARIO usar modelos, pues sin ellos iría demasiado lento. Logré resolver esto creando 10 modelos distintos, copia, cada uno con colores distintos en los vértices, y llamando a cada uno según la situación, pero a futuro con otros modelos sería una locura seguir con esta técnica, y molaría hacer limpieza de modelos innecesarios. ¿Alguna forma de que un modelo con alphas y colores definidos en sus vértices, tenga en cuenta el draw_set_color y draw_set_alpha? Que el segundo se aplique, se sume, sobre el del modelo, básicamente. Igual que cuando tengo un sprite con colores distintos en distintos pixeles (modelo con colores distintos en distintos vertices) y le aplico el color encima con draw_set_color, etc.

Hola gusto en saludarlo.

Cuando las cosas se ponen dificiles en game maker, entonces hay que crear editores.

La tecnica que mencionas como locura es bastante genial si se mira desde un punto de vista distinto.

Dejame alardear un rato: "cuando el programador no puede programar del mismo modo porque la cantidad de codigos es exagerada entonces debe crear editores de codigo que hagan el trabajo pesado, entonces el programador ya no escribe codigos sino que contruye estructuras complejas presionando un par de botones".

Mi recomendacion es que sigas usando los 10 modelos, pero crea un editor de modelos 3D a tu medida, que facilite la creacion de estructuras arquitectonicas complejas y que devuelva el codigo necesario, el cual estaria compuesto por draw_set_color y draw_set_alpha.

Ahora bien, no estoy queriendo decir que contruyas un autocad 2020, solo un pequeño programa que ubique los 10 modelos en algun punto en el espacio 3D empleando el mouse y las teclas del cursor, donde se pueda definir sus colores y su alpha, inclusive su textura, presionando algunos botones de la interface. Luego que exista un boton llamado "generar codigo gmk" y que al presionarlo cree un archivo de texto con el codigo usado.



Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.

¡Buenas! Gracias, pero me expliqué mal. Da igual si creo los modelos manualmente o mediante una aplicación que yo haga. El problema es, que en ambos casos, debería usar d3d_model_vertex_texture_colour para definir colores en distintos puntos del modelo. Y al dibujar ese modelo, ignora mis draw_set_color, cuando quiero que se mezclen. Draw_set_alpha no sirve para esta tarea, pues debo definir el alpha (y color) de cada vértice con el método descrito, creo.

Tendrías que hacer tú mismo el cálculo del color resultante para cada vértice de los modelos. Se me ocurre algo así:

Para establecer el color y alpha de blending para los modelos tendrías que utilizar una variable global y un script diferente:
[gml]
///Algún evento create
global.color = c_white;
global.alpha = 1;
[/gml]
Luego, un script para establecer el color y alpha de blending para los modelos:
[gml]
///draw_set_color2(color, alpha);
global.color = argument0;
global.alpha = argument1;
[/gml]

Luego, un script para obtener el color resultante de la mezcla:
(GM utiliza el "darken blending mode", que selecciona el menor de los componentes de color RGB.)
[gml]
///color2(color);

return make_colour_rgb(
    min(colour_get_red(argument0), colour_get_red(global.color)),
    min(colour_get_green(argument0), colour_get_green(global.color)),
    min(colour_get_blue(argument0), colour_get_blue(global.color))
);
[/gml]
Y por último, un script para obtener el alpha resultante:
[gml]
///alpha2(alpha);
return argument0*global.alpha;
[/gml]

Ahora, cuando quieras dibujar figuras que respondan tanto a su color de vértice como al "color global", tendrías que hacer algo así:
[gml]
/// Evento Draw
draw_set_color2(c_yellow, 0.5);

d3d_primitive_begin(pr_trianglestrip);

d3d_vertex_colour(100, 100, 0, color2(c_white), alpha2(1));
d3d_vertex_colour(200, 200, 100, color2(c_gray), alpha2(1));
d3d_vertex_colour(150, 100, 200, color2(c_black), alpha2(1));

d3d_primitive_end();
[/gml]
Dibujé primitivas, pero creo que también funcionará en vértices de modelos.
alaberga regué el café.

BA:STFW&RTFM

Otra forma que se me ocurre es que las texturas tengan el color y transparencia adecuados para la zona en que se aplican. Pero seguro que esto va a complicar mucho el texturizado.

Otra opción es dibujar a traves  de un shader. No estoy seguro si los shader que sirven para colorear sprites en 2D sirven cuando se activa d3d.

#5 Julio 27, 2020, 08:27:38 PM Ultima modificación: Julio 28, 2020, 09:25:28 PM por DarkKRuleR
@bygdle, agradezco la explicación elaborada, pero (más o menos) eso es lo que ya hacía, y precisamente lo haces con primitivas.

CitarDibujé primitivas, pero creo que también funcionará en vértices de modelos.

Precisamente el problema es que con modelos NO funciona. Ignora totalmente el draw_set_alpha y draw_set_color y toma los definidos por el modelo, los inmutables.

@Clamud Sin duda... bastante complicado tengo ya las texturas como para eso xD Y serían demasiadas, tengo que tener muchos tonos de color. Lo del shader no entendí...

EDIT: Vale. Entre una cosa y otra lo he resuelto. Activé la fog en negro, y segun la distancia, los objetos se van oscureciendo, así que lo pude reducir a sólo 1 modelo donde ya no necesito que sus vértices tengan colores dinámicos, pues el fog ya lo hace. Aunque por si alguien sabe, dejo esto abierto, quizás a futuro hace falta para otra cosa...

Los shaders para sprites sí funcionan con modelos 3D.
Usé estos shaders
https://marketplace.yoyogames.com/assets/261/free-shaders

Probé de esta forma
[gml]
shader_set(shd_thermal);
    d3d_draw_ellipsoid(200, 200, 0, 400, 400, 300, -1, 1, 1, 8);
shader_reset();
[/gml]

Vale... al final resulta que draw_set_color sí funcionaba con modelos si usabas el draw vertex base SIN especificar color ni alpha... Al final encontré una forma de lograr mi efecto deseado sin especificar alpha en los modelos, y entonces me agarró el alpha global. La vida xD Gracias por todo. Lo de los shaders podría estar bien tenerlo en cuenta.