C++ / OpenGL [ 16 – Blending ]

Blending

Blend transparan objelerin ekrana nasil cizildigini kontrol eden opengl fonksiyonudur:

glBlendFunc(sfactor, dfactor);

ekranda olan hedef/destination pixel’i dfactor’la carpar, yeni gelecek kaynak/source pixel’i sfactor’la carpar, sonucu toplayip ekrana basar.

faktor olarak asagidaki degerler kullanilir;

Parameter f R f G f B f A
GL_ZERO 0 0 0 0
GL_ONE 1 1 1 1
GL_SRC_COLOR R s0 k R G s0 k G B s0 k B A s0 k A
GL_ONE_MINUS_SRC_COLOR 1 1 1 1 – R s0 k R G s0 k G B s0 k B A s0 k A
GL_DST_COLOR R d k R G d k G B d k B A d k A
GL_ONE_MINUS_DST_COLOR 1 1 1 1 – R d k R G d k G B d k B A d k A
GL_SRC_ALPHA A s0 k A A s0 k A A s0 k A A s0 k A
GL_ONE_MINUS_SRC_ALPHA 1 1 1 1 – A s0 k A A s0 k A A s0 k A A s0 k A
GL_DST_ALPHA A d k A A d k A A d k A A d k A
GL_ONE_MINUS_DST_ALPHA 1 1 1 1 – A d k A A d k A A d k A A d k A
GL_CONSTANT_COLOR R c G c B c A c
GL_ONE_MINUS_CONSTANT_COLOR 1 1 1 1 – R c G c B c A c
GL_CONSTANT_ALPHA A c A c A c A c
GL_ONE_MINUS_CONSTANT_ALPHA 1 1 1 1 – A c A c A c A c
GL_SRC_ALPHA_SATURATE i i i 1
GL_SRC1_COLOR R s1 k R G s1 k G B s1 k B A s1 k A
GL_ONE_MINUS_SRC1_COLOR 1 1 1 1 – R s1 k R G s1 k G B s1 k B A s1 k A
GL_SRC1_ALPHA A s1 k A A s1 k A A s1 k A A s1 k A
GL_ONE_MINUS_SRC1_ALPHA 1 1 1 1 – A s1 k A A s1 k A A s1 k A A s1 k A

Tablo 1.0 referans;http://www.opengl.org/sdk/docs/man/xhtml/glBlendFunc.xml

glEnable (GL_BLEND); //blendingi acmamiza yarar
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //faktorlerimizi seciyoruz.

Ayrica blending antialiasing icinde kullanilir.

Blending icin ornek bir program olusturalim;
kutuphanelerimizi cagiriyoruz,.lib dosyalarini programda link etmeyenler
pragmalari ekleyerek manuel olarak eklesinler;

[c language=”++”]
#include <Windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <glut.h>
#include <stdlib.h>
[/c]

ayarlar fonksiyonumuz

[c language=”++”]
static void init(void)
{
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel (GL_FLAT);
//arka plani siyah yapiyoruz
glClearColor (0.0, 0.0, 0.0, 0.0);
}
[/c]

yukarida goruldugu uzere
glEnable (GL_BLEND); //blendi actik
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //faktoru belirledik

devam ediyoruz ve displayimizi olusturuyoruz;

[c language=”++”]
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

glBegin (GL_TRIANGLES);
//RGBA renk ayarimiz
glColor4f(1.0, 1.0, 0.0, 0.75);
glVertex3f(0.1, 0.9, 0.0);
glVertex3f(0.1, 0.1, 0.0);
glVertex3f(0.7, 0.5, 0.0);
glEnd();

glBegin (GL_TRIANGLES);
glColor4f(0.0, 1.0, 1.0, 0.75);
glVertex3f(0.9, 0.9, 0.0);
glVertex3f(0.3, 0.5, 0.0);
glVertex3f(0.9, 0.1, 0.0);
glEnd();

glFlush();
}
[/c]

gordugumuz glColor4f(R,G,B,A); parametremizde gordugumuz
Alpha degeri (A) saydamlik saglayan degerimiz.
0.0-1.0 arasi degerlerle saydamligi acip kapatabiliriz.Blending sayesinde
Saydamlik kontrol altinda tutulacak.

devam ediyoruz reshape fonksiyonumuz;

[c language=”++”]
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
gluOrtho2D (0.0, 1.0, 0.0, 1.0*(GLfloat)h/(GLfloat)w);
else
gluOrtho2D (0.0, 1.0*(GLfloat)w/(GLfloat)h, 0.0, 1.0);
}
[/c]

ve ana fonksiyonumuz;

[c language=”++”]
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (200, 200);
glutCreateWindow (argv[0]);
init();
glutReshapeFunc (reshape);
glutKeyboardFunc (keyboard);
glutDisplayFunc (display);
glutMainLoop();
return 0;
}
[/c]

Projemizin goruntusu;
ders16_blending

 

Hazir kod icin referans;http://www710.univ-lyon1.fr/~jciehl/Public/OpenGL_PG/ch07.html

 

Ders sonunda olusturdugumuz projenin .cpp kaynak dosyasini buradan indirebilirsiniz.

ders16

 

Leave a Reply

Your email address will not be published. Required fields are marked *