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

OpenGL学习十六:纹理绑定

 
阅读更多

前面介绍的都是给图元添加颜色,纹理绑定介绍的是如果把图片绑定到图元,主要步骤如下:(这里这是简单介绍,后续详细说明)

1.生成纹理ID
glGenTextures(1, &texture[0]);
2.创建纹理对象
glBindTexture(GL_TEXTURE_*D, texture[0]);
3.指定纹理内容
glTexImage*D();
4.指定纹理属性
glTexParameteri(…, ......, …)
5.激活纹理功能
glBindTexture(GL_TEXTURE_*D, texture[0]);
6.提供纹理坐标
glTexCoord*()

 

技巧:纹理贴图以逆时针方式进行:
1.左下(0,0)
2.右下(1,0)
3.左上 (0,1)
4.右上(1,1)

#include "header.h"

GLfloat	xrot;				
GLfloat	yrot;				
GLfloat	zrot;				

GLuint	texture[1];			

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[1];					

	memset(TextureImage,0,sizeof(void *)*1);           


	if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
	{
		Status=TRUE;									

		glGenTextures(1, &texture[0]);				

		
		glBindTexture(GL_TEXTURE_2D, texture[0]);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	}

	if (TextureImage[0])									
	{
		if (TextureImage[0]->data)						
		{
			free(TextureImage[0]->data);					
		}

		free(TextureImage[0]);						
	}

	return Status;									
}

void 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;									
	}

	glEnable(GL_TEXTURE_2D);							
	glShadeModel(GL_SMOOTH);							
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				
	glClearDepth(1.0f);									
	glEnable(GL_DEPTH_TEST);							
	glDepthFunc(GL_LEQUAL);								
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	
	return TRUE;										
}

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

	glRotatef(xrot,1.0f,0.0f,0.0f);
	glRotatef(yrot,0.0f,1.0f,0.0f);
	glRotatef(zrot,0.0f,0.0f,1.0f);

	glBindTexture(GL_TEXTURE_2D, texture[0]);

	glBegin(GL_QUADS);
		// Front Face
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		// Back Face
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		// Top Face
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		// Bottom Face
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		// Right face
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
		// Left Face
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
	glEnd();

	xrot+=0.3f;
	yrot+=0.2f;
	zrot+=0.4f;
	glFlush();
}

void rotate()
{
	xrot+=0.3f;
	yrot+=0.2f;
	zrot+=0.4f;
	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;
	}
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(640,480);
	glutCreateWindow("纹理绑定");
	glutReshapeFunc(ReSizeGLScene);
	glutDisplayFunc(DrawGLScene);
	glutMouseFunc(mouse);
	InitGL();
	glutMainLoop();
	return 0;
}

 

  • 大小: 18.7 KB
  • 大小: 21.6 KB
分享到:
评论

