Pergi ke kandungan

OpenGL/2 Dimensi Segi Tiga

Daripada Wikibuku
   #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;

}