Untitled
unknown
plain_text
a year ago
5.5 kB
11
Indexable
#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;
}Editor is loading...
Leave a Comment