Sei que essa pergunta pode parecer um pouco fácil de responder, mas isso está me deixando louco. Existem muitas situações possíveis que um bom mecanismo de mistura alfa deve lidar e, para cada algoritmo em que consigo pensar, falta algo.
Estes são os métodos que eu pensei até agora:
Antes de pensar sobre a classificação dos objetos por profundidade, este simplesmente falha porque os Objetos não são formas simples, podem ter curvas e podem fazer um loop entre si. Portanto, nem sempre posso dizer qual é a mais próxima da câmera.
Então pensei em classificar triângulos, mas este também pode falhar. Embora não tenha certeza de como implementá-lo, há um caso raro que pode causar novamente um problema, no qual dois triângulos se cruzam. Mais uma vez, ninguém pode dizer qual deles está mais próximo.
A próxima coisa foi usar o buffer de profundidade, pelo menos a principal razão pela qual temos um buffer de profundidade é devido aos problemas de classificação que mencionei, mas agora temos outro problema. Como os objetos podem ser transparentes, em um único pixel, pode haver mais de um objeto visível. Então, para qual objeto devo armazenar a profundidade de pixels?
Então pensei que talvez eu possa armazenar apenas a profundidade do objeto mais frontal e, usando isso, determine como devo misturar as próximas chamadas de desenho nesse pixel. Mas, novamente, houve um problema, pense em dois planos semitransparentes com um plano sólido no meio deles. Eu ia renderizar o plano sólido no final, pode-se ver o plano mais distante. Observe que eu iria mesclar a cada dois planos até restar apenas uma cor para esse pixel. Obviamente, também posso usar métodos de classificação por causa dos mesmos motivos que expliquei acima.
Finalmente, a única coisa que imagino poder trabalhar é renderizar todos os objetos em diferentes destinos de renderização, classificar essas camadas e exibir a saída final. Mas desta vez não sei como posso implementar esse algoritmo.