15 Haziran 2017 Perşembe

QT 5.9 Opengl kurulumu

                                                                         QT 5.9  Opengl kurulumu


glwidget.h

___________________________________________________________________________

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QOpenGLFunctions>
#include <QOpenGLWidget>
#include <QWidget>
class GLWidget : public QOpenGLWidget ,protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent);
protected:

void initializeGL();

};

#endif // GLWIDGET_H





glwidget.cpp
__________________________________________________________________

#include "glwidget.h"

GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent)
{

}

void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(1,0,0,1);

}

11 Temmuz 2015 Cumartesi

Dosya Açma mfc form winapi





#include <"windows.h">
#include "resource.h"
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam);
  HWND  yavru;
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
WNDCLASS wc;
HWND hWnd,buton;
HDC hDC;
HGLRC hRC;        
MSG msg;
BOOL bQuit = FALSE;
float theta = 0.0f;
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName ="OpenGLTurk";
RegisterClass (&wc);
hWnd = CreateWindow ("OpenGLTurk","Yasin Demirci",WS_CAPTION  |  WS_POPUPWINDOW | WS_VISIBLE | WS_OVERLAPPEDWINDOW ,30, 30, 1200,800,NULL, NULL, hInstance, NULL);
yavru=CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd,DLGPROC(WndProc));
 
ShowWindow (yavru, iCmdShow) ; // mfc pencerenizin gösterimi
     UpdateWindow (yavru) ; // mfc penceresinin guncellemesi
while (!bQuit)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
/* mesaj dağıtma*/
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
else
{
   
}
} 
  
DestroyWindow (hWnd);
  
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)
{
  BOOL checkeds = IsDlgButtonChecked(yavru, 1);
    OPENFILENAME ofn;
    char szFileName[MAX_PATH] = "";

    ZeroMemory(&ofn, sizeof(ofn));

    ofn.lStructSize = sizeof(ofn); 
    ofn.hwndOwner = yavru;
    ofn.lpstrFilter = "Obj dosyası (*.obj)\0*.obj\0All Files (*.*)\0*.*\0";// acılacak dosyayı uzantısını buradan ayarlayabilirsiniz
    ofn.lpstrFile = szFileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = "obj";
switch (message)
{
   
case WM_COMMAND:
   
 //Butona basıldımı işlenecek kodlar 
 if (LOWORD(wParam) == IDOK && HIWORD(wParam) == BN_CLICKED)
     {
     

    if(GetOpenFileName(&ofn))
    {
       

 // okur(szFileName );  dosya yolunu szFileName ile ögrenebilirsiniz
  
    }
 }

  
    
  
 return 0;

case WM_CREATE:
return 0;
case WM_CLOSE:
PostQuitMessage (0);
return 0;
  
case WM_DESTROY:
return 0;
  
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
return 0;
}
return 0;
  
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
}

18 Temmuz 2014 Cuma

Winapi Mfc Form Listbox


Winapi Mfc Form Listbox.rar















#include <windows.h>

#include "resource.h"

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam);



int WINAPI WinMain (HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int iCmdShow)

{

WNDCLASS wc;

HWND hWnd;

HDC hDC;

HGLRC hRC;       

MSG msg;

BOOL bQuit = FALSE;

float theta = 0.0f;

wc.style = CS_OWNDC;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor (NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName ="OpenGLTurk";

RegisterClass (&wc);

hWnd = CreateWindow ("OpenGLTurk","OpenGLTurk--Yasin Demirci",WS_CAPTION  |  WS_POPUPWINDOW | WS_VISIBLE | WS_OVERLAPPEDWINDOW ,30, 30, 600,400,NULL, NULL, hInstance, NULL);

HWND yavru=yavru=CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd,DLGPROC(WndProc));

HWND hListBox =GetDlgItem(yavru,IDC_LIST1);

SendMessage( hListBox, LB_ADDSTRING, 0, (LPARAM) ("Test1"));

SendMessage( hListBox, LB_ADDSTRING, 0, (LPARAM) ("Test2"));

SendMessage( hListBox, LB_ADDSTRING, 0, (LPARAM) ("Test3"));

ShowWindow (yavru, iCmdShow) ; // mfc pencerenizin gösterimi

     UpdateWindow (yavru) ; // mfc penceresinin guncellemesi

while (!bQuit)

{

if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))

