OpenGLES---画一个矩形

这篇博客介绍了如何在OpenGLES 2.0环境下绘制一个矩形,提供了源码下载链接,包括RectShader的运行结果和完整工程。文章讨论了在OpenGL_ES中画东西的不同方式,讲解了如何引用Shader中的属性并设置Shader数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

{目录
	RectShader  
	RectWin  窗口
	画东西的几种类型
	引用Shader中的属性(自己在Shader中写的一些需要传值的类型) glGetU/A...
	设置Shader数据(Shader什么类型就用什么类型设置内容) glU/V...
}

-- RectShader

#include <gles2/gl2.h>
#include <assert.h>

typedef     int uniform;
typedef     int attribute;
typedef		int location; 


class ShaderId
{
public:
	ShaderId(){id=-1;};
public:
	int id;
}; 

class ShaderVeual
{
public:
	ShaderVeual(){_programId=-1;}
public:
	int  _programId;
	ShaderId  _vertex;
	ShaderId  _fragment;
};

class RectShader
{
public:
	ShaderVeual shaderveual;

	attribute   _position;
	uniform		_color;
	uniform     _MVP;

public :
	RectShader(){
		_position=-1;
		_color=-1;
		_MVP=-1;
	}

	void shaderInit(){
		const char* vs  = {
			"precision  lowp float;"//制定float的精度(lowp低精度)
			"uniform    mat4    _MVP;"
			"attribute  vec2    _position;"
			"void main()"
			"{"
			"   vec4    pos =   vec4(_position,0,1);"
			"   gl_Position =   _MVP * pos;"
			"}"
		};
		const char* ps  = {
			"precision lowp float;"
			"uniform    vec4   _color;"
			"void main()"
			"{"
			"   gl_FragColor    =  _color;"
			"}"
		};
		shaderveual=createProgram(vs,ps);
		//获取属性的位置
		_position   = glGetAttribLocation(shaderveual._programId, "_position");
		_color		= glGetUniformLocation(shaderveual._programId,"_color");
		_MVP        = glGetUniformLocation(shaderveual._programId,"_MVP");
	}

	void begin(){	
		// 使用程序
		glUseProgram(shaderveual._programId);
		//启用顶点数组
		glEnableVertexAttribArray(_position);
	}
	void end(){

		//禁用顶点数组
		glDisableVertexAttribArray(_position);
		// 使用完成
		glUseProgram(0);
	
	}

	virtual ShaderVeual createProgram( const char* vertex,const char* fragment ){
        ShaderVeual   program;
        bool  error   =   false;
        do{
            if (vertex){
				// 创建Shader (GL_VERTEX_SHADER 顶点Shader,GL_FRAGMENT_SHADER 像素Shader)
                program._vertex.id   = glCreateShader( GL_VERTEX_SHADER );
				//制定shader的源代码
                glShaderSource( program._vertex.id, 1, &vertex, 0 );
				//编译Shader
                glCompileShader( program._vertex.id );

				//检查编译状态
                GLint   compileStatus;
				/** 获取Shader编译状态
				* GL_COMPIL
### Android OpenGL ES 绘制矩形并实现拖动手势 在 Android 平台上使用 OpenGL ES 实现绘制矩形以及支持手势拖动功能涉及多个方面的工作。下面将详细介绍如何完成这一目标。 #### 创建顶点着色器和片段着色器 为了渲染矩形,首先需要定义两个着色器程序:一个是用于处理顶点位置的顶点着色器;另一个则是决定颜色输出的片段着色器[^1]。 ```glsl // Vertex Shader Code private final String vertexShaderCode = "uniform mat4 uMVPMatrix;" + "attribute vec4 vPosition;" + "void main() {" + " gl_Position = uMVPMatrix * vPosition;" + "}"; // Fragment Shader Code private final String fragmentShaderCode = "precision mediump float;" + "uniform vec4 vColor;" + "void main() {" + " gl_FragColor = vColor;" + "}"; ``` #### 初始化缓冲区数据 接着要设置好存储几何形状信息的数据结构——即浮点型数组来保存矩形四个角的位置坐标,并将其加载到 GPU 中作为 Buffer 对象供后续绘图调用时读取。 ```java float[] shapeCoords = { -0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f}; ByteBuffer bb = ByteBuffer.allocateDirect(shapeCoords.length * 4); bb.order(ByteOrder.nativeOrder()); FloatBuffer vertexBuffer = bb.asFloatBuffer(); vertexBuffer.put(shapeCoords); vertexBuffer.position(0); int buffer[]; GLES20.glGenBuffers(1, buffer, 0); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffer[0]); GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, shapeCoords.length * 4, vertexBuffer,GLES20.GL_STATIC_DRAW); ``` #### 处理触摸事件以更新矩阵变换参数 为了让矩形能够响应用户的触控操作而移动,在 `onTouchEvent` 方法内捕获动作变化并将这些改变映射成相应的平移量应用于模型视图投影矩阵之上。 ```java public boolean onTouchEvent(MotionEvent event){ int action=event.getActionMasked(); switch(action){ case MotionEvent.ACTION_DOWN: startX=event.getX(); startY=event.getY(); break; case MotionEvent.ACTION_MOVE: float deltaX=event.getX()-startX; float deltaY=event.getY()-startY; Matrix.translateM(mModelViewProjectionMatrix, 0,deltaX/width,-deltaY/height,0); startX=event.getX(); startY=event.getY(); requestRender(); break; } return true; } ``` 以上代码展示了如何利用 OpenGL ES 在 Android 上创建一个简单的可交互式的二维图形应用实例。需要注意的是实际开发过程中还需要考虑更多细节比如优化性能、异常情况下的健壮性等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值