您的位置:首页 > 运维架构

OpenGL入门10——颜色混合

2015-03-22 13:21 330 查看
源混合因子:是指新片断(即正在绘制的图形)的系数,会与源颜色相乘

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

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: