Yang Anda inginkan adalah mengikat tekstur ke shader dan kemudian membuat tekstur itu. Saya bisa meludahi mil dari spesifikasi dokumentasi OpenGL, tapi saya akan memberikan perasaan yang diberikan oleh saya:
Saya pikir itu tidak mungkin.
Apa yang saya tahu adalah mungkin, namun, adalah bahwa Anda membuat Frame Buffer Object (FBO) dan membuat itu. Pertama, Anda harus membuat FBO dan melampirkan tekstur dengan ukuran yang sama dengan yang ingin Anda perbarui.
GLuint fbo_handle, fbo_texture_handle;
GLuint texture_width = GetTextureWidth();
GLuint texture_height = GetTextureWidth();
// generate texture
glGenTextures(1, &fbo_texture_handle);
glBindTexture(GL_TEXTURE_2D, fbo_texture_handle);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, texture_width, texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
// generate framebuffer
glGenFrameBuffers(1, &fbo_handle);
glBindFrameBuffer(GL_FRAMEBUFFER, fbo_handle);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_texture_handle, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
LOG_ERROR("Could not validate framebuffer);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Ketika Anda ingin memperbarui tekstur Anda, Anda harus mengambil langkah-langkah berikut.
Pertama, Anda lampirkan FBO:
glBindFramebuffer(GL_FRAMEBUFFER, fbo_handle);
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(0, 0, texture_width, texture_height);
Sekarang Anda dapat membuat quad layar penuh dengan shader yang menampilkan warna yang diperbarui:
vec4 frag_texture = texture2D(TextureID, gl_TexCoord[TextureIndex].st);
vec4 frag_updated = frag_texture + vec4(0.0, 0.0, 0.0, AlphaPatch);
gl_FragData[0] = frag_updated;
Dan kemudian Anda harus menyalin framebuffer yang dihasilkan ke tekstur asli.
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_handle);
glBindTexture(GL_TEXTURE_2D, original_texture_handle);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texture_width, texture_height);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glPopAttrib();
Namun, Anda harus mempertimbangkan hal berikut:
- Seberapa sering Anda memperbarui tekstur ini?
- Jika Anda tidak harus memperbarui setiap frame, apakah metode ini sepadan dengan penalti kecepatan?
- Bisakah Anda menghasilkan beberapa versi dari tekstur dan siklus di antara mereka?
- Apakah ada cara lain untuk mencapai efek yang sama?
Jika perangkat keras Anda mendukungnya, ekstensi GL_ARB_shader_image_load_store memungkinkan Anda menulis ke suatu tekstur.
sumber
GL_EXT_shader_image_load_store
. Itu artinya jawaban Anda mungkin benar, tetapi belum praktis di lapangan. Menyebalkan. :(Ya itu mungkin, tekstur / imageLoad untuk membaca dan imageStore untuk menulis.
sumber