CPU-GPU-hibrit bir JPEG kodlayıcı oluşturmaya çalışmak için IOS üzerinde bazı hileler oynuyorum. CPU'yla yaptığım testlerden, DCT'yi yapmak için GPU kullanmanın ve niceleme adımlarının iyi bir anlam ifade ettiğini ve performansın önemli ölçüde artmasını sağladığına inanıyorum (çok sayıda JPEG'i sıkıştırmak, benim app'ımdaki şişe boynunu sıkıştırmaktır). GPGPU hesaplamalarında mükemmel sonuçlar elde etmek için kullanmış olduğumdan, dönüşüm geri bildirimi ile bu yapılmalıdır. Zor kısım, verilere (imzasız int8'ler RGBA) nasıl verimli bir şekilde ulaşılacağıdır. belirtildiği gibiOpenGL ES 3.0 içinde tamsayı/bayt doku verileri "olduğu gibi" getiriliyor
ben GPGPU işlem yapmak OpenGL ES 3.0 kullanmak için kullanılır, bu yüzden sadece şamandıra noktalı dokuları ile deneyime sahip olan
ile shaderlara teslimglTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,WIDTH,HEIGHT,0,GL_RGBA,GL_GLOAT,data);
tarafından belirlenen alma ve bir
texelFetch()
Fakat şimdi giriş verilerim imzalanmamış bayt dizisi (veya uint8) olarak depolanıyor ve her seferinde 64 tanesi sırayla almam gerekiyor. Onları imzasız baytların bir dokusu olarak ya da daha etkin bir şekilde, imzasız tam sayıların bir dokusu olarak getirebilirim ve sonra bunları bit vardiyalarıyla ayırabilirim.
Sorum şu ki, aslında bunlardan birini nasıl yaparım? Daha spesifik olarak, internalFormat, biçimi ve tip glTexImage2D() için nasıl ayarlamalıyım? Çok fazla kombinasyon denedim ama hepsi gölgelendiricilerde sadece 0 veriyor ve veri kaynağını hiç sıfır olmadıkları için çift kontrol ettim.
Normal bir RGBA için piksel başına 4 bayta sahipsiniz. GlTexImage2D(), vec4 bileşeninin her biri bu baytın birini temsil ettiğinden, bayt bayt olarak almak için kullanılabilir.Değerler normalize edilir, bu nedenle baytları temsil eden bir tamsayı değeri elde etmek için 255 ile çarpmanız gerekir. Böylece glTexImage2D() için 16 (64/4) çağrı yaparak 64 bayt alabilirsiniz. Yoksa burada bir şey mi özlüyorum? –
Üzgünüz, glTexImage2D(). Shader'daki texel getiriyi kastediyorum. –
Evet, bu benim planımdı. Bu konuda sahip olduğum problem, imzasız bayt olarak depolanmış dokuların nasıl alınacağını bilmem (veya bunun için glTexImage2D'yi nasıl yapılandıracağımı bilmem). Mümkünse plan-A'ya atlamayı çok isterim, burada bir tek bayt yerine bir "piksel" olarak bir tamsayı (dört bayt) alıyorum, bu da 64/4/4 = 4'e getirme sayısını azaltacaktır. –