بتـــــاريخ : 3/1/2011 9:31:26 PM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 2127 0


    الالوان وأمور متعلقة بالرسم في opengl سلسلة هذا اللي اعرفه (3) :)

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : الشمري | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :
    الالوان الرسم opengl سلسلة

    الالوان وأمور اخرى متعلقة بالرسم (opengl )

    السلام عليكم ..

    نواصل الكلام .. في هذه السلسلة طيبة الذكر .. <_<


    الموضوع سهل :


    الالوان :
    اذا اردنا تلوين جسم ما نستخدم glColor ,,


    طبعا هناك نوعين رئيسين من الالوان يستخدمهما opengl ...

    RGBA
    RGB

    اذا اردت المزيد من الشرح ..
    http://www.arabteam2...showtopic=83756



    glColor3f (1.0, 0.0, 0.0);  

    glBegin (GL_POINTS);
        glVertex3fv (point_array);
    glEnd ();
    رسمنا نقطة .. وقبل ذلك اخترنا اللون .

    واضح ان اللون الذي اخترناه هو اللون الاحمر ..


    مثال اخر
      glLoadIdentity(); 
      glTranslatef(0,0,-3.0);
     
      glColor3f (1.0, 0.0, 0.0);  

      glBegin(GL_QUADS);

      glVertex3f(1,0,0);
           
      glVertex3f(-1,0,0);
           
      glVertex3f(-1,1,0);  

      glVertex3f(1,1,0);  

      glEnd();

    المربع لونه احمر .

    لكن اخر مدى للبارمترات هو العدد واحد يعني
    glColor3f (1.0, 1.0, 1.0); 
    لون ابيض وايضا

    glColor3f (221211.0, 23123121.0, 41242311.0); 

    لونه ابيض .. يعني هنا انت تتعامل مع الالوان .. ابتداء من صفر الى واحد ..
    فمثلا
      glColor3f (0.5, 1.0, 1.0); 
    يعطينا لون ازرق فاتح ..

    لكن


    توجد للدالة صيغة ثانية :

    glColor3b (GLbyte red, GLbyte green, GLbyte blue);

    والافضل .

    glColor3ub (GLbyte red, GLbyte green, GLbyte blue);
    اذا تستقبل عدد من صفر الى 255 وهذا مدى مريح نوعا ما .

    مثال
      glColor3ub (111, 222, 111); 


    في الكتاب الاحمر .. في الفصل الخامس جدول يوضح صيغ دالة الالوان . ومدى كل منها ..

    مثلا اللون الابيض تتغير قيمته بين هذه الصيغ الدوال .
      glColor3b (127, 127, 127);  
      glColor3ub (255, 255, 255);  
    glColor3f (1.0, 1.0, 1.0); 



    الامر مايحتاج كل ها التعقيد ,,,



    RGBA
    لون من اربع قنوات ... احمر اخضر ازرق و الفا ...

    نستخدمه اذا اردنا استخدام blending في الغالب .

    glColor4f( R ,G, B , A );






    • احيانا نريد تلوين الرؤوس
      glLoadIdentity(); 
      glTranslatef(0,0,-3.0);
     

      glBegin(GL_QUADS);

      glColor3ub (222, 12, 127);  
      glVertex3f(1,0,0);
           
      glColor3ub (111, 211, 222);  
      glVertex3f(-1,0,0);
           
      glColor3ub (255, 255, 0);  
      glVertex3f(-1,1,0);  

      glColor3ub (255, 0, 0);  
      glVertex3f(1,1,0);  

      glEnd();

    والنتيجة
    Posted Image






    لكن تستطيع اختيار
      glShadeModel(GL_FLAT);
    وبالتالي لن تستطيع تلوين رؤوس الشكل ..
    flat .. مسطح .



    واذا اردت تلوين رؤوس الشكل تضع

      glShadeModel(GL_SMOOTH);
    وهي الطريقة الافتراضية








    دوال متنوعة خاصة بالرسم :
    الدالة glPolygonModeفائدتها .. تغيير بعض خصائص المجسمات مثلا تغيير المجسم الى خطوط او نقاط او مجسم مملوء ,, يعني غير مجوف .. يعني مصبوغ... يعني FILL : )

    صيغتها :
     void APIENTRY glPolygonMode (GLenum face, GLenum mode);

    تطلب بارمترين الاول /
    اين تريد ان يقع التأثير ..
    انت امامك مجسم .. ونحن نتحدث عن عالم الثري دي .. 3d .. وبالتالي للمجسم وجهان امامي وخلفي ..
    هذا البارمتر يأخذ :
    GL_FRONT للتأثير على الجهة الامامية فقط
    GL_BACK للتأثير على الجهة الخلفية فقط من الشكل .
    GL_FRONT_AND_BACK للتأثير على كلا الجهتين .

    اما البارمتر الثاني فهو .
    GL_POINT يعني تريد المجسم ان يكون على شكل نقاط
    GL_LINE على شكل خطوط
    GL_FILL مجسم عادي .





    مثال
     static int angle=0;

      void Render()
    {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

     
      angle+=1;
      glPointSize(3);
     
      glLoadIdentity();
      glTranslatef(0,0,-3.0);
      glRotatef(angle,0,1,0);

      glPolygonMode(GL_FRONT ,GL_LINE );
          glPolygonMode(GL_BACK ,GL_POINT );
     
           
      glRectf(0,0,1,1);

    }



    الان لاحظ التطبيق في الجهة الامامية

    Posted Image


    المجسم صار عبارة عن خطوط ..

    في الجهة الخلفية

    Posted Image


    نقاط ...




    هل عرفت الفائدة الان : ) ,,,

    علما ان الخيار الافتراضي هو

    glPolygonMode(GL_FRONT_AND_BACK ,GL_FILL );

    حاول ان تغير القيم لتحصل على فهم اكثر ..



    الدالة glLineStipple
    هذه سبق ان سألت عنها :::

    راجع مواضيع الاخ حسن ::
    http://www.arabteam2...showtopic=82869

    واعتقد أني بدأت افهم طريقة عملها ..

    فائدتها اضافة تأثيرات الى الخط المرسوم مثلا .. خط منقط او خط مقطع الخ ..
    OpenGL Manual ..
    صيغة الدالة .
    void glLineStipple(GLint factor, GLushort pattern);



    امثلة :

    glLineStipple(1, 0x5555);
    هنا نرسم خط منقط .. غير الرقم واحد في البارمتر الاول الى ارقام اخرى .

    glLineStipple(4, 0x0C0F);
    غير البارمتر الاول الى ارقام اخرى .


    لكن لن تفعل هذه التأثيرات الا اذا قمت انت بتفعيلها ,,
    وذلك عن طريق الدالة المعروفة glEnable وتمرر لها بارمتر التفعيل الذي نريده وهو هنا
    GL_LINE_STIPPLE
    اما اذا اردت الغاء التفعيل glDisable وتمرر له البارمتر GL_LINE_STIPPLE

    مثال :
      glEnable(GL_LINE_STIPPLE);

      glLineStipple(4, 0xAAAA);

      glBegin(GL_LINES);
      glVertex3f(-0.3,0,0);
      glVertex3f( 0.3,0,0);  
      glEnd();

    ايضا
     void Render()
    {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

     
           
      glLoadIdentity();
      glTranslatef(0,0,-3.0);
      glEnable(GL_LINE_STIPPLE);

      glLineStipple(1, 0xff00 );

      glBegin(GL_LINES);
      glVertex3f(-1,0,0);
      glVertex3f( 1,0,0);  
      glEnd();


    }

    اذا أردت مزيد من التفصيل فراجع الروابط السابقة ..

    لكن سأذكر ما اعرفه : : : وليس شيء اكيد مية بالمية ..

      glLineStipple(1, 0xff00 );

    العدد ثنائي .. مكون من ثمان بتات .. الواحد يمثل نقطة .. الصفر لايمثل شيء .
    نحن وضعنا 16 بت .


    امثلة
    FC3F
    تساوي
    1111110000111111
    الرقم واحد يمثل نقطة .. الرقم صفر يمثل فراغ .

    ايضا :
    FFFF
    1111111111111111


    DDFD
    1101110111111101



    اما الرقم واحد في البارمتر الاول فيغير من طول النقاط ..

    جرب مثلا :
    glLineStipple(4, 0xAAAA);


    بقي ان نقول اذا اردت الاستغناء عن Stipple فاستخدم الدالة glDisable ...ومرر لها
    GL_LINE_STIPPLE




    الدالة glPolygonStippleمثل عمل الدالة الدالة السابقة لكن للمضلعات ..
    فكرتها انك تعمل مثلا صورة 32*32 وتخزن بها بيانات الصورة .. ثم تطبقها على المضلع .
    هذه الطريقة اعتقد عقيمة نوعا ما .. ومش داخله مزاجي : ) ,,,
    لانه الان الاكساء يوفر لك كل شيء ... خاصة ان الصور جاهزة .. وهذا يختصر الكثير من الوقت , ,,,

    لم ابحث كثيرا عن شأن هذه الدالة .. لكن يوجد مثال من RED BOOK اذا كنت مهتما بهذا الامر ..




    الدالة glEdgeFlag
    void glEdgeFlag(GLboolean flag);


    تأخذ بارمتر واحد وهو اما TRUE او FALSE ..

    فائدة الدالة ..
    تستطيع التحكم بالشكل المرسوم فمثلا ..

    رسمت شكل مثلث
      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

      glBegin(GL_POLYGON);

     
      glVertex3f(-0.3,0,0);

     
      glVertex3f(0,0.3,0);

     
      glVertex3f(0.3,0,0);

      glEnd();
    لنفرض انك لاتريد احد الاضلاع .. تريد ان تلغيها ..
    مثلا الضلع الايمن تريد ان تلغيه ..

    الحل ,, هكذا
      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

      glBegin(GL_POLYGON);

      glEdgeFlag(GL_TRUE);
      glVertex3f(-0.3,0,0);//الرأس الايسر

      glEdgeFlag(GL_FALSE);
      glVertex3f(0.3,0,0);//الرأس الايمن

      glEdgeFlag(GL_TRUE);
      glVertex3f(0,0.3,0);//الرأس العلوي  


      glEnd();
    قلنا


    glEdgeFlag(GL_FALSE);
      glVertex3f(0.3,0,0);

    يعني الضلع الايمن نريد حذفه ..
    اذا سيتم حذف الضلع من
    glVertex3f(0.3,0,0)
    الى
    glVertex3f(0,0.3,0)

    لاحظ ان باقي النقاط وضعنا قبلها GL_TRUE لاننا لا نريد الغاء رسمها ..

    هذه الدالة تحتاج لتمرس واتقان .. وكثيرا ما تحصل مشاكل بسببها ..
    سنطبق عليها مثال اخر لكي تفهم اكثر .. ان شاء الله ..

    لنفرض انك تريد حذف الضلع الايسر ..
      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

      glBegin(GL_POLYGON);

      glEdgeFlag(GL_TRUE);
      glVertex3f(-0.3,0,0);

      glEdgeFlag(GL_TRUE);
      glVertex3f(0.3,0,0);

      glEdgeFlag(GL_FALSE);
      glVertex3f(0,0.3,0);


      glEnd();

    لاحظ قلنا الضلع الايسر احذفه ... وهو الضلع المتجه من النقطة العلوية الى النقطة اليسرى ..

    اما لو كتبت
      glEdgeFlag(GL_FALSE);
      glVertex3f(-0.3,0,0); //الرأس الايسر
           
      glEdgeFlag(GL_TRUE);
      glVertex3f(0.3,0,0); //الرأس الايمن

    glEdgeFlag(GL_TRUE);
      glVertex3f(0,0.3,0);//الرأس العلوي  


    فانه سيتم حذف الضلع الاسفل (القاعدة) ,,
    لانك هنا قلت .. احذف النقطة اليسرى المتجه الى النقطة اليمنى ..

    وطبق ذلك على باقي المضلعات والاشكال ..

    اعيد واكرر ..هذه الدالة تحتاج الى تمرس وخيال واسع .. لما ستبدو عليه الامور قبل التنفيذ.. وليست المسألة خبط عشواء ..

    الدالة glRect:هي هدية .. تستطيع من خلالها رسم شكل رباعي
    لها عدة صور :
    glRectf حيث البارمترات من نوع float
    glRecti حيث البارمترات من نوع int وغيرها من الانواع واكيد الان تعرفها مباشرة من دون الرجوع الى مراجع ..

    صيغتها
    void glRectf(

        GLfloat x1,  
        GLfloat y1,  
        GLfloat x2,  
        GLfloat y2  
       );
    البارمتر الاول والثاني الاحداثي السيني الاول والصادي الاول
    البامتر الثالث والرابع الاحداثي السيني الثاني والصادي الثاني
    هي مثل عمل الدالة Rectangle في WIN API اذا كنت تعرفها ..

    اذا ترسم نقطتين تحددان بعد الشكل
    مثال :
    glRectf(-0.4 ,-.4 ,0,0 );

    كلمات مفتاحية  :
    الالوان الرسم opengl سلسلة

    تعليقات الزوار ()