Skip to content

Instantly share code, notes, and snippets.

@dirumahrafif
Created December 8, 2025 06:49
Show Gist options
  • Select an option

  • Save dirumahrafif/843a7a5180dbae003964c5850c4ec9cc to your computer and use it in GitHub Desktop.

Select an option

Save dirumahrafif/843a7a5180dbae003964c5850c4ec9cc to your computer and use it in GitHub Desktop.
# --- 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()
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