OpenGL入门10——颜色混合

源混合因子:是指新片断(即正在绘制的图形)的系数,会与源颜色相乘

目标混合因子:是指已经存储的对应像素(目标)的混合系数,会与目标颜色相乘

使用以下代码测试混合函数的使用:

#include "stdafx.h"
#include <windows.h>
#include "glew.h"
#include "glut.h"

#pragma comment(lib, "glew32d.lib")
#pragma comment(lib, "freeglut.lib")

void init()
{
	glClearColor( 1.0,1.0,1.0,1.0);
	glBlendFunc( GL_ONE, GL_ZERO);
	glEnable( GL_BLEND );
}

void display()
{
	glClear( GL_COLOR_BUFFER_BIT );
	glColor3f( 1.0, 0.0, 0.0);
	glRectf( -0.5, -0.5, 0.5, 0.5);
	glFlush();
}

void reshape( int w, int h )
{
	glViewport( 0, 0, (GLsizei)w, (GLsizei)h );
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity( );

	if( w <= h )
		glOrtho( -1, 1, -1*(GLfloat)h/(GLfloat)w, 1*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
	else
		glOrtho( -1*(GLfloat)w/(GLfloat)h, -1*(GLfloat)w/(GLfloat)h, -1, 1, -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]);

	glewInit();
	init();

	glutDisplayFunc( display );
	glutReshapeFunc( reshape );
	glutMainLoop();
	return 0;
}

三维混合:

#include "stdafx.h"
#include <windows.h>
#include "glew.h"
#include "glut.h"
#include <gl/gl.h>

#pragma comment(lib, "glew32d.lib")
#pragma comment(lib, "freeglut.lib")

#define MAXZ 8.0
#define MINZ -8.0
#define ZINC 0.4
static float solidZ = MAXZ;
static float transparentZ = MINZ;
static GLuint sphereList , cubeList;

static void init()
{
	GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 0.15};
	GLfloat mat_shininess[] = { 100.0};
	GLfloat position[] = { 0.5, 0.5, 1.0, 0.0};

	glMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular );
	glMaterialfv( GL_FRONT, GL_SHININESS, mat_shininess );
	glMaterialfv( GL_FRONT, GL_POSITION, position );

	glEnable( GL_LIGHTING);
	glEnable( GL_LIGHT0 );
	glEnable( GL_DEPTH_TEST );

	sphereList = glGenLists( 1 );
	glNewList( sphereList, GL_COMPILE );
		glutSolidSphere( 0.4, 16, 16);
	glEndList();

	cubeList = glGenLists( 1 );
	glNewList( cubeList, GL_COMPILE );
		glutSolidCube( 0.6 );
	glEndList();
}

void display()
{
	GLfloat mat_solid[] = {0.75, 0.75, 0.0, 1.0};
	GLfloat mat_zero[] = {0.0, 0.0, 0.0, 1.0};
	GLfloat mat_transparent[] = {0.0, 0.8, 0.8, 0.6};
	GLfloat mat_emission[] = {0.0,0.3,0.3,0.6};

	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

	glPushMatrix();
		glTranslated( -0.15, -0.15, solidZ);
		glMaterialfv( GL_FRONT, GL_EMISSION, mat_zero);
		glMaterialfv( GL_FRONT, GL_DIFFUSE, mat_solid );
		glCallList( sphereList );
	glPopMatrix();

	glPushMatrix();
		glTranslatef( 0.15, 0.15, transparentZ );
		glRotatef( 15.0, 1.0, 1.0, 0.0);
		glRotatef( 30.0, 0.0, 1.0, 0.0);
		glMaterialfv( GL_FRONT, GL_EMISSION, mat_emission);
		glMaterialfv( GL_FRONT, GL_DIFFUSE, mat_transparent );
		glEnable( GL_BLEND );
		glDepthMask( GL_FALSE );
		glBlendFunc(GL_SRC_ALPHA, GL_ONE );
		glCallList( cubeList );
		glDepthMask( GL_TRUE );
		glDisable( GL_BLEND );
	glPopMatrix();

	glutSwapBuffers();
}

void reshape( int w, int h)
{
	glViewport( 0,0,(GLint)w, (GLint)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();
}

void animate( void )
{
	if( solidZ <= MINZ || transparentZ >= MAXZ )
		glutIdleFunc( NULL );
	else
	{
		solidZ -= ZINC;
		transparentZ += ZINC;
		glutPostRedisplay();
	}
}

void keyboard( unsigned char key, int x, int y)
{
	switch( key)
	{
	case 'a':
	case 'A':
		solidZ = MAXZ;
		transparentZ = MINZ;
		glutIdleFunc( animate);
		break;
	case 'r':
	case 'R':
		solidZ = MAXZ;
		transparentZ = MINZ;
		glutPostRedisplay( );
		break;
	case 'Q':
		exit( 0 );
		break;
	}
}

int main( int argc, char** argv)
{
	glutInit( &argc, argv );
	glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
	glutInitWindowSize( 500, 500);
	glutInitWindowPosition(100, 100);
	glutCreateWindow( argv[0] );

	init();
	glutReshapeFunc( reshape );
	glutKeyboardFunc( keyboard );
	glutDisplayFunc( display );
	glutMainLoop();

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值