{

/* mesaj dağıtma*/

if (msg.message == WM_QUIT)

{

bQuit = TRUE;

}

else

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

}

else

{



}

}



DestroyWindow (hWnd);



return msg.wParam;

}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)

{



switch (message)

{

case WM_CREATE:

return 0;

case WM_CLOSE:

PostQuitMessage (0);

return 0;



case WM_DESTROY:

return 0;



case WM_KEYDOWN:

switch (wParam)

{

case VK_ESCAPE:

PostQuitMessage(0);

return 0;

}

return 0;



default:

return DefWindowProc (hWnd, message, wParam, lParam);

}

}

2 Mayıs 2014 Cuma

Gerçek-Dünya ve OpenGL Işıklandırma,Ambiyans, Yayılma, Aynamsı ve Yayınımcı Işık

Gerçek-Dünya ve OpenGL Işıklandırma,Ambiyans, Yayılma, Aynamsı ve Yayınımcı Işık

Fiziksel bir yüzeye baktığınızda gözlerinizin renk algısı, konik hücrelerinize ulaşan ve uyaran foton enerjisinin dağılımına bağlıdır. (Renk Algıs bölümüde bunu inceledik”). Bu fotonlar bir ışık kaynağı ve kaynak kombinasyonundan gelir, bir kısmı soğurulur ve bir kısmı da yüzey tarafından yansıtılır. Ek olarak farklı yüzeylerin farklı özellikleri olabilir – kimisi parlaktır ve ışığı belli yönlerde özellikle yansıtırken diğerleri gelen ışığı her yöne eşit şekilde dağıtır. Çoğu yüzey bu ikisinin arasındadır.

OpenGL ışık ve ışıklandırmaya sanki ışık kırmızı, yeşil ve mavi bileşenlere kırılabilirmiş gibi yaklaşır. Böylece bir ışık kaynağının rengi yaydığı kırmızı, yeşil ve mavi ışıkların miktarı ve bir yüzeyin malzemesi, farklı yönlere dağıtılan gelen kırmızı, yeşil ve mavi ışığın yüzdesi ile karakterize edilir. OpenGL ışıklandırma eşitlikleri sadece yaklaşık tahminlerdir ancak oldukça iyi çalışırlar ve nispeten daha hızlı şekilde hesaplanırlar. Eğer daha kesin (veya sadece farklı) bir ışıklandırma modeli istiyorsanız yazılımda kendi hesaplamalarınız yapmak zorundasınız. Böylesi yazılımlar, birkaç saatlik optik ders kitabı okumasının sizi ikna edeceği gibi, muazzam şekilde karmaşıktırlar.
OpenGL ışıklandırma modelinde bir sahnedeki ışık, münferit olarak açıp-kapatılabilen birkaç ışık kaynağından gelir. Bazı ışıklar belli bir yön veya konumdan gelir ve bazıları ise genel olarak sahneye dağılır. Örneğin bir odada ampulü yaktığınızda ışığın çoğu ampulden gelir ancak kimi ışıklar bir, iki, üç veya daha fazla duvardan sekmekten ileri gelir. Bu seken ışıklar (ambiyans ışıkları denir) orijinal yönlerini söylemenin mümkün olmayacağı şekilde dağıldığı varsayılır ancak ışık kaynağının kapatılması durumunda kaybolurlar.
Son olarak, sahnede  sanki o kadar çok sekmiştir ki orijinal kaynağını belirlemenin imkânsız olduğu belli hiçbir kaynaktan gelmeyen genel bir ambiyans ışığı olabilir.
Open GL modelinde ışık kaynaklarının sadece orada ışığı emecek ve yansıtacak nesneler olması durumunda etkisi vardır. Her bir yüzeyin çeşitli özelliklere sahip bir materyalden yapılığı varsayılır. Bir materyal kendi ışığını (bir otomobilin farları gibi) yayabilir, gelen ışığın bir kısmını tüm yönlerde dağıtabilir ve bir kısmını ise tercih edilen yönde yansıtabilir (bir ayna veya başka bir parlak yüzey gibi).
Ambiyans, Yayılma, Aynamsı ve Yayınımcı Işık
Ambiyans ışıklandırma, çevre tarafından orijinal kaynağını belirlemenin imkânsız olacağı şekilde dağıtılmış olan ışıklardır – tüm yönlerden geliyormuş gibi görünürler. Gözünüze ulaşan ışığın çoğu öncelikle pek çok yüzeyden sektiğinden dolayı bir odadaki arka ışık büyük bir ambiyans bileşenine sahiptir. Bir dış mekân spot ışığının çok küçük bir ambiyansı vardır; ışığın çoğu aynı yönde gider ve siz de dışarıda olduğunuzdan çogu ışık nesnelere çarparak gözünüze ulaşır. Ambiyans ışığı bir yüzeye vurduğunda tüm yönlere eşit şekilde dağılır.
Yayılma bileşeni, bir doğrultudan gelen ışık demektir, bu nedenle yüzeye zorlukla değmek yerine dik olarak geldiğinde çok daha parlaktır. Bununla birlikte bir yüzeye çarptığı anda tüm yönlere eşit şekilde dağılır, böylece gözün nereden baktığı önemli olmaksızın aynı parlaklıkta görünür. Belli bir doğrultu ve ya konumdan gelen her türlü ışığın bir yayılım bileşeni vardır.
Aynamsı ışık belli bir doğrultudan gelir ve tercih edilen bir doğrultuda yüzeyden seker. Yüksek kalitedeki bir aynadan seken iyi bir paralelliğe sahip lazer demeti %100’lük aynamsı yansıma üretir. Parlak metal veya plastiğin yüksek bir aynamsı bileşeni ve tebeşir veya halı gibi nesnelerin hiç aynamsı bileşeni yoktur. Aynamsıliği parlaklık olarak düşünebilirsiniz.
Ambiyans, yayılma ve aynamsı renklere ek olarak materyaller, nesnen kaynaklanan ışığa benzeyen bir yayınım rengine sahip olabilir. OpenGL ışıklandırma modelinde bir yüzeyin yayınım rengi nesneye derinlik katar ancak hiçbir ışık kaynağından etkilenmez. Ayrıca yayınım rengi genel sahneye herhangi ek ışık katkısı yapmaz. 

