4.11 Логические операции

Автор: zombie

     Логические операции позволяют вам складывать цвет фрагмента, находящегося в буфере, с цветом, который туда поступает. Этот режим разрешается и запрещается вызовом функций glEnable\glDisable с параметром GL_COLOR_LOGIC_OP. Правило, по которому будут складываться цвета, задается функцией glLogicOp. У нее один параметр - одна из следующих констант, определенных в файле gl.h.

/* LogicOp */
#define GL_CLEAR                          0x1500
#define GL_AND                            0x1501
#define GL_AND_REVERSE                    0x1502
#define GL_COPY                           0x1503
#define GL_AND_INVERTED                   0x1504
#define GL_NOOP                           0x1505
#define GL_XOR                            0x1506
#define GL_OR                             0x1507
#define GL_NOR                            0x1508
#define GL_EQUIV                          0x1509
#define GL_INVERT                         0x150A
#define GL_OR_REVERSE                     0x150B
#define GL_COPY_INVERTED                  0x150C
#define GL_OR_INVERTED                    0x150D
#define GL_NAND                           0x150E
#define GL_SET                            0x150F

Мне не удалось найти разумного применения этой функции, поэтому я приведу здесь лишь текст моей программы с комментариями, которая позволяет перебрать и посмотреть действие всех логических операций. Как и в предыдущем пункте, у меня определена глобальная переменная и две функции, реагирующие на нажатие стрелок на клавиатуре.

/*
 * (c) Copyright 1995-2000, Igor Tarasov
 * FidoNet: 2:5020/370.2 620.20 1103.5
 * email: igor@itsoft.miem.edu.ru itarasov@rtuis.miem.edu.ru
 * Phone: (095)916-89-51 916-89-63
 */

#include 

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>


int logicop = GL_CLEAR;

void CALLBACK Key_UP(void )
{
	if(logicop<GL_SET)
		logicop++;
}

void CALLBACK Key_DOWN(void )
{
 if(logicop>GL_CLEAR)
	 logicop--;
}

void CALLBACK resize(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}

void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glColor4d(1,0,0, 1);
auxSolidSphere( 1 );

glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(logicop);

glColor4d(0,1,0, 0.7);
auxSolidCylinder(2,3);

glDisable(GL_COLOR_LOGIC_OP);

auxSwapBuffers();

}

void main()
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};

GLfloat mat_specular[] = { 1,1,1,1};

auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Glaux Template" );
auxIdleFunc(display);
auxReshapeFunc(resize);

  
    auxKeyFunc(AUX_UP, Key_UP);
    auxKeyFunc(AUX_DOWN, Key_DOWN);

glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

//    glLightfv(GL_LIGHT0, GL_POSITION, pos);
//    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, 128);

auxMainLoop(display);
}

Комментарии закрыты.