相关推荐

    Android平台OpenGLES3将GL-TEXTURE-2D纹理id渲染到ImageReader提供的Surface上

    1、OpenGLES3中加载GL_TEXTURE_2D纹理,生成纹理ID; 2、通过EGL构建EGLDisplay虚拟屏幕,并绑定ImageReader提供的Surface; 3、在EGL线程中,渲染GL_TEXTURE_2D对应的纹理图形; 4、在EGL线程中,完成渲染后,通过...

    Android-OpenGL-Engine:适用于Android的基本OpenGL ES2引擎

    Description(说明):该引擎已设置为处理加载精灵图或单个单元的纹理,并使用精灵进行绑定和显示。 发动机还设计为尽可能简单地执行此操作。 OpenGL的最大困难之一是显示从任何truetype字体文件加载的清晰可读的...

    OpenGL编程指南(原书第8版)

    , 本书清晰地讲解了OpenGL的相关功能与技术,包括几何对象顶点的传递、细分,几何着色器中的几何变换,通过片元着色器来操作像素和纹理贴图,以及基于帧缓存对象和计算着色器的先进数据操作技术。, 《OpenGL编程指南...

    Nehe的OpenGL教程电子书

    利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错。你可以试试。 36.放射模糊和渲染到纹理 如何实现放射状的滤镜效果呢,看上去很难,其实很简单。把渲染得图像作为纹理提取出来,...

    Android使用MediaCodeC与OpenGL硬解码 录制mp4音视频实现源码

    将Camera数据显示到OpenGL ES渲染的图像中,并通过MediaCodeC 将 OpenGL ES 缓冲数据,硬编码写入到 mp4 视频文件中,完成视频的录制。 文件介绍请见: https://xiaxl.blog.csdn.net/article/details/72530314 ...

    OpenGLES渲染播放Sdcard中的视频资源

    a、在OpenGL ES中创建 samplerExternalOES 类型纹理,用于渲染展示视频图像; b、通过 samplerExternalOES 纹理创建一个 SurfaceTexture; c、通过 SurfaceTexture 生成一个 Surface; d、将该 Surface 绑定到 ...

    emacs-gl:Emacs Lisp的OpenGL绑定

    特征OpenGL版本3.3之前的OpenGL命令的原始绑定用于将图像加载到纹理中的Helper函数( gl-helper-load-texture和gl-helper-bind-texture ) 基于的GUI渲染安装要求具有GLArea xwidget功能和模块支持的GNU Emacs。...

    OPenGL编程书籍

    利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错。你可以试试。 36.放射模糊和渲染到纹理 如何实现放射状的滤镜效果呢,看上去很难,其实很简单。把渲染得图像作为纹理提取出来,在...

    kotlin-opengl-es-3-basic:Kotlin OpenGL ES 3基础

    使用纹理阵列将所有纹理图集捆绑到一个纹理对象中。 毫不费力地在着色器中使用任何您喜欢的图集。 将您的转换数据绑定到单个VBO。 将属性分配给您的VBO,以便您可以在着色器中方便地访问它们。 使用实例渲染来...

    legui:Java OpenGL GUI库。 为与最新的LWJGL(LWJGL 3)结合使用而创建

    纹理绑定也会受到影响。 当用户加载图像或添加新的字形时,纹理更新可能会发生。 根据需要添加字形的render()方法的开始和结束。 整个帧的数据在渲染结束时进行缓冲和刷新。 以下代码说明了渲染代码所涉及的OpenGL...

    GLUWP:UWP上C#中的OpenGL

    绑定远未完成,但是它们足以使我的简单应用程序正常工作(它们涵盖了基础知识:纹理,着色器,顶点缓冲区和绘制调用)。 UWP不包括OpenGL实现,因此GLUWP将引用为其OpenGL实现。入门SampleApp项目应该是开箱即用的...

    OpenGlDome:OpenGl的使用练习(安卓Java opengl3.0)

    要注意纹理单元和纹理的概念,纹理替代绑定纹理单元0 6,影子文件 阴影贴图 两步渲染:1,使用帧长度延伸深度纹理,通过光的角度,取代一遍物体2,画阴影平面,通过光的角度,利用上一次深度纹理,对比平面上点的...

    计算机图形学OpenGL——地月系

    绑定纹理,添加雾化效果,能旋转,设置环境光

    limitless-engine:OpenGL C ++图形引擎

    纹理单元自动绑定 缓冲区流:孤立,不同步,持久,连贯,+隔离 不变的存储支持 命名缓冲区对象支持 无边界的纹理 持久/相干映射+三重缓冲+显式同步 物料系统 反照率 高光 普通的 发光颜色 发光面罩 混合面膜 粗糙度+...

    gl-engine:使用C ++和OpenGL的渲染引擎

    链接到演示卷轴: : 屏幕截图使用基于图像的照明的示例: G缓冲区结构:产品特点摄影机机芯放大/缩小接触 : 光圈快门速度ISO标准TODO:其他基于物理的相机参数纹理: 随时随地进行初始化/加载/绑定各向异性过滤高...

    stb_image_ffi:使用Ruby-FFI绑定stb_image(单个文件图像加载库)

    仅实现stbi_set_flip_vertically_on_load和stb_load因为这是我需要在OpenGL中将图像作为纹理加载的2个功能。 我这样做而不是使用的原因是,据我所知,stb-image没有实现stbi_set_flip_vertically_on_load ,当想要...

    MagicTools引擎(d3d与opengles渲染器,集成cocos2d)

    gles环境下定了一个简单的脚本,控制固定功能渲染中的diffuse、specular和第一层纹理的参数 自定义了模型网格、骨骼、动画、材质、渲染实体等文件格式,这些文件格式说明放在了fileformats目录下。 渲染实体(Model...

    Prime:纯Java编写的逼真的渲染器,具有在OpenGL和Swing中完成的UI

    Prime是基于物理的渲染器,基于具有JOGL绑定的纯Java构建,具有: 蒙特卡洛路径跟踪。 光子映射。 可自定义的材质和渲染管道。 将添加以下功能:1.网络分布式渲染。 2.纹理贴图和法线贴图。 怎么跑 确保已经...

    opengl游戏引擎

    创建纹理时,请勿将其绑定到任何特定的纹理单元 当您真正想使用它时就去做 纹理单位索引 GL_TEXTURE0不为0 ,因此您可以这样设置sampler2D setInt ( " texture_sampler " , 2 ); // don't use GL_TEXTURE0

    texture-packer-plugin:使用 LibGdx 的 TexturePacker 自动打包图像的 SBT 插件

    它能做什么LibGdx 的 TexturePacker 在OpenGL中,一个纹理被绑定,一些绘制完成,另一个纹理被绑定,更多的绘制完成等等。绑定纹理的成本相对较高,因此理想的做法是在一个较大的图像上存储许多较小的图像,绑定较大...

Global site tag (gtag.js) - Google Analytics