OpenGL/2 Dimensi Segi Tiga
#include <stdlib.h>
#include <GL/glut.h>
Dalam program grafik OpenGL, kita perlu memasukkan fail utama dan kebanyakan aplikasi memerlukan GLU untuk perpustakaan utama OpenGL. Namun begitu, jika kita menggunakan GLUT untuk mengawal operasi pengurusan tingkap (window-managing operation) kita tidak lagi memerlukan gl.h dan glu.h kerana GLUT akan memastikan operasi pengurusan tingkap itu dimasukkan dengan betul. Di samping itu, kita akan selalu memerlukan fail utama yang diperlukan oleh kod C++.
GLubyte texture[] = {
0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80,
};
Penetapan kod
void reshape(int width, int height)
{
glViewport(0, 0, width, height);// Menyatakan parameter koordinat skrin untuk viewport
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //setkan matrik kepada identiti
gluPerspective(60.0, 1.0, 0.1, 1000.0);
Fungsi ini diperlukan untuk mengeset jenis unjuran (projection type) dan penglihatan parameter lain yang diperlukan. Spesifik unjuran segitiga ialah digunakan untuk isi kandungan peta 2-dimensi kawasan segi empat tepat kepada dunia koordinat di skrin, dan nilai x-koordinat dalam segi empat tepat ini dari 60.0 kepada 1.0 dengan nilai y-koordinat dalam jarak dari 0.1 kepada 1000.0. Apa-apa projek yang dimaksudkan dalam dunia koordinat segi empat tepat yang ditunjukkan dalam paparan tingkap. Apa-apa di luar jarak koordinat tidak akan dipaparkan. Oleh itu, fungsi GLU gluPerspective menerangkan lingkungan rujukan koordinat dalam paparan tingkap menjadi (60.0,0.1) di bawah-kiri selekoh paparan tingkap dan (1.0,1000.0) di atas-kanan selekoh tingkap. Disebabkan kita hanya menerangkan tentang objek 2-dimensi, unjuran segitiga tidak mempunyai kesan lebih untuk “paste” gambar kepada paparan tingkap yang diterangkan terdahulu.kita menggunakan dunia-koordinat segi empat tepat dengan aspek nisbah yang sama seperti paparan tingkap. Jadi, tiada pemutarbelitan kepada gambar. Kita akan menitikberatkan bagaimana untuk mengekalkan aspek nisbah yang tidak bergantung spesifik paparan tingkap.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
// Kedudukan paparan objek
glEnable(GL_COLOR_MATERIAL);
// Mengaktifkan warna objek
glEnable(GL_LIGHTING);
// Mengaktifkan pengcahayaan
glEnable(GL_LIGHT0);
// Mengaktifkan cahaya
glEnable(GL_TEXTURE_2D);
// Mengaktifkan tekstur 2D
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//Setkan mod penyimpanan pixel
glTexImage2D(GL_TEXTURE_2D, 0, 3, 4, 4, 0,
GL_RGB, GL_UNSIGNED_BYTE, texture);
//menyatakan parameter untuk setkan ruang tekstur 2 dimensi
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//menyatakan parameter untuk rutin pemetaan tekstur
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//menyatakan parameter suasana tekstur seperti mencampurkan warna untuk pemetaan tekstur
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
//Untuk mengarahkan paparan warna tingkap, kita perlu memohon fungsi ini.Perbincangan ini ialah OpenGL simbol untuk spesifikkan nilai di dalam “colour buffer” yang perlu di set kepada nilai-nilai yang menunjukkan dalam fungsi glClearColor.
glColor3ub(255, 255, 255);
//warna cyan terhasil
glBegin(GL_TRIANGLES);
glNormal3f(0.0, 0.0, 1.0);
//pembahagian kotak
glColor3ub(255, 0, 0);
// warna cyan merah terhasil
glTexCoord2f(0.5, 1.0);
// pembahagian koordinat tekstur
glVertex2f(0.0, 2.0);
//pembahagian verteks
glColor3ub(0, 255, 0);// warna cyan hijau terhasil
glTexCoord2f(0.0, 0.0);
glVertex2f(-2.0, -2.0);
glColor3ub(0, 0, 255);//warna cyan biru terhasil
glTexCoord2f(1.0, 0.0);
glVertex2f(2.0, -2.0);
glEnd();
// kod ini menyatakan bahagian 2-dimensi “segitiga” dengan integer titik pengakhiran “cartesian” (0.0, 0.0, 1.0),
glFlush();
//Untuk memproses kesemua rutin OpenGL secepat mungkin yang boleh.
}
int main(int argc, char** argv)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//kita boleh mengubah posisi dan saiz. Kita juga boleh mengeset nombor pilihan lain untuk memaparkan window(display window), contohnya penampan(buffering) dan pilihan jenis warna dengan glutInitDisplayMode fungsi. Alas an (arguments) untuk rutin diarahkan simbolik GLUT malar(constant). Untuk contoh, arahan yang spesifik yang satu-satunya menyegarkan penampan adalah digunakan untuk memaparkan tingkap dan hendak menggunakan jenis warna yang digunakan adalah merah, hijau dan biru (RGB) komponen untuk dipilih nilainya
glutInitWindowPosition(50, 50);
// Memberi nilai pengawalan tempat untuk dibelah atas kiri corner dipaparan window. Posisi ialah spesifik dalam integer skrin koordinat, yang menjadi titik asalan di atas kiri corner untuk dipaparan tingkap.50 pixels ke kanan kepada pinggir kiri di skrin dan 50 pixels bawah daripada atas pinggiran skrin.
glutInitWindowSize(320, 320);
//Digunakan untuk mengeset pixel awalan lebar dan tinggi untuk paparan tingkap dengan nilai awalan lebar 320 dan tinggi 320 pixels.
glutInit(&argc, argv);
//Langkah pertama adalah untuk meletakkan awalan(initialize) GLUT. Fungsi permulaan boleh memproses mana-mana ayat perintah alasan (arguments) tetapi tidak memerlukan parameters untuk contoh program pertama.
glutCreateWindow("texture");
//Menyatakan bahawa paparan tingkap adalah untuk dicipta pada skrin dengan pemberian sarikata untuk tajuk.
glutDisplayFunc(display);
//Untuk spesifikkan kandungan tingkap. Untuk ini, kita mencipta gambar menggunakan OpenGL fungsi dan hantar gambar definisi kepada tingkap (window). Contohnya, sepatutnya kita memerlukan OpenGL kod untuk menggambarkan satu garis sekmen dalam prosedur yang dipanggil lineSegment.
glutReshapeFunc(reshape);
//menyatakan fungsi yang dipanggil apabila saiz tetingkap dipaparkan berubah
glutMainLoop();
//Ini diperlukan untuk menyempurnakan tingkap-pemprosesan operasi dan pelaksanaan penyataan tersebut, kesemua paparan tingkap yang dicipta termasuk kandungan grafik akan diaktifkan.
return 0;
}