Warna tidak tercampur dengan baik di OpenGL ES

Saya mencoba merender 2 lingkaran (ringan) di OpenGL ES dalam 2D. Bagian tengahnya berwarna putih, pinggirannya berwarna hitam. Ini berfungsi dengan baik, selama tidak tumpang tindih:

masukkan deskripsi gambar di sini

Namun begitu mereka melakukannya, saya mendapatkan artefak ini:

masukkan deskripsi gambar di sini

Saya menggunakan glBlendFunc(GL_ONE, GL_ONE) dengan blending diaktifkan tentu saja.

Apa yang menyebabkan hal ini? Apakah ada cara untuk memperbaikinya?

Saya ingin mereka berbaur lebih seperti ini:

masukkan deskripsi gambar di sini

Terima kasih!


person DrummerB    schedule 05.08.2012    source sumber


Jawaban (2)


Apakah lingkaran Anda saat ini bergradien linier? Anda mungkin mendapatkan lebih sedikit artefak jika Anda memiliki kurva yang berbeda.

Namun, berdasarkan contoh Anda, sepertinya Anda menginginkan intensitas maksimum kedua lingkaran, bukan jumlah intensitasnya. Tampaknya penerapan OpenGL ES 2.0 Apple mendukung ekstensi EXT_blend_minmax, yang memungkinkan Anda menentukan bahwa nilai fragmen yang dihasilkan harus maksimal dari nilai masuk dan nilai yang ada. Mungkin mencobanya?

person Jesse Rusak    schedule 05.08.2012
comment
Ya, saya menggunakan gradien linier. Saya akan mencoba yang berbeda. - person DrummerB; 05.08.2012
comment
@DrummerB Saya telah menambahkan saran lain; ternyata semaksimal mungkin, setidaknya dengan perpanjangan. - person Jesse Rusak; 05.08.2012

Hasil yang Anda lihat persis seperti yang seharusnya dihasilkan untuk gradien linier. Petunjuk: Buka Photoshop atau GIMP, gambar dua gradien radial menjadi dua lapisan dan atur ke mode pencampuran "Penambahan". Ini akan terlihat persis seperti gambar Anda.

Efek seperti yang Anda inginkan diberikan dengan gradien persegi. Jika gradien Anda berada di kisaran 0…1, ambil kuadrat nilainya dan gambarlah ini. Anda dapat menerapkan sqrt nanti jika Anda ingin linierisasi gradien tunggal.

Bukan berarti ini adalah sesuatu yang tidak mudah dilakukan dengan menggunakan tahap blending; hal ini dapat dilakukan dengan menggunakan beberapa lintasan, tetapi sebenarnya lebih mudah menggunakan shader untuk menggabungkan lintasan dari dua FBO.

person datenwolf    schedule 05.08.2012