Cara membalikkan warna piksel latar belakang

10

Saya sedang menulis game dan editor peta menggunakan Java dan jMonkeyEngine. Di editor peta, saya mendapat sikat yang dilakukan oleh wireframed sphere. Masalah saya adalah: Saya ingin membuatnya terlihat di mana-mana, jadi saya ingin membalikkan warna piksel "di belakang" kuas ini. Saya ingin melakukannya dengan fragment shader (GLSL), tapi saya tidak tahu cara mendapatkan warna dari piksel ini.

m4tx
sumber
Apakah jMonkeyEngine mendukung efek pasca-proses? Anda mungkin harus pergi dengan cara ini.
sam hocevar
Ya, jMonkeyEngine mendukung efek pasca-proses, tapi saya tidak terlalu mengenalnya saat ini. Terima kasih atas sarannya.
m4tx
Mmmh, tidak apa-apa, ada cara yang lebih sederhana. Saya akan mencoba menjawab dengan benar.
sam hocevar
Bisakah Anda menggunakan glLogicOp (GL_XOR)? opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
Adam
1
Perhatikan bahwa inversi tidak menjamin visibilitas Anda dalam sejumlah besar kasus sudut, seperti abu-abu tidak jenuh, dan memberikan visibilitas yang buruk untuk banyak kasus lainnya.
Lars Viklund

Jawaban:

15

Cara cepat dan mudah untuk melakukan ini adalah dengan menggunakan persamaan pencampuran standar dengan parameter berikut:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);

Jika srcadalah warna sumber (yang dari objek baru Anda) dan dstmerupakan warna tujuan (yang ada di framebuffer) itu akan menghitung warna baru sebagai berikut:

new = src * (1 - dst) + dst * 0
    = src * (1 - dst)

Jadi, Anda hanya perlu mengatur src = 1, yaitu. putih, dan Anda akan mendapatkan video terbalik. Shader fragmen GLSL akan:

void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
sam hocevar
sumber
4
Kedengarannya seperti Anda tahu alpha blending Anda!
bobobobo