Apa perbedaan antara texelFetch dan tekstur OpenGL?

18

Saya memahami perbedaan utama antara texelFetchdan texture, tetapi memiliki beberapa pertanyaan tentang detailnya:

  • Apakah texelFetchmelibatkan penalti kinerja? Seperti tidak menggunakan cache atau semacamnya?
  • Apakah texelFetchdan texturedapat dipertukarkan saat menggunakan GL_NEAREST?
Martin Perry
sumber
1
Anda bisa menulis test case dan lihat ...
ThorinII
1
Apakah Anda lupa menandai jawaban sebagai diterima, atau apakah ini masih merupakan masalah terbuka?
Anko

Jawaban:

23

texelFetchsangat berbeda dari texture.

textureadalah fungsi akses tekstur biasa yang menangani penyaringan dan [0,1]koordinat tekstur yang dinormalisasi . texelFetchlangsung mengakses texel pada tekstur (tanpa filter) dengan menggunakan koordinat yang tidak dinormalisasi (mis. (64,64)pada texel middle-ish dalam tekstur 128x128 vs (.5,.5)dalam koordinat yang dinormalkan).

Sean Middleditch
sumber
4
+1 Saya ingin menambahkan bahwa texelFetch dimaksudkan untuk akses data ketika tekstur tidak secara khusus dimaksudkan untuk ditampilkan sebagai gambar, tetapi tipe data lainnya, tidak seperti tekstur yang mengakses texel ketika seharusnya digunakan sebagai gambar, itu sebabnya ia menggunakan penyaringan dll. -
concept3d
Apakah ada perbedaan kinerja?
Lenar Hoyt
1
@ MCB: mungkin, tapi saya tidak berharap itu menjadi sangat besar, dan itu mungkin akan sangat bervariasi oleh vendor perangkat keras. Kinerja adalah metrik yang benar-benar salah untuk digunakan saat memutuskan fungsi mana yang akan dipanggil: gunakan salah satu yang benar untuk situasi Anda (Anda memerlukan penyaringan perangkat keras dan karenanya harus menggunakan textureatau Anda memerlukan perangkat keras untuk tidak melakukan penyaringan dan karenanya harus menggunakan texelFetch).
Sean Middleditch
3
@SeanMiddleditch Bagaimana kinerja metrik yang salah dalam kasus ini? Jika texelFetchlebih cepat, dan penyaringan tetangga terdekat sudah mencukupi, Anda tidak dapat mengubah konteks menjadi penyaringan NN karena alasan apa pun, masuk akal untuk lebih memilihnya texture.
Lenar Hoyt
@ mcb: texelFetchdan texturebekerja secara berbeda dengan cara mendasar. Lihat juga input: koordinat tekstur vs koordinat normal. Mereka melayani tujuan yang berbeda. Yang satu bukan hanya optimasi yang lain.
Sean Middleditch
6

Karena tidak ada jawaban yang diterima saya menambahkan beberapa info, saya hanya ingin menambahkan hal-hal yang belum dikatakan oleh Sean dalam jawabannya.

TexelFetch memperlakukan tekstur sebagai Gambar, sehingga Anda dapat mengakses konten piksel dengan tepat. Anda biasanya melakukan itu ketika Anda membutuhkan konten itu, yang dalam beberapa kesempatan tetapi bermanfaat:

  • Filter pemrosesan pos tertentu (Guassian blur mengeksploitasi interpolasi sampel tekstur dan karenanya tidak dapat menggunakan TexelFetch)
  • Ketika simpul perlu membaca data dari tekstur dan itu adalah operasi tergantung pada 2 koordinat

Tex2D memperlakukan tekstur sebagai tekstur. Anda tidak menginginkan konten yang tepat dari suatu piksel, tetapi Anda menginginkan hasil yang paling realistis. Pembacaan tekstur standar adalah operasi yang sangat kompleks dan melibatkan pembacaan data yang diinterpolasi dari satu atau lebih level mipmap dan kemudian diinterpolasi lagi. Semua operasi mahal itu untuk menghindari artefak visual.

GL_NEAREST tidak akan berfungsi sama karena pada poligon terjauh Anda membaca data di tingkat mipmap yang lebih kecil, yang bukan data persis yang sama dengan yang Anda baca dari pengambilan texel.

Ada satu kasus di mana Tex2D (hampir) bekerja sama dengan TexelFetch:

  1. filter adalah GL_NEAREST
  2. Anda menggunakan piramida mipmap tidak lengkap dengan 1 level
  3. UV Anda bukan komponen vertex yang dinormalkan (tetapi Anda harus menormalkannya dalam shader)
GameDeveloper
sumber