`
tiankefeng0520
  • 浏览: 145721 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习二十八:蒙版

 
阅读更多

(本节对应分析NEHE教程第20课)

 

有时我们希望上层的图片的某些区域能投出下层的某些区域。当然我们可以通过关

键色进行处理,但是蒙版技术一样可以达到这样的效果,通过以下图片达到蒙版的效果

 

本节包含2个技术点
1.如何让纹理移动,放大(不是图像位置移动,是纹理移动)(前面以及介绍过了)
2.蒙版的设计
蒙版设计简单的说是通过控制Alpha来让白色的部分透,黑色的部分不透

 

蒙版的设计
1.第一张图与第二张图进行混合(1下2上),期望达到的效果是2图黑色部分不透,白色部分透到1图
分析:R新=Rs+Rd; G新=Gs+Gd; B新=Bs+Bd;其实S为图2,D为图1
期望效果:图2黑色区域:R新=Rd;G新=Gd; B新=Bd;
          图2白色区域:R新=Rs;G新=Gs; B新=Bs;
因此glBlendFunc(GL_DST_COLOR,GL_ZERO);方式进行混合的时候满足要求

2.第三张图与前两张混合,期望达到的效果是图3黑色区域透,非黑区域不透(S为图3,D为上一步混合图)
期望效果:图3黑色区域:R新=Rd;G新=Gd; B新=Bd;
         图3非黑色区域:R新=Rs;G新=Gs; B新=Bs;
因此 glBlendFunc(GL_ONE, GL_ONE) ;方式进行混合的时候满足要求
总结,蒙版技术看似2个图的混合,是指为3个图的混合而成,
我们期望达到的效果是图3黑色区域透出图1部分,非黑色部分不透。解决办法就是增加掩图(图2),掩图白色区域对于图3黑色区域,黑色其余对应图3非黑色区域

 

#include "header.h"

bool	masking=TRUE;		
bool	scene;				

GLuint	texture[5];			
GLuint	loop;				

GLfloat	roll;			


AUX_RGBImageRec *LoadBMP(char *Filename)               
{
        FILE *File=NULL;                                
        if (!Filename)                                 
        {
                return NULL;                            
        }
        File=fopen(Filename,"r");                       
        if (File)                                      
        {
                fclose(File);                           
                return auxDIBImageLoad(Filename);       
        }
        return NULL;                                   
}

int LoadGLTextures()                                   
{
        int Status=FALSE;                             
        AUX_RGBImageRec *TextureImage[5];              
        memset(TextureImage,0,sizeof(void *)*5);        

        if ((TextureImage[0]=LoadBMP("Data/logo.bmp")) &&	
			(TextureImage[1]=LoadBMP("Data/mask1.bmp")) &&	
			(TextureImage[2]=LoadBMP("Data/image1.bmp")) &&	
			(TextureImage[3]=LoadBMP("Data/mask2.bmp")) &&	
			(TextureImage[4]=LoadBMP("Data/image2.bmp")))	
        {
                Status=TRUE;                            
                glGenTextures(5, &texture[0]);         

				for (loop=0; loop<5; loop++)			
				{
	                glBindTexture(GL_TEXTURE_2D, texture[loop]);
			        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
				    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
					glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
				}
        }
		for (loop=0; loop<5; loop++)						
		{
	        if (TextureImage[loop])						
		    {
			        if (TextureImage[loop]->data)			
				    {
					        free(TextureImage[loop]->data);	
					}
					free(TextureImage[loop]);				
			}
		}
        return Status;                                
}

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)		
{
	if (height==0)									
	{
		height=1;									
	}

	glViewport(0,0,width,height);					
	glMatrixMode(GL_PROJECTION);						
	glLoadIdentity();								
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);	
	glMatrixMode(GL_MODELVIEW);							
	glLoadIdentity();								
}

int InitGL(void)										
{
	if (!LoadGLTextures())								
	{
		return FALSE;								
	}

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);			
	glClearDepth(1.0);								
	glEnable(GL_DEPTH_TEST);							
	glShadeModel(GL_SMOOTH);							
	glEnable(GL_TEXTURE_2D);							
	return TRUE;									
}

void DrawGLScene(void)									
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();									
	glTranslatef(0.0f,0.0f,-2.0f);						

	glBindTexture(GL_TEXTURE_2D, texture[0]);			
	glBegin(GL_QUADS);									
		glTexCoord2f(0.0f, -roll+0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);	
		glTexCoord2f(3.0f, -roll+0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);	
		glTexCoord2f(3.0f, -roll+3.0f); glVertex3f( 1.1f,  1.1f,  0.0f);	
		glTexCoord2f(0.0f, -roll+3.0f); glVertex3f(-1.1f,  1.1f,  0.0f);	
	glEnd();											

	glEnable(GL_BLEND);									
	glDisable(GL_DEPTH_TEST);						

	if (masking)									
	{
		glBlendFunc(GL_DST_COLOR,GL_ZERO);				
	}

	if (scene)									
	{
		glTranslatef(0.0f,0.0f,-1.0f);					
		glRotatef(roll*360,0.0f,0.0f,1.0f);				
		if (masking)									
		{
			glBindTexture(GL_TEXTURE_2D, texture[3]);	
			glBegin(GL_QUADS);							
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);	
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);	
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.1f,  1.1f,  0.0f);	
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.1f,  1.1f,  0.0f);	
			glEnd();									
		}

		glBlendFunc(GL_ONE, GL_ONE);					
		glBindTexture(GL_TEXTURE_2D, texture[4]);		
		glBegin(GL_QUADS);								
			glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);	
			glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);	
			glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.1f,  1.1f,  0.0f);	
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.1f,  1.1f,  0.0f);	
		glEnd();										
	}
	else												
	{
		if (masking)								
		{
			glBindTexture(GL_TEXTURE_2D, texture[1]);	
			glBegin(GL_QUADS);						
				glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);	
				glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);	
				glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 1.1f,  1.1f,  0.0f);	
				glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-1.1f,  1.1f,  0.0f);	
			glEnd();									
		}

		glBlendFunc(GL_ONE, GL_ONE);					
		glBindTexture(GL_TEXTURE_2D, texture[2]);		
		glBegin(GL_QUADS);								
			glTexCoord2f(roll+0.0f, 0.0f); glVertex3f(-1.1f, -1.1f,  0.0f);
			glTexCoord2f(roll+4.0f, 0.0f); glVertex3f( 1.1f, -1.1f,  0.0f);
			glTexCoord2f(roll+4.0f, 4.0f); glVertex3f( 1.1f,  1.1f,  0.0f);	
			glTexCoord2f(roll+0.0f, 4.0f); glVertex3f(-1.1f,  1.1f,  0.0f);	
		glEnd();										
	}

	glEnable(GL_DEPTH_TEST);							
	glDisable(GL_BLEND);						

	glFlush();										
}


void rotate()
{
	roll+=0.002f;									
	if (roll>1.0f)									
	{
		roll-=1.0f;										
	}
	glutPostRedisplay();
}
void mouse(int button,int state,int x,int y)
{ 
	switch(button)
	{
	case GLUT_LEFT_BUTTON:
		if(GLUT_DOWN==state)
		{
			glutIdleFunc(rotate);
		}
		break;
	case GLUT_RIGHT_BUTTON:
		if(GLUT_DOWN==state)
		{
			//glutIdleFunc(0);
		}
		break;
	}
}
void keyboard(unsigned char key,int x,int y)
{
	switch (key)
	{
	case 'M':
		masking=true;
		break;
	case 'm':
		masking=false;
		break;
	case 'S':
		scene=true;
		break;
	case 's':
		scene=false;	
		break;
	}
	glutPostRedisplay();

}


int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
	glutInitWindowSize(800,600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("蒙版");
	InitGL();
	glutDisplayFunc(DrawGLScene);
	glutKeyboardFunc(keyboard);
	glutMouseFunc(mouse);
	glutReshapeFunc(ReSizeGLScene);
	glutMainLoop();
}

 

 

 

  • 大小: 14.1 KB
  • 大小: 10.6 KB
  • 大小: 16.1 KB
分享到:
评论

相关推荐

    OpenGL蒙版实例

    总之,OpenGL蒙版实例是一个很好的学习资源,通过理论结合实践,可以帮助开发者掌握如何利用模板缓冲区创造出丰富的视觉效果。无论你是初学者还是有经验的开发者,都应该深入研究这一主题,以提升你的OpenGL技能。

    OpenGLES demo - 16. 蒙板 Stencil

    蒙板 Stencil"的示例可能包含了如何设置和使用模板缓冲的具体代码和步骤,是初学者学习OpenGLES蒙板功能的好资源。通过分析和运行这个示例,你可以更好地理解模板缓冲在实际场景中的应用,并且能够灵活地将其应用于...

    OpenGL NeHe 源码(25-45)

    OpenGL NeHe 源码系列是学习OpenGL编程的经典教程,涵盖了广泛的图形技术。在这个压缩包中,包含了25到45课的源代码,虽然没有包含46到48课,但仍然为我们提供了丰富的学习资源。以下是每个示例的主要知识点: 1. *...

    after_effects_reference.pdf

    #### 二、新增功能解析 - **新增功能概述**: - **Creative Cloud Libraries**:与 Adobe Stock 集成,可以方便地访问和使用高质量的素材资源。 - **人脸跟踪器**:新增的人脸跟踪功能能够精确捕捉面部特征的变化...

    业务Photoshop-CS基础教程课课件免费下载(完整版).doc

    - **蒙版面板**:图层蒙版面板提供了更为灵活的蒙版编辑工具,包括浓度、羽化的设置,方便用户进行复杂的图像选取和编辑。 - **旋转视图工具**:此工具允许用户自由旋转工作区,打破传统视角限制,提高创作的自由...

    (完整版)Photoshop-CS4基础教程-精品课课件(全套讲义)免费下载.ppt

    蒙版面板:图层蒙版面板可以对蒙版图像进行浓度与羽化设置,快速创建和编辑蒙版。 * 4. 旋转视图工具:新增旋转视图工具,可以对图像进行随意旋转,打破了以往软件的局限,可以根据需要对图像进行旋转调整,便于...

    photoshop cs4 自学教程

    #### 二、Photoshop CS4的学习方法 - **熟悉软件安装与卸载**:首先需要了解Photoshop CS4的安装与卸载步骤,确保软件能够正常运行于当前计算机系统。 - **了解工作界面**:熟悉Photoshop CS4的工作界面对于后续的...

    计算机软件-商业源码-实例七---photoshop图层效果.zip

    例如,使用OpenGL或DirectX进行高性能的图形处理,或者利用WebGL在浏览器环境中实现图层效果。 6. **混合模式**:在Photoshop中,图层可以有不同的混合模式,如正常、溶解、正片叠底、滤色、饱和度等。每种模式都有...

    本篇文章所使用的自定义画笔的图片

    通过学习如何导入、使用和调整自定义画笔,可以极大地提高图像处理和设计的灵活性,创造出独一无二的艺术作品。所以,对于任何想在Photoshop中提升创作水平的用户来说,掌握自定义画笔的使用是非常重要的。

    一个VC写的图像处理软件

    7. **图像合成**:如拼接、蒙版、混合模式等,这些涉及到图像层的操作。 8. **用户界面**:一个良好的图形用户界面(GUI)可以让用户直观地操作和查看图像,VC提供MFC(Microsoft Foundation Classes)库来简化GUI...

    动画天堂

    在编程方面,动画制作可能会涉及各种编程语言,如Python、JavaScript、C++,以及专门的图形处理库如OpenGL、Unity3D等。源代码可能包含了这些语言的实现,帮助用户理解和学习动画的编程逻辑。对于初学者,可以通过...

    UnityMatCapShader:Unity MatCap着色器

    Unity MatCap着色器是一种在Unity引擎中广泛使用的视觉效果技术,主要用于创建具有立体感和反射...开发者可以通过研究这些源代码和资源,学习如何在自己的项目中实现和定制MatCap着色器,以提升3D场景的视觉表现力。

    Photoshop CS4基础教程

    图层蒙版面板提供了更多控制,可以调整蒙版的浓度和羽化,方便创建和编辑。旋转视图工具允许用户自由旋转图像,打破传统限制。内容识别比例功能在裁剪照片时能自动填充背景,保持照片完整性。自动对齐图层命令则能将...

    LodePaint-开源

    这意味着代码是公开的,任何人都可以查看、学习甚至修改源代码,以适应自己的特定需求或贡献新的功能。开源社区的活跃度使得软件不断进化,用户可以享受到持续改进和更新的软件体验。此外,开源也意味着用户不必担心...

    《iPhone开发实战》.(Christopher Allen).pdf

     本书适合所有 iphone开发人员学习参考。... 目录 第一部分 iphone编程简介. 第1章 iphone简介2 1.1 iphone核心规范3 1.1.1 iphone的输入及输出规范3 1.1.2 iphone网络规范4 1.1.3 iphone浏览器规范5...

    Vector File Parser-开源

    这意味着开发者可以为 OpenGL、DirectX、Canvas、SVG DOM 或其他任何支持矢量图形的系统提供适配器,让 Vector File Parser 解析出的数据能够在任何支持的平台上无缝展示。 5. **开源优势** 作为开源软件,Vector ...

Global site tag (gtag.js) - Google Analytics