Untitled
unknown
plain_text
7 days ago
5.5 kB
6
Indexable
Never
#define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include <GL/glew.h> #include <GL/freeglut.h> #include <iostream> // Variabel untuk menyimpan ID tekstur GLuint textureHouseID; GLuint textureDoorID; GLuint textureWindowID; GLuint textureRoofID; GLfloat yOffset = -0.3f; // Nilai negatif untuk menggeser rumah ke bawah // Fungsi untuk memuat tekstur dengan tambahan parameter wrapping GLuint loadTexture(const char* filename, GLenum format, GLenum wrapMode) { int width, height, nrChannels; unsigned char* data = stbi_load(filename, &width, &height, &nrChannels, 0); if (data) { GLuint textureID; glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_2D, textureID); // Gunakan format yang sesuai glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data); // Atur wrapping ke GL_CLAMP_TO_EDGE untuk mencegah stretch glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode); // Sumbu X glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode); // Sumbu Y // Set filter untuk scaling glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glGenerateMipmap(GL_TEXTURE_2D); stbi_image_free(data); return textureID; } else { std::cout << "Failed to load texture: " << stbi_failure_reason() << std::endl; return 0; } } // Fungsi untuk menggambar kotak bertekstur // Variabel global untuk menggeser rumah ke bawah // Fungsi untuk menggambar kotak bertekstur dengan offset void drawTexturedBox(GLuint textureID, float x, float y, float width, float height, float texRepeatX = 1.0f, float texRepeatY = 1.0f) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textureID); glBegin(GL_QUADS); // Pastikan pengaturan UV mapping tidak menyebabkan stretch glTexCoord2f(0.0f, texRepeatY); glVertex2f(x, y + yOffset); // Kiri bawah glTexCoord2f(texRepeatX, texRepeatY); glVertex2f(x + width, y + yOffset); // Kanan bawah glTexCoord2f(texRepeatX, 0.0f); glVertex2f(x + width, y + height + yOffset); // Kanan atas glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y + height + yOffset); // Kiri atas glEnd(); glDisable(GL_TEXTURE_2D); } void drawTexturedRoof(GLuint textureID, GLfloat roofWidth, GLfloat roofHeight) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textureID); glBegin(GL_TRIANGLES); // Atur UV mapping dan koordinat vertex segitiga glTexCoord2f(0.0f, 0.0f); glVertex2f(-roofWidth / 2.0f, 0.5f + yOffset); // Kiri bawah glTexCoord2f(1.0f, 0.0f); glVertex2f(roofWidth / 2.0f, 0.5f + yOffset); // Kanan bawah glTexCoord2f(0.5f, 1.0f); glVertex2f(0.0f, 0.8f + roofHeight + yOffset); // Puncak segitiga (tengah atas) glEnd(); glDisable(GL_TEXTURE_2D); } // Fungsi untuk menggambar atap segitiga dengan offset void drawRoof(GLfloat roofWidth, GLfloat roofHeight) { // Set warna atap (misalnya merah) glColor3f(1.0f, 0.0f, 0.0f); // Warna merah untuk atap glBegin(GL_TRIANGLES); // Koordinat vertex segitiga untuk atap dengan offset Y glVertex2f(-roofWidth / 2.0f, 0.5f + yOffset); // Kiri bawah glVertex2f(roofWidth / 2.0f, 0.5f + yOffset); // Kanan bawah glVertex2f(0.0f, 0.8f + roofHeight + yOffset); // Puncak segitiga (tengah atas) glEnd(); // Kembalikan warna ke default (putih) untuk objek lain glColor3f(1.0f, 1.0f, 1.0f); // Kembalikan warna ke putih } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Gambar rumah dengan tekstur, digeser ke bawah drawTexturedBox(textureHouseID, -0.5f, -0.5f, 1.0f, 1.0f); // Gambar pintu dengan tekstur, digeser ke bawah drawTexturedBox(textureDoorID, -0.1f, -0.5f, 0.2f, 0.4f); // Gambar jendela kiri dan kanan, digeser ke bawah drawTexturedBox(textureWindowID, -0.4f, 0.1f, 0.2f, 0.3f); drawTexturedBox(textureWindowID, 0.2f, 0.1f, 0.2f, 0.3f); // Gambar atap (segitiga) dengan tekstur drawTexturedRoof(textureRoofID, 1.5f, 0.3f); glDisable(GL_BLEND); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Textured House with Textured Roof"); GLenum err = glewInit(); if (GLEW_OK != err) { std::cerr << "Error: " << glewGetErrorString(err) << std::endl; return 1; } // Muat tekstur dengan wrapping berbeda textureHouseID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/Debug/base.png", GL_RGBA, GL_CLAMP_TO_EDGE); // Tekstur rumah textureWindowID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/Debug/jendela.jpg", GL_RGB, GL_CLAMP_TO_EDGE); // Tekstur jendela textureDoorID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/telolet.png", GL_RGB, GL_CLAMP_TO_EDGE); // Tekstur pintu textureRoofID = loadTexture("D:/ProgramFiles/VisualStudioProjek/Home/Debug/roof.jpg", GL_RGB, GL_CLAMP_TO_EDGE); // Tekstur atap glutDisplayFunc(display); glutMainLoop(); return 0; }
Leave a Comment