Materyal Renkleri,Işıklar ve Materyaller için RGB Değerleri

Materyal Renkleri,Işıklar ve Materyaller için RGB Değerleri

Materyal Renkleri    
OpenGL ışıklandırma modeli bir materyalin rengini, gelen ışıktan yansıttığı kırmızı, yeşil ve mavi bileşenlerin yüzdesinden tahmin eder. Örneğin  kırmızı  bir toptan  gelen tüm kırmızı ışıkları yansıtır ve tüm yeşil ve mavi ışıkları soğurur. Eğer böyle bir topu beyaz ışıkta görürseniz (eşit miktarlarda kırmızı, yeşil ve mavi renkten oluşan) tüm kırmızı yansıtılmıştır ve siz bir kırmızı top görürsünüz. Eğer top saf kırmızı ışıkta görülürse yine kırmızı görünecektir. Bununla birlikte eğer saf yeşil ışıkta görülürse siyah (tüm yeşil soğurulur ve gelen kırmızı olmadığından yansıtılacak ışık da yoktur).
Işıklar gibi materyallerin de, materyallerin ambiyansını, yayılma ve aynamsı yansımalarını belirleyen farklı ambiyans, yayılma ve aynamsı renkleri vardır. Bir materyalin ambiyans yansıma çarpanı her bir gelen ışık kaynağının ambiyans bileşeni ile birleşmiş, ışığın yayılma bileşeni ile yansıma çarpanı ile karışmıştır ve aynamsı yansıma çarpanı ile aynamsı bileşen için de durum aynıdır. Ambiyans ve yayılma yansıma çarpanları malzemenin rengini tanımlar ve tipik olarak özdeş değilseler bile benzerdirler. Spekular yansıma genellikle beyaz veya gridir, bu nedenle aynamsı spot ışıkları ışık kaynağının aynamsı ışık şiddetinin rengine sahip olur. Beyaz bir ışığın parlak bir kızıl plastik küre üstünde parladığını düşünün, kürenin çoğu kırmızı görünür ana parlak spot beyazdır.
Işıklar ve Materyaller için RGB Değerleri
Işık için belirlenen renk bileşenleri, materyaller için olduğundan daha farklı anlam ifade eder. Bir ışık için sayılar her bir renk için tam şiddetin bir yüzdesine karşılık gelir. Eğer bir ışığın rengi için R, G ve B değerlerinin hepsi 1.0’a eşitse, ışık en parlak olası beyazdır. Eğer değerler 0.5 ise, renk hâlâ beyazdır ancak şiddeti yarıya inmiştir ve bu nedenle gri görünür. Eğer R=G=1 ve B=0 ise (hiç mavi olmaksızın tam kırmızı ve yeşil) ışık sarı görünür.
Materyaller için sayılar, o renklerin yansıyan oranlarına karşılık gelir. Yani, eğer R=2, G=0.5 ve B=0 ise o materyal gelen kırmızı ışığın tümünü ve yeşilin yarısını yansıtır ve gelen hiçbir mavi ışık yoktur. Diğer bir deyişle, eğer bir OpenGL ışığı (LR, LG, LB) bileşenlerine sahipse ve bir materyal karşılık gelen (MR, MG, MB) bileşenlerini içeriyorsa , bu durumda tüm diğer yasıtma etkilerini ihmal ederek, göze gelen ışık (LR.MR, LG.MG, LB.MB) ile verilir.
Benzer olarak, eğer göze (R1, G1, B1) ve (R2, G2, B2) gönderen iki ışığını varsa OpenGL, (R1+R2, G1+G2, B1+B2) vererek bileşen ekler. Herhangi bir toplamın 1’den büyük olamsı durumunda (ekipmanın gösterebileceğinden daha parlak bir renge karşılık gelir) bileşen 1’e kenetlenir.
Basit Bir Örnek: Işıklandırılmış Bir Küreyi Kaplamak
Bunlar, sahnenize ışık eklemek için gerekli adımlar:
  1. Her nesnenin her köşesi için normal vektörler tanımlayın. Bu normaller nesnenin ışık kaynağına göre yönelimini belirler.
  2. Bir veya daha fazla ışık kaynağı yaratın, seçin ve konumlandırın.
  3. Küresel ambiyans ışık seviyesini ve görüş noktasının etkin konumunu belirleyen bir ışıklandırma modeli yaratın ve seçin (ışıklandırma hesapları açısından)
  4. Sahnedeki nesneler için malzeme özellikleri tanımlayın.

Örnek   light.c


#include <GL/glut.h>
void init(void)
{
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat lmodel_ambient[] = { 0.1, 0.1, 0.1, 1.0 };
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere(1.0, 20, 16);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,
1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho(-1.5*(GLfloat)w/(GLfloat)h,
1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}


 Örnekte ile ilgili olarak düşülecek bir not, RGBA renk modunu kullanıyor olduğudur. OpenGL ışıklandırma hesaplaması iki mod için farklıdır ve aslında ışıklandırma kapasiteleri renk-endeks modunda çok daha sınırlıdır. Böylece RGBA ışıklandırma yaparken tercih edilir . 
Her Nesnenin Her Köşesi İçin Normal Vektörler Tanımlamak
Bir nesnenin normalleri ışık kaynaklarıyla ilgili yönelimlerini belirler. Her bir köşe için OpenGL, bu köşenin her bir ışık kaynağından ne kadar ışık aldığını belirlemek için atanmış normal kullanır. Bu örnekte küre için normaller glutSolidSphere() şablonunun parçası olarak kullanılır.
Uygun ışıklandırma için, yüzey normalleri birim uzunlukta olmalıdır. Aynı zamanda model-görüntü dönüşüm matrisinin yüzey normalini artık birim uzunlukta olmayacak şekilde ölçeklendirmemesine dikkat etmek zorundasınız. Normallerin birim uzunlukta olduğundan emin olmak için  GL_NORMALIZE veya GL_RESCALE_NORMALi parametre olarak içeren glEnable()komutunu çağırmanız gerekebilir.
GL_RESCALE_NORMAL, bir yüzey normalindeki her bir bileşenin, model-görüntü dönüşüm matrisi tarafından belirlenen aynı değerle çarpılmasını sağlar. Bu nedenle sadece normal tekdüze olarak ölçeklenmiş ve başlangıçtan itibaren birim uzunlukta ise doğru şekilde çalışır.GL_NORMALIZE,GL_RESCALE_NORMAL’den çok daha dosdoğru bir operasyondur. GL_NORMALIZE etkinleştirildiğinde normal vektörün uzunluğu hesaplanır ve daha sonra normalin her bir bileşeni hesaplanan uzunluğa bölünür. Bu operasyon sonuç normalin birim uzunlukta olmasını garantiler ancak basit yeniden ölçeklendirme normallerinden daha pahalı olabilir.
Not: Bazı OpenGL uygulamaları, aslında normal vektörleri sadece ölçerek değil normalleştirmek suretiyle  GL_RESCALE_NORMAL komutunu uygulayabilir. Bununla birlikte uygulamanızın bunu yapıp yapmadığını veya genellikle buna güvenmeniz gerekip gerekmediğini belirleyemezsiniz. 

Bir veya Daha Fazla Işık Kaynağı Yaratma, Konumlandırma ve Etkinleştirme
light.c örneginde beyaz ışık veren tek bir ışık kaynağı kullanmaktadır. Konumu glLightfv() komutu ile belirlenir. Bu örnek beyazı, yayılma ve ayna-benzeri yansıma hesaplamaları için sıfır ışığın rengi (GL_LIGHT0) olarak belirler. Eğer farklı renkte bir ışık istiyorsanız glLight*()’ı değiştirin.
Ekranınıza çeşitli renklerde en az sekiz farklı ışık kaynağı da dâhil edebilirsiniz. (Open GL’nin kullandığınız özel uygulaması sekizden fazlasına izin verebilir.) Varsayılan ışık rengi GL_LIGHT0 haricinde siyahtır. Işık kaynaklarını aynı zamanda istediğiniz yere de yerleştirebilirsiniz. Örneğin bir masa lambası kimliğinde ekranın yakınına veya güneş ışığını temsil etmek üzere ekranın uzağına yerleştirebilirsiniz. Ek olarak, ışık kaynağının dar, odaklanmış ışık demeti veya daha geniş bir ışık demeti vermesini de kontrol edebilirsiniz. Her bir ışık kaynağının, ekranı kaplamak için gereken hesaplara önemli şekilde ek getirdiğini, bu nedenle performansın ekrandaki ışık kaynağı sayısından etkilendiğini unutmayın. 
İstediğiniz ışık kaynağının karakteristiklerini tanımladıktan sonra onları glEnable() komutu ile açık hale getirmelisiniz. Aynı zamanda, OpenGL’yi ışıklandırma hesaplamalarını gerçekleştirmek üzere hazırlamak için GL_LIGHTING’i bir parametre olarak içeren glEnable() komutunu çağırmanız gerekir.

24 Nisan 2014 Perşembe

Renk Kenetleme,Renk-Endeks Modu,Bir Gölgeleme Modeli Belirlemek

Renk Kenetleme,Renk-Endeks Modu,Bir Gölgeleme Modeli Belirlemek

Renk Kenetleme
OpenGL 3.0 Sürümü, RGBA renk bileşenlerinin gerçek noktalı sayı değerleri olarak saklandığı noktalı sayı çerçeve bellekleri getirdi. Noktalı sayı değerlerinin daha büyük dinamik aralığı nedeniyle aslen OpenGL tarafından 0.0 ila 1.0 olarak tanımlanan kenetlenmiş renk değerleri aralığı dışında kalan renk değerlerine izin vermek isteyebilirsiniz.

void glClampColor(GLenum target, GLenum clamp);

glClampColor glReadPixels sırasında kenetlecek renkleri kontrol eder. Hedef GL_CLAMP_VERTEX_COLOR,GL_CLAMP_FRAGMENT_COLOR,veyaGL_CLAMP_READ_COLOR olabilir. Kelepçe(clamp) GL_TRUE ise, renk sıkıştırma etkin olur; Kelepçe(clamp) GL_FALSE ise, renk sıkıştırma devre dışı . Kelepçe(clamp) GL_FIXED_ONLY ise, renk sıkıştırma seçilen okuma tamponu noktası bileşenleri sabit ve aksi kapatmıştır.

OpenGL Sürüm 3.0 mevcut olan renk-kenetleme seçenekleri  aşagıdaki tabloda’de verilmektedir.



Parametre
Özellikler
  • GL_TRUE
Renkler [0, 1] aralığına kenetlenmeli
  • GL_FALSE 
Kenetlenmeyecek renkler
  • GL_FIXED_ONLY
Renkler sadece hedef çerçeve bellek sabit nokta ise
Kenetlenir.
Renk-Endeks Modunda Bir Rengi Belirlemek
glIndex
Renk-endeks modunda tek-değerli bir renk endeksini geçerli renk endeksi olarak seçmek için glIndex*()  komutunu kullanılır.

Void glIndex{sifd ub}(TYPE c);
Void glIndex{sifd ub}v(const TYPE *c);


Geçerli renk endeksini c’ye ayarlanır. Bu komutun ilk soneki parametreler için veri tipini belirler: kısa, tamsayı, noktalı sayı, çift veya işaretsiz bayt. İkincisi, seçeneksel sonek v,  argümanı verilen veri tipinin bir değer dizisi olduğunu gösterir (dizi sadece bir değer içerir.)  

glClearIndex



Pencereyi Temizlemek” kısmında glClearColor() komutunun özelliklerini gördünüz. Renk-endeks modu için buna karşılık gelen birglClearIndex() modu bulunur.


void glClearIndex(GLfloat  cindex); 


Geçerli temizleme rengini renk-endeks modunda ayarlanır. Bir renk-endeks mod penceresinde bir glClear(GL_COLOR_BUFFER_BIT) çağrısı belleği temizlemek için cindex kullanır. Varsayılan endeks; 0.0’dır.
Not: OpenGL, renk-bakma tablosuna değer yüklemek için herhangi bir şablona sahip değildir. Pencere sistemleri genel olarak bu tür operasyonlara sahiptir. GLUT pencere-sistemine-özgü komutları çağırmak için glutSetColor() komutuna sahiptir. 


Bir Gölgeleme Modeli Belirlemek

Bir çizgi veya dolu bir poligon primitif tek bir renk (düz gölgeleme) veya pek çok renk (düzgün gölgeleme, ayrıca Gouraud Gölgeleme de denir) ile çizilebilir. Arzu edilen gölgeleme tekniğini glShadeModel() komutu ile belirlenir.


void glShadeModel(GLenum mode);


glShadeModel Gölgeleme modelini ayarlar. Mod parametresi ya GL_SMOOTH (varsayılan) veya GL_FLAT olabilir.
Düz gölgeleme ile bağımsız bir primitifin belli bir köşesinin rengi, bu primitifi kaplamak için tüm primitiflerin köşeleri boyunca çoğaltılır. Düzgün gölgeleme ile her bir köşedeki renk münferit olarak ele alınır. Bir çizgi primitif için çizgi boyunca uzana renkler köşe renkleri arasında ortalanır. Bir poligon primitif için poligon içindeki renkler köşe renkleri arasında ortalanır. 

Örnek Kod:


#include<GL/glut.h>
void init (void)
    {
      
      glClearColor(0.0,0.0,0.0,0.0);
      glShadeModel(GL_SMOOTH);
            
    }
    
    
    void triangle(void)
    {
      glBegin(GL_TRIANGLES);
      glColor3f(1.0,0.0,0.0);
      glVertex2f(5.0,5.0);
      glColor3f(0.0,1.0,0.0);
      glVertex2f(25.0,5.0);
         glColor3f(0.0,0.0,1.0);
      glVertex2f(5.0,25.0);
      glEnd();
    }
    
    void display(void)
    {
      
      glClear(GL_COLOR_BUFFER_BIT);
      triangle();
      glFlush();      
    }
    void reshape(int w,int h)
    {
      glViewport(0,0,(GLsizei)w,(GLsizei)h);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      if(w<=h)
 gluOrtho2D(0.0,30.0,0.0,30.0 *(GLfloat)h/(GLfloat) w);
      else
      gluOrtho2D(0.0,30.0 *(GLfloat)w/(GLfloat) h,0.0,30.0);
      glMatrixMode(GL_MODELVIEW);
       }
    
    int main (int argc, char ** argv)
    {
      glutInit (&argc,argv);
      glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
      glutInitWindowSize(500,500);
      glutInitWindowPosition(100,100);
      glutCreateWindow(argv[0]);
      init();
      glutDisplayFunc(display);
      glutReshapeFunc(reshape);
      glutMainLoop();
      return(0);
    }



Düzgün gölgeleme ile komşu pikseller biraz daha farklı renk değerlerine sahip olur. RGBA modunda biraz daha farklı değerlere sahip bitişik pikseller benzer görünürler, bu nedenle bir poligon boyunca renk değişimleri kademeli olarak görünür. Renk-endeks modunda bitişik pikseller, renk-endeks tablosunda kesinlikle benzer renklere denk gelmeyen farklı konumlara başvurabilir. Bitişik renk-endeks girişleri oldukça farklı renkler içerebilir bu nedenle renk-endeks modunda düzgün-gölgeli bir poligon sanrısal görünebilir.
 Bu problemden kaçınmak için renk haritasında bitişik bir dizin seti arasında düzgünce değişen renklerden bir renk rampası yaratmak zorundasınız. Bir renk haritasına renk yüklemenin OpenGL yerine pencere sisteminiz yoluyla gerçekleştirildiğini unutmayın. Eğer GLUT kullanıyorsanız belirlenmiş kırmızı, yeşil ve mavi değerlere sahip renk haritasında tek bir endeks yüklemek için glutSetColor() ı kullanabilirsiniz. glutSetColor()  ın ilk argümanı endekstir ve diğerleri kırmızı, yeşil ve mavi değerleridir. Hafifçe farklı sarı tonlara ait 32 bitişik renk dizini yüklemek için (16 ila 47 arası renk dizinleri);
for (i = 0; i < 32; i++) {
glutSetColor(16+i, 1.0*(i/32.0), 1.0*(i/32.0), 0.0);
}
döngüsünü kullanabilirsiniz
Şimdi eğer sadece 16 ila 47 arası renklerden kullanan düzgün gölgeli poligonları kaplıyorsanız bu poligonlar kademeli olarak değişen sarı tonlarına sahip olacaktır.
Düz gölgeleme ile tek bir köşenin rengi tüm bir primitifin rengini belirler. Bir çizgi parçası için çizginin rengi, ikinci (son) köşe tanımlandığından geçerli renktir. Bir poligon için kullanılan renk, aşşagıdaki tabloda gösterildiği gibi belli bir köşe tanımlandığında yürürlükte olan renktir. Tablo, köşe ve poligonların 1.OpenGL’den başlayarak bu kuralları tutarlı şekilde takip ettiğini varsayar ancak bir düz-gölgeli primitifin nasıl çizileceği hakkında belirsizlikten kaçınmanın en iyi yolu pirimitif için sadece bir tek renk belirlemektir.
Poligon Tipi
i.nci Poligon için Renk Seçiminde Kullanılan Köşe
Tek Poligon
1
Üçgen şerit
i+2
Üçgen fan
i+2
Bağımsız Üçgen
3i
Dörtlü şerit
2i+2
Bağımsız dörtlü
4i


Bir renk belirlemek

Bir renk belirlemek

OpenGL geçerli bir renk (RGBA modunda) ve geçerli bir renk endeksi (renk-endeks modunda) sürdürmektedir. Işıklandırma veya desen haritalama gibi daha karmaşık bir renklendirme modeli kullanmadığınız sürece her bir nesne geçerli bir renk (veya renk endeksi) kullanılarak çizilir. Aşağıdaki örnegi inceleyelim;

Renk(Kirmizi);
nesne_cizim(A);
nesne_cizim(B);
Renk(Yesil);
Renk(Mavi);
nesne_cizim(B);



A ve B nesneleri kırmızıyla ve C nesnesi mavi ile çizilidir. Geçerli rengi yeşile ayarlayan  çizginin ise hiçbir etkisi yoktur (biraz zaman kaybı olması haricinde). Hiçbir ışıklandırma ve desenleme olmadan, geçerli renk ayarlandığında sonradan çizilen tüm nesneler geçerli renk değişene kadar o renkle çizilir. 

Bir Renk Belirlemek
RGBA modunda geçerli bir renk seçmek için glColor*()  komutu kullanılır.
voidglColor3{b s i f d ub us ui}(TYPEr,TYPEg,TYPEb);
voidglColor4{ub us ui}(TYPEr,TYPEg,TYPEb,TYPEa);
voidglColor3{ub us ui}v(constTYPE*v);
voidglColor4{ub us ui}v(constTYPE*v);
Örnek kod:

#include<GL/glut.h>
void cizgi(void)
{
glBegin(GL_LINES);
glVertex2f(-0.4f,0.4f);
glVertex2f(0.4f,0.4f);
glEnd();
}
void pencere(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);//--------------->
cizgi();
glTranslatef(0.0,-0.2,0.0);
glColor3f(0.0,1.0,0.0);//---------------->
cizgi();
glTranslatef(0.0,-0.2,0.0);
glColor3f(0.0,0.0,1.0);//---------------->
cizgi();
glFlush();
}
int main(int argcp,char **argcv)
{
glutInit(&argcp,argcv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowPosition(200, 200);
glutInitWindowSize(250, 250); 
glutCreateWindow("OpenGLTurk");
glutDisplayFunc(pencere);
glutMainLoop();
return 0;
} 


glColor*()Geçerli kırmızı, yeşil, mavi ve alfa değerlerini ayarlar. Bu komut kabul edilen parametrelerin varyasyonlarını farklılaştırabilecek üç adete kadar son eke sahip olabilir. İlk son ek, kırmızı, yeşil ve mavi değerlere ek olarak bir alfa değeri verip vermediğinizi göstermek için 3 veya 4 olabilir. Eğer bir alfa değeri vermiyorsanız otomatikman 1.0’a ayarlanır. İkinci son ek, parametreler için veri tipini gösterir: bayt(bayt), kısa tamsayı(short), tamsayı(int), noktalı sayı(float), çift(double), işaretsiz bayt(unsigned bayt), işaretsiz kısa sayı(unsigned short) veya işaretsiz tamsayı(unsigned int). Üçüncü son ek, argümanın verilmiş veri tipinin bir değer dizisinin bir işaretçisi olduğunu gösteren seçeneksel bir v’dir. 

noktalı sayı  veri tiplerini kabul eden  glColor*() sürümleri için değerler tipik olarak, çerçeve bellekte saklanabilecek minimum ve maksimum yani 0.0 ile 1.0 aralığında olmalıdır. işaretsiz-tamsayı renk bileşenleri, belirtildiklerinde, en büyük temsil edilebilir değerin 1.0’a (tam şiddet) haritalanabilecek şekilde ve sıfırın 0.0’a (sıfır şiddet) haritalanabileceği şekilde noktalı sayıları doğrusal olarak haritalanırlar. işaretli-tamsayı renk bileşenleri, belirtildiklerinde, en fazla  pozitif temsil edilebilir değeri 1.0’a ve en negatif temsil edilebilir değeri -1.0’a haritalanabileceği şekilde noktalı sayıları doğrusal olarak haritalanırlar (bakınız aşşagıdaki tabloya).
sonekveri TürüMinimum DeğerMin Değer Haritalarmaksimum DeğerMax Değer Haritalar
b1-byte integer-128-1.01271.0
s2-byte integer-32,768-1.032,7671.0
i4-byte integer-2,147,483,648-1.02,147,483,6481.0
ubunsigned 1-byte
integer
00.02551.0
usunsigned 2-byte
integer
00.065,5351.0
uiunsigned 4-byte
integer
00.04,294,967,2951.0

 Ne noktalı sayılar ne de işaretli-tamsayı değerleri, geçerli rengi veya geçerli ışıklandırma malzeme parametresi güncellenmeden [0, 1] aralığına kenetlenmez.  Işıklandırma hesaplarından sonra, [0, 1] aralığının dışında kalan sonuç renk değerleri ortalanmadan veya bir renk belleğe yazılmadan önce [0, 1]’e kenetlenir. Işıklandırma pasifleştirilmiş olsa bile renk bileşenleri kafeslemeden önce kenetlenir. 
Benzer bir  glSecondaryColor*() şablon desen haritalamadan sonra (eğer ışıklandırma pasifleştirilmişse) uygulanacak rengi belirlemek için kullanılır. Daha fazla ayrıntı için bakını “Desenlemeden Sonra İkinci Renk Uygulamak”.