OpenGLES---小窗口

原创 2016年06月01日 16:41:34
{
	1:创建一个没有数据的纹理
	2:把屏幕上的某块拆下来,贴上去
	3:三个注意
}


1:创建一个没有数据的纹理
	//创建一个没有数据的纹理
	virtual unsigned createTexture(int width,int height){
		unsigned texture;
		//生成纹理索引
		glGenTextures(1,&texture);
		glBindTexture(GL_TEXTURE_2D,texture);//绑定纹理
		//放大滤波/缩小滤波
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		//水平垂直重绘
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
		glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,width,height,0,GL_RGB,GL_UNSIGNED_BYTE,0);
		return texture;
	}
	//纹理id
	unsigned kongbaiId=createTexture(_width,_height);



2:把屏幕上的某块拆下来,贴上去
	x=0,y=0,z=0;
	float w=200,h=200;

	Vertex xt[]={
		CELL::float3(x,y,0),	    CELL::float2(0,1),		CELL::float4(1,1,1,1),
		CELL::float3(x,y+h,0),		CELL::float2(0,0),		CELL::float4(1,1,1,1),
		CELL::float3(x+w,y,0),	    CELL::float2(1,1),		CELL::float4(1,1,1,1),
		CELL::float3(x+w,y+h,0),	CELL::float2(1,0),	    CELL::float4(1,1,1,1),
	};
	//绑定纹理
	glBindTexture(GL_TEXTURE_2D,kongbaiId);
	//拷贝局部纹理
	glCopyTexSubImage2D(GL_TEXTURE_2D,0,0,0,0,0,_width,_height);
	CELL::matrix4 mat=CELL::ortho<float>(0,(float)_width,(float)_height,0,-100,100);
	glUniformMatrix4fv(shader._MVP,1,false,mat.data());

	glVertexAttribPointer(shader._position,3,GL_FLOAT,false,sizeof(Vertex),&xt[0].pos);
	glVertexAttribPointer(shader._tpos,2,GL_FLOAT,false,sizeof(Vertex),&xt[0].uvpos);
	glVertexAttribPointer(shader._color,4,GL_FLOAT,false,sizeof(Vertex),&xt[0].rgba);
	glDrawArrays(GL_TRIANGLE_STRIP,0,sizeof(xt)/sizeof(xt[0]));


3:三个注意
	1:创建一张空纹理的大小问题,一定要获取你要显示整个页面的大小而不是放在什么地方的大小
		例如:显示一个小窗口,显示的大小是整个屏幕的大小,放到什么位置的大小是当前纹理贴到小窗口位置上的大小
	2:OpenGL-ES 状态机
		纹理1
			glActiveTexture(GL_TEXTURE0);//指定纹理级别(一张纹理不需要)
			glBindTexture(GL_TEXTURE_2D,t0);//绑定纹理
			glUniform1i(shader._tId0,0);//指定纹理阶段[0,31]
			...

			glVertexAttribPointer(shader._position,3,GL_FLOAT,false,sizeof(Vertex),&xt[0].pos);
			glVertexAttribPointer(shader._tpos,2,GL_FLOAT,false,sizeof(Vertex),&xt[0].uvpos);
			glVertexAttribPointer(shader._color,4,GL_FLOAT,false,sizeof(Vertex),&xt[0].rgba);
			...
		纹理2
			glBindTexture(GL_TEXTURE_2D,kongbaiId);//绑定纹理
			glCopyTexSubImage2D(GL_TEXTURE_2D,0,0,0,0,0,_width,_height);//拷贝局部纹理

			glVertexAttribPointer(shader._position,3,GL_FLOAT,false,sizeof(Vertex),&xt[0].pos);
			glVertexAttribPointer(shader._tpos,2,GL_FLOAT,false,sizeof(Vertex),&xt[0].uvpos);
			glVertexAttribPointer(shader._color,4,GL_FLOAT,false,sizeof(Vertex),&xt[0].rgba);
			...
		类似这样glVertexAttribPointer,glUniformMatrix4f函数都是在当前状态机下设置属性
	3:纹理翻转
		正常纹理坐标和顶点坐标是一一对应的
				CELL::float3(x,y,0),	    CELL::float2(0,0)
				CELL::float3(x,y+h,0),		CELL::float2(0,1)
				CELL::float3(x+w,y,0),	    CELL::float2(1,0)
				CELL::float3(x+w,y+h,0),	CELL::float2(1,1)
		垂直翻转的纹理坐标(把对应y轴翻转了一下)
				CELL::float3(x,y,0),	    CELL::float2(0,1)
				CELL::float3(x,y+h,0),		CELL::float2(0,0)
				CELL::float3(x+w,y,0),	    CELL::float2(1,1)
				CELL::float3(x+w,y+h,0),	CELL::float2(1,0)



源码地址

http://pan.baidu.com/s/1geVargZ    OpenGL_ES(6.1).zip






OpenGLES---Windows窗口

class WinApp{public: WinApp(HINSTANCE hInstance); virtual~WinApp(void); virtual LRESULT onEvent(...

OpenGLES入门一之渲染窗口

iOS上绘制图形的方式很多,UIKit,CoreGraphics,SpriteKit,OpenGL ES,Metal等可以绘制图形。这里是OpenGL ES的零基础入门学习。 OpenGL ES是一...

openGLES 3.0

  • 2017年11月19日 22:43
  • 7.45MB
  • 下载

OBJ2OpenGLES 示例代码

  • 2017年10月13日 14:31
  • 4.66MB
  • 下载

Android OpenGLES2.0(三)——等腰直角三角形和彩色的三角形

上一篇博客中我们已经绘制出了一个直角三角形,虽然我们相对于坐标,我们设置的直角三角形的两腰是相等的,但是实际上展示出来的却并不是这样,虽然通过计算,我们可以把三角形的两腰计算一下比例,使它们在坐标上不...
  • junzia
  • junzia
  • 2016年10月14日 18:06
  • 3027

opengles ios

  • 2015年04月02日 22:23
  • 13.21MB
  • 下载

从零开始学OpenGLES开发——第二章

从零开始学OpenGLES开发——第二章 第二章 OpenGLES1.0的纹理贴图 将上一章的代码精简一下,只画留一个三角形的绘制。 数据初始化代码: private Flo...

OpenGLES demo - 4. GL中的三角形

  • 2014年06月24日 19:47
  • 35KB
  • 下载

OpenGLES demo - 16. 蒙板 Stencil

  • 2014年08月18日 22:03
  • 35KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGLES---小窗口
举报原因:
原因补充:

(最多只允许输入30个字)