24 Nisan 2014 Perşembe

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”.

Hiç yorum yok:

Yorum Gönder