Created
December 8, 2025 06:49
-
-
Save dirumahrafif/843a7a5180dbae003964c5850c4ec9cc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # --- Impor Modul --- | |
| from core.base import Base | |
| from core.openGLUtils import OpenGLUtils | |
| from core.attribute import Attribute | |
| from core.uniform import Uniform # Mengimpor kelas Uniform yang sudah dibuat. | |
| from OpenGL.GL import * | |
| class Test(Base): | |
| def initialize(self): | |
| print("Initializing program...") | |
| # --- Kode Vertex Shader --- | |
| vsCode = """ | |
| in vec3 position; // Input posisi vertex dari CPU. | |
| uniform vec3 translation; // Input uniform untuk menggeser posisi. | |
| void main() | |
| { | |
| // Posisi baru adalah posisi asli ditambah vektor pergeseran. | |
| vec3 pos = position + translation; | |
| gl_Position = vec4(pos.x, pos.y, pos.z, 1.0); | |
| } | |
| """ | |
| # --- Kode Fragment Shader --- | |
| fsCode = """ | |
| uniform vec3 baseColor; // Input uniform untuk warna dasar objek. | |
| out vec4 fragColor; // Output warna akhir piksel. | |
| void main() | |
| { | |
| // Atur warna piksel sesuai dengan uniform baseColor. | |
| fragColor = vec4(baseColor.r, baseColor.g, baseColor.b, 1.0); | |
| } | |
| """ | |
| # --- Inisialisasi Program dan VAO --- | |
| self.programRef = OpenGLUtils.initializeProgram(vsCode, fsCode) | |
| vaoRef = glGenVertexArrays(1) | |
| glBindVertexArray(vaoRef) | |
| # --- Atribut Vertex --- | |
| # Data vertex untuk sebuah segitiga. | |
| positionData = [ [0.0, 0.2, 0.0], [0.2, -0.2, 0.0], [-0.2, -0.2, 0.0] ] | |
| self.vertexCount = len(positionData) | |
| positionAttribute = Attribute("vec3", positionData) | |
| positionAttribute.associateVariable(self.programRef, "position") | |
| # --- Pengaturan Uniform --- | |
| # Membuat objek Uniform untuk menggeser segitiga pertama ke kiri. | |
| self.translation1 = Uniform("vec3", [-0.5, 0.0, 0.0]) | |
| self.translation1.locateVariable(self.programRef, "translation") | |
| # Membuat objek Uniform untuk menggeser segitiga kedua ke kanan. | |
| self.translation2 = Uniform("vec3", [0.5, 0.0, 0.0]) | |
| self.translation2.locateVariable(self.programRef, "translation") | |
| # Membuat objek Uniform untuk warna segitiga pertama (merah). | |
| self.baseColor1 = Uniform("vec3", [1.0, 0.0, 0.0]) | |
| self.baseColor1.locateVariable(self.programRef, "baseColor") | |
| # Membuat objek Uniform untuk warna segitiga kedua (biru). | |
| self.baseColor2 = Uniform("vec3", [0.0, 0.0, 1.0]) | |
| self.baseColor2.locateVariable(self.programRef, "baseColor") | |
| def update(self): | |
| glUseProgram(self.programRef) # Aktifkan program shader. | |
| # --- Gambar segitiga pertama --- | |
| self.translation1.uploadData() # Kirim data pergeseran ke kiri ke GPU. | |
| self.baseColor1.uploadData() # Kirim data warna merah ke GPU. | |
| glDrawArrays(GL_TRIANGLES, 0, self.vertexCount) # Gambar segitiga. | |
| # --- Gambar segitiga kedua --- | |
| self.translation2.uploadData() # Kirim data pergeseran ke kanan (menimpa nilai lama). | |
| self.baseColor2.uploadData() # Kirim data warna biru (menimpa nilai lama). | |
| glDrawArrays(GL_TRIANGLES, 0, self.vertexCount) # Gambar lagi dengan data vertex yang sama. | |
| Test().run() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from OpenGL.GL import * | |
| # Mendefinisikan kelas bernama Uniform. | |
| class Uniform(object): | |
| # Metode inisialisasi (constructor) yang dipanggil saat objek Uniform dibuat. | |
| def __init__(self, dataType, data): | |
| # Menyimpan tipe data (misal: "vec3", "float") sebagai string. | |
| self.dataType = dataType | |
| # Menyimpan data aktual yang akan dikirim ke GPU (misal: [1.0, 0.0, 0.0]). | |
| self.data = data | |
| # Referensi (lokasi memori) ke variabel uniform di GPU, awalnya None. | |
| self.variableRef = None | |
| # Metode untuk menemukan lokasi variabel uniform di dalam program shader. | |
| def locateVariable(self, programRef, variableName): | |
| # Menggunakan fungsi OpenGL untuk mendapatkan lokasi memori dari variabel uniform | |
| # dengan nama `variableName` di dalam program shader `programRef`. | |
| self.variableRef = glGetUniformLocation(programRef, variableName) | |
| # Metode untuk mengirim (upload) data dari CPU ke GPU. | |
| def uploadData(self): | |
| # Jika variabel tidak ditemukan di shader (lokasi = -1), hentikan proses. | |
| if self.variableRef == -1: | |
| return | |
| # Memeriksa `dataType` dan memanggil fungsi glUniform* yang sesuai. | |
| # Setiap fungsi ini mengirimkan data ke lokasi `self.variableRef` di GPU. | |
| if self.dataType == "int": | |
| glUniform1i(self.variableRef, self.data) | |
| elif self.dataType == "bool": | |
| glUniform1i(self.variableRef, self.data) | |
| elif self.dataType == "float": | |
| glUniform1f(self.variableRef, self.data) | |
| elif self.dataType == "vec2": | |
| glUniform2f(self.variableRef, self.data[0], self.data[1]) | |
| elif self.dataType == "vec3": | |
| glUniform3f(self.variableRef, self.data[0], self.data[1], self.data[2]) | |
| elif self.dataType == "vec4": | |
| glUniform4f(self.variableRef, self.data[0], self.data[1], self.data[2], self.data[3]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment