Sto scrivendo un'app che rende un'isola casuale alberata. Gli alberi sono attualmente due quadrupli, incrociati e disegnati con trame. Ho in programma di avere maglie più complesse che formano diversi tipi di piante, ad esempio una palma, una quercia, erbe ecc.
Il problema che devo affrontare è che, poiché le trame sono trasparenti, devo disegnarle da dietro a davanti. Plan-b consiste nel chiamare l'uso di scartare nello shader di frag, ma l'ordine z dà risultati migliori:
uniform float uTreeAlpha;
uniform sampler2D uTexture;
varying vec2 vTexCoordOut;
void main (void)
{
vec4 colour = texture2D(uTexture, vTexCoordOut);
if (colour.a < 0.1) {
discard;
}
gl_FragColor = vec4(colour.rgb, colour.a * uTreeAlpha);
}
Il secondo problema è perché l'ordine cambia a seconda della fotocamera e del lookat Non conosco un modo efficiente per disegnarli in OpenGL in una sola chiamata.
Al momento il mio codice di rendering è simile a questo pseudocodice:
if cameraChangedFromLastTime() then
sortTreesBackToFront();
end
for i = 0 to trees.size() -1
drawTree()
end
Dove ogni drawTree () imposta alcune uniformi, imposta la trama e quindi chiama glDrawArrays (). Ho alcune ottimizzazioni per saltare l'impostazione di una trama o l'aggiornamento dei cordoni di trama se l'ultimo albero e la corrente sono uguali e l'impostazione di alcune uniformi comuni al di fuori del ciclo e di saltare alberi che sono troppo lontani ma fondamentalmente se ho 3000 alberi andare 3000 volte intorno al ciclo.
Disegnare ogni albero singolarmente è il killer delle prestazioni. Se potessi disegnarli in una sola chiamata, o lotti (preservando l'ordine Z) probabilmente lo farei in 1/10 del tempo.
Quindi come lo farei. Tieni presente che i miei alberi sono segnaposto e alla fine avrei:
- Maglie diverse per alberi diversi
- Diverse scale e angoli per gli alberi per dare un po 'più di varietà
- Trame diverse per alberi diversi, trame potenzialmente multiple applicate a una mesh (ad esempio lascia una trama, tronco un'altra)
- Gli alberi sono tutti mescolati insieme, quindi nessun modo semplice per disegnare un tipo e poi un altro
- Qualche forma di semplice animazione ciclica (rami che soffiano nel vento)
- Tutte le trame risiederebbero in un unico atlante
Quindi qual è l'approccio migliore qui? È possibile eseguire il rendering in un unico passaggio? Se avessi usato glDrawElements, ricostruendo gli indici ma non i vertici, avrei potuto raggiungere questo obiettivo?