OpenGL入门10——颜色混合

来源:互联网 发布:filter() 数组 编辑:程序博客网 时间:2024/06/09 23:27

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

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

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

#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);elseglOrtho( -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.4static 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 );elseglOrtho( -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;}



0 0
原创粉丝点击