Saya mencoba mempelajari OpenGL ES 2.0 dan saya bertanya-tanya apa praktik yang paling umum untuk "mengelola" shader.
Saya mengajukan pertanyaan ini karena dalam contoh yang saya temukan (seperti yang termasuk dalam Demo API yang disediakan dengan SDK Android), saya biasanya melihat segala sesuatu di dalam kelas GLRenderer dan saya lebih suka memisahkan hal-hal sehingga saya dapat memiliki, misalnya, objek GLImage yang dapat saya gunakan kembali kapan pun saya ingin menggambar quad bertekstur (saya fokus pada 2D hanya saat ini), sama seperti yang saya miliki dalam kode OpenGL ES 1.0 saya. Di hampir setiap contoh yang saya temukan, shader hanya didefinisikan sebagai atribut kelas. Sebagai contoh:
public class Square {
public final String vertexShader =
"uniform mat4 uMVPMatrix;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec4 aColor;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vColor = aColor;\n" +
"}\n";
public final String fragmentShader =
"precision mediump float;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_FragColor = vColor;\n" +
"}\n";
// ...
}
Saya minta maaf sebelumnya jika beberapa dari pertanyaan ini bodoh, tetapi saya belum pernah bekerja dengan shader sebelumnya.
1) Apakah kode di atas cara umum untuk mendefinisikan shader (properti kelas akhir publik)?
2) Haruskah saya memiliki kelas Shader yang terpisah?
3) Jika shader didefinisikan di luar kelas yang menggunakannya, bagaimana saya tahu nama atribut mereka (mis. "AColor" pada bagian kode berikut) sehingga saya dapat mengikatnya?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");
sumber
Manajemen Shader (dan karenanya material) adalah masalah yang agak rumit yang Anda hadapi ketika sistem grafis Anda menjadi lebih kompleks dan Anda melihat pengkodean yang keras setiap shader akan menyebabkan duplikasi kode besar-besaran. Berikut adalah beberapa cara alternatif untuk menyelesaikannya:
Adapun atribut dan nama seragam dan semacamnya, Anda hanya menggunakan penamaan yang konsisten di semua shader.
sumber