estou usando DirectShow.NET para pegar os frames de um vídeo que vem em RGB (24 bits) e aplicar como textura em um objeto 3D usando OpenGL.
Até ai tudo ia a mil maravilhas, até que um indivíduo pediu transparência.
Escolhi uma cor então como sendo transparência, e varro a imagem, pixel por pixel, copiando os valores R, G e B para um novo vetor prealocado que comporta os canais R, G, B e A, onde o A eu calculo a partir dos R, G e B. Sei que é um modo burro de fazer, mas sinceramente não sei trabalhar com o tal do DOT NET, sei C/C++ e java, mas me passaram o projeto começado com C#, daí tô fazendo nele.
Isso tudo não seria problema se eu não tivesse usando C# com SampleGrabber do DirectShow e a operação de cópia e cálculo do vetor com Alpha não fosse tão lerdo. Está funcionando, mas preciso otimizar.
Acho que não dá pra usar Buffer.BlockCopy porque copia blocos inteiros pois eu preciso inserir o tal do alpha. Isso valeria também pra Marshal.copy... estou errado?
Fazer em C++ a essa altura... se eu tivesse tempo daria, mas não vou ter.
Já tô usando threads para otimizar isso, mas tá comendo a cpu inteira...
Pensei em usar Emgu/OpenCV pra fazer isso pois já tô usando ele noutra parte do software, mas pelo que vi, o Emgu fica instanciando imagens com o seu equivalente do cvcopy, isso não resolveria....
Passar tudo pro escopo estático e otimizar não dá pois a alocação do player de textura é dinâmico e depende do objeto 3D que eu desenho na tela.
Alguém tem alguma sugestão?