OpenglES2.0 for Android:来画个矩形吧

OpenGL ES 2.0 for Android教程(二):定义顶点和着色器 OpenGL ES 2 第二章:定义顶点和着色器 本章介绍我们的第一个项目:一个简单的空中曲棍球游戏。在我们进行这个项目的过程中,我们将了解OpenGL的一些主要构建块。我们将从学习如何使用一组称为顶点(vertices)的独立点来构建对象开始,然后我们学习如何使用着色器来绘制这些对象,所谓的着色器,是告诉OpenGL如何绘制对象的小程序。这两个概念非常重要,因为几乎每个对象都是通过将顶点连接成点、线和三角形来构建的,这些基本体都通过使用着色器绘制。 我们将首先了解顶点,这样我们就可以建立我们的空气曲棍球桌 阅读详情

OpenglES2.0 for Android:来画个矩形吧


上一节中我们绘制了一个三角形,我们在上一节的基础上来完成矩形的绘制 。

OK,开始动手做吧,首先在上一节的项目中的shape目录下新建一个类——Square (Square.java),然后定义矩形的四个顶点的坐标,此时代码如下(Square.java):

<span style="font-size:14px;">package com.cumt.shape;

public class Square {

	//float类型的字节数
	private static final int BYTES_PER_FLOAT = 4;
	// 数组中每个顶点的坐标数
    static final int COORDS_PER_VERTEX = 2;
	//矩形顶点坐标
	static float squareCoords[] = { -0.5f,  0.5f ,   // top left
        -0.5f, -0.5f ,   // bottom left
         0.5f, -0.5f ,   // bottom right
         0.5f,  0.5f }; // top right
}</span>

和上一节一样,我们需要将float[ ]的数据转换为 floatbuffer ,此时代码如下 (Square.java):

<span style="font-size:14px;">package com.cumt.shape;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import android.content.Context;

public class Square {
	
	private Context context;

	//float类型的字节数
	private static final int BYTES_PER_FLOAT = 4;
	// 数组中每个顶点的坐标数
    static final int COORDS_PER_VERTEX = 2;
	//矩形顶点坐标
	static float squareCoords[] = { -0.5f,  0.5f ,   // top left
        -0.5f, -0.5f ,   // bottom left
         0.5f, -0.5f ,   // bottom right
         0.5f,  0.5f }; // top right
	
	private FloatBuffer vertexBuffer;
	
	public Square(Context context) {
		this.context = context;
		vertexBuffer = ByteBuffer
    			.allocateDirect(squareCoords.length * BYTES_PER_FLOAT)
    			.order(ByteOrder.nativeOrder())
    			.asFloatBuffer();
    	// 把坐标们加入FloatBuffer中
        vertexBuffer.put(squareCoords);
        // 设置buffer,从第一个坐标开始读
        vertexBuffer.position(0);
	}
}</span>

接下来就是着色器的编写,读取与编译,链接,获取program ID的操作,我们仍然使用上一节的着色器就好,其他的过程也与上一节相同,这里就不再说明了,
copy一下拿来用吧~~,当然你想进一步封装一下着色器的操作更好。现在的代码(Square.java):

<span style="font-size:14px;">package com.cumt.shape;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import com.cumt.openglestwo_test_one.R;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import android.content.Context;
import android.opengl.GLES20;

public class Square {
	
	private Context context;

	//float类型的字节数
	private static final int BYTES_PER_FLOAT = 4;
	// 数组中每个顶点的坐标数
    static final int COORDS_PER_VERTEX = 2;
	//矩形顶点坐标
	static float squareCoords[] = { -0.5f,  0.5f ,   // top left
        -0.5f, -0.5f ,   // bottom left
         0.5f, -0.5f ,   // bottom right
         0.5f,  0.5f }; // top right
	
	private FloatBuffer vertexBuffer;
	
	//------------第一步 : 定义两个标签,分别于着色器代码中的变量名相同, 
    //------------第一个是顶点着色器的变量名,第二个是片段着色器的变量名
	private static final String A_POSITION = "a_Position";
	private static final String U_COLOR = "u_Color";
	
	//------------第二步: 定义两个ID,我们就是通ID来实现数据的传递的,这个与前面
	//------------获得program的ID的含义类似的
	private int uColorLocation;
	private int aPositionLocation;
	
	private int program;//保存program的id
	
	public Square(Context context) {
		this.context = context;
		vertexBuffer = ByteBuffer
    			.allocateDirect(squareCoords.length * BYTES_PER_FLOAT)
    			.order(ByteOrder.nativeOrder())
    			.asFloatBuffer();
    	// 把坐标们加入FloatBuffer中
        vertexBuffer.put(squareCoords);
        // 设置buffer,从第一个坐标开始读
        vertexBuffer.position(0);
        
        getProgram();
        
      //----------第三步: 获取这两个ID ,是通过前面定义的标签获得的
        uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
		aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
		
		//---------第五步: 传入数据
		GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
				GLES20.GL_FLOAT, false, 0, vertexBuffer);
		GLES20.glEnableVertexAttribArray(aPositionLocation);
	}
	
	//获取program
    private void getProgram(){
    	//获取顶点着色器文本
    	String vertexShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_vertex_shader);
    	//获取片段着色器文本
		String fragmentShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_fragment_shader);
		//获取program的id
		program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
		GLES20.glUseProgram(program);
    }
}</span>

接下来就是绘制了,这是我们这一节的重点,我们应该如何绘制一个矩形呢? 我们知道在OpenglES中支持的绘制方式有3 类 :点 ,线 , 三角形 ,每一类又有一种或多种绘制方式。 那我们来绘制一个矩形 ,其绘制方式是不是也有多种呢 ?答案是肯定的 。我们先用线段的方式来绘制这个矩形 。

线段的几种绘制方式:

GL_LINES : 将传入的顶点按照顺序,两两组织成线段进行绘制,若顶点个数为奇数,则会自动忽略掉最后一个顶点。

GL_LINE_STRIP:将传入的顶点按照顺序依次连接进行绘制

GL_LINE_LOOP:将传入的顶点按照顺序依次连接进行绘制,但是最后一个顶点会与第一个连接,形成线段环



我们就按照 GL_LINE_LOOP 的方式来绘制这个矩形,添加draw方式,此时代码如下 (Square.java):

<span style="font-size:14px;">package com.cumt.shape;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import com.cumt.openglestwo_test_one.R;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import android.content.Context;
import android.opengl.GLES20;

public class Square {
	
	private Context context;

	//float类型的字节数
	private static final int BYTES_PER_FLOAT = 4;
	// 数组中每个顶点的坐标数
    static final int COORDS_PER_VERTEX = 2;
	//矩形顶点坐标
	static float squareCoords[] = { -0.5f,  0.5f ,   // top left
        -0.5f, -0.5f ,   // bottom left
         0.5f, -0.5f ,   // bottom right
         0.5f,  0.5f }; // top right
	
	private FloatBuffer vertexBuffer;
	
	//------------第一步 : 定义两个标签,分别于着色器代码中的变量名相同, 
    //------------第一个是顶点着色器的变量名,第二个是片段着色器的变量名
	private static final String A_POSITION = "a_Position";
	private static final String U_COLOR = "u_Color";
	
	//------------第二步: 定义两个ID,我们就是通ID来实现数据的传递的,这个与前面
	//------------获得program的ID的含义类似的
	private int uColorLocation;
	private int aPositionLocation;
	
	private int program;//保存program的id
	
	//---------第四步:定义坐标元素的个数,这里有三个顶点
	private static final int POSITION_COMPONENT_COUNT = 4;
		
	
	public Square(Context context) {
		this.context = context;
		vertexBuffer = ByteBuffer
    			.allocateDirect(squareCoords.length * BYTES_PER_FLOAT)
    			.order(ByteOrder.nativeOrder())
    			.asFloatBuffer();
    	// 把坐标们加入FloatBuffer中
        vertexBuffer.put(squareCoords);
        // 设置buffer,从第一个坐标开始读
        vertexBuffer.position(0);
        
        getProgram();
        
      //----------第三步: 获取这两个ID ,是通过前面定义的标签获得的
        uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
		aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
		
		//---------第五步: 传入数据
		GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
				GLES20.GL_FLOAT, false, 0, vertexBuffer);
		GLES20.glEnableVertexAttribArray(aPositionLocation);
	}
	
	//获取program
    private void getProgram(){
    	//获取顶点着色器文本
    	String vertexShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_vertex_shader);
    	//获取片段着色器文本
		String fragmentShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_fragment_shader);
		//获取program的id
		program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
		GLES20.glUseProgram(program);
    }
    
    //以GL_LINE_LOOP方式绘制
    public void draw(){
		GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);		
		GLES20.glDrawArrays(GLES20.GL_LINE_LOOP, 0, POSITION_COMPONENT_COUNT);
    }
}</span>

最后在MyRender中创建对象,调用draw来绘制 ,代码如下 (MyRender.java):

<span style="font-size:14px;">package com.cumt.render;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import com.cumt.shape.Square;
import com.cumt.shape.Triangle;

import android.content.Context;
import android.opengl.GLSurfaceView.Renderer;
import android.util.Log;
import static android.opengl.GLES20.glClear;
import static android.opengl.GLES20.glClearColor;
import static android.opengl.GLES20.glViewport;
import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;

public class MyRender implements Renderer {
	
	private Context context;
	
	public MyRender(Context context){
		this.context = context;
	}
	
	//定义三角形对象
	Triangle triangle;
	Square square;
	
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		Log.w("MyRender","onSurfaceCreated");
		// TODO Auto-generated method stub
		//First:设置清空屏幕用的颜色,前三个参数对应红绿蓝,最后一个对应alpha
		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
//		triangle = new Triangle(context);
		square = new Square(context);
	}

	public void onSurfaceChanged(GL10 gl, int width, int height) {
		Log.w("MyRender","onSurfaceChanged");
		// TODO Auto-generated method stub
		//Second:设置视口尺寸,即告诉opengl可以用来渲染的surface大小
		glViewport(0,0,width,height);
	}

	public void onDrawFrame(GL10 gl) {
		Log.w("MyRender","onDrawFrame");
		// TODO Auto-generated method stub
		//Third:清空屏幕,擦除屏幕上所有的颜色,并用之前glClearColor定义的颜色填充整个屏幕
		glClear(GL_COLOR_BUFFER_BIT);
		//绘制三角形
//		triangle.draw();
		square.draw();
	}
}</span>

运行结果:



好吧,貌似看不太清楚,我们把背景颜色改为白色,把 MyRender.java 中 onSurfaceCreated 方法的glClearColor(0.0f, 0.0f, 0.0f, 0.0f)  改为  glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

再运行一下:


看到我们实际上画出了一个矩形框,中间是没有着色的。下面我们来使用三角形的方式来绘制。

三角形的几种绘制方式:

GL_TRIANGGLES :将传入的顶点按照没3个一组组成一个三角形进行绘制 

GL_TRIANGLE_TRIP:将传入的顶点按照顺序三个一组组成三角形进行,前面三个顶点的后两个顶点做为下一个三角形的前两个顶点,
    比如 有v0 v1 v2 v3 四个顶点顺序排列,则v0 v1 v2组成一个三角形,v1,v2,v3组成一个三角形。

GL_TRIANGLE_FAN:三角形扇的形式,将传入的顶点数据的第一个顶点做为中心点,其他点做为边缘点绘制一系列组成扇形的相邻三角形。






我们先使用第一种方式来画这个矩形,此时我们需要画两个三角形,所以需要6个顶点数据,我们copy一下Square.java,重命名为Square2.java,
首先 修改顶点数据 ,然后修改绘制方式 ,代码及步骤(见代码中 /* */注释的内容 ) 如下 (Square2.java):

<span style="font-size:14px;">package com.cumt.shape;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import com.cumt.openglestwo_test_one.R;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;

import android.content.Context;
import android.opengl.GLES20;

public class Square2 {
	
	private Context context;

	//float类型的字节数
	private static final int BYTES_PER_FLOAT = 4;
	// 数组中每个顶点的坐标数
    static final int COORDS_PER_VERTEX = 2;
    
    /*------------------第一步: 修改顶点数据-------------------------*/
	//矩形顶点坐标
	static float squareCoords[] = { -0.5f,  0.5f ,   // top left
		 0.5f,  0.5f ,   // top right
		-0.5f, -0.5f ,   // bottom left
		-0.5f, -0.5f ,   // bottom left
         0.5f, -0.5f ,   // bottom right
         0.5f,  0.5f }; // top right
	
	private FloatBuffer vertexBuffer;
	
    //------------第一个是顶点着色器的变量名,第二个是片段着色器的变量名
	private static final String A_POSITION = "a_Position";
	private static final String U_COLOR = "u_Color";
	
	//------------获得program的ID的含义类似的
	private int uColorLocation;
	private int aPositionLocation;
	
	private int program;//保存program的id
	
	/*------------------第二步: 修改顶点个数-------------------------*/
	private static final int POSITION_COMPONENT_COUNT = 6;
		
	
	public Square2(Context context) {
		this.context = context;
		vertexBuffer = ByteBuffer
    			.allocateDirect(squareCoords.length * BYTES_PER_FLOAT)
    			.order(ByteOrder.nativeOrder())
    			.asFloatBuffer();
    	// 把坐标们加入FloatBuffer中
        vertexBuffer.put(squareCoords);
        // 设置buffer,从第一个坐标开始读
        vertexBuffer.position(0);
        
        getProgram();
        
        uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
		aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
		
		GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
				GLES20.GL_FLOAT, false, 0, vertexBuffer);
		GLES20.glEnableVertexAttribArray(aPositionLocation);
	}
	
	//获取program
    private void getProgram(){
    	//获取顶点着色器文本
    	String vertexShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_vertex_shader);
    	//获取片段着色器文本
		String fragmentShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_fragment_shader);
		//获取program的id
		program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
		GLES20.glUseProgram(program);
    }
    
    //以GL_LINE_LOOP方式绘制
    public void draw(){
		GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);		
		
		/*------------------第三步: 修改绘制方式-------------------------*/
		GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, POSITION_COMPONENT_COUNT);
    }
}</span>

然后在MyRender类中就可以new 该对象并调用其draw方法绘制了 ,运行效果:



虽然这种方式满足了我们的需求,但是造成了数据的冗余,我们可以使用后两种绘制方式来解决这个问题。这里给出后两者方式的数据和draw方法:


GL_TRIANGLE_STRIP方式 :
<span style="font-size:14px;">//GL_TRIANGLE_STRIP
    static float squareCoords[] = { -0.5f,  0.5f ,   // top left
    	 0.5f,  0.5f  , // top right
        -0.5f, -0.5f  ,   // bottom left
         0.5f, -0.5f  }; // bottom right
    private static final int POSITION_COMPONENT_COUNT = 4;
    
    public void draw(){
		GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);		
		
		GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, POSITION_COMPONENT_COUNT);
    }</span>

GL_TRIANGLE_FAN方式:

<span style="font-size:14px;"> //GL_TRIANGLE_FAN 要注意点的顺序问题 (试试将 bottom right和bottom left交换位置看看绘制的是否还是矩形)
    static float squareCoords[] = { -0.5f,  0.5f ,   // top left
    	 0.5f,  0.5f  , // top right
    	 0.5f, -0.5f  , // bottom right
        -0.5f, -0.5f  };  // bottom left
    private static final int POSITION_COMPONENT_COUNT = 4;
    
    public void draw(){
		GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);		
		GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0 , POSITION_COMPONENT_COUNT);
    }</span>

Android OpenGLES滤镜开发之大眼效果 前言 在很多美颜相机啊,抖音啊,都会有一些放大眼睛的效果,今天就来实现如何放大眼睛。 思路 1、首先使用OpenCV定位到人脸 2、根据定位到的人脸去检测人脸关键点,进而获取到人眼睛的位置。 3、根据眼睛位置,对眼睛进行放大。 实现 定位人脸 人脸的定位追踪,在之前文章中已经写过OpenCv实现人脸追踪 当时是在xCode上写的,把里面的代码移植到Android中就可以了,这个是C写的,所以需要移... 阅读详情

相关推荐

android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

OpenGL ES2之Android&iOS跨平台开发教程(四)绘制矩形并显示纹理

前一篇介绍了三角形的绘制,这一篇我们来绘制矩形,并加载本地图片转换为纹理显示到矩形上。

屠龍之技的专栏 1580

Android OpenGL ES分小块贴图并画点画线(10x10矩形)

Android贴图、在此基础上画点,画线。贴图分为10x10矩形

[Android] OpenGL ES 绘制矩形以及加载 Bitmap 图片

绘制矩形 OpenGL ES 所有的多边形图形都是由多个三角形拼成的,所以我们在上一篇文章的基础上进行矩形的绘制。矩形即为两个直角三角形构成的,我们可以通过定义四个顶点然后按一定顺序去进行两个三角形的绘制。最简单的方法就是跟绘制三角形一样定义好顶点我们通过 glVertexAttribPointer(int indx, int size, int type, boolean normalized...

3366

ethercat linux lan9252 - lan9253调试

linux 的ethercat测试

linsheng_111的专栏 1932

ArcGIS天地图矢量化秘籍:用重分类+ArcScan高效提取建筑轮廓线

本文详细介绍了利用ArcGIS重分类和ArcScan技术高效提取天地图建筑轮廓线的半自动化流程。通过动态中断值计算、多级重分类策略和ArcScan高级矢量化技巧,显著提升城市规划中的矢量化效率与精度,适用于中级GIS用户。

weixin_30879169的博客 475

绘制矩形_OpenGL ES for Android 绘制矩形和正方形

前面的文章介绍了如何 绘制三角形 ,在OpenGL ES中没有直接绘制矩形的方式,通过绘制2个三角形的方式绘制矩形。绘制矩形的顶点shader:attribute vec4 vPosition; void main() { gl_Position = vPosition; }绘制矩形的片段shader:precision mediump float; void main() { gl...

weixin_29100399的博客 288

开源滑翔伞升降速度表:基于STM32与传感器融合的DIY飞行仪表

传感器融合是现代嵌入式系统与物联网设备中的核心技术,它通过整合多个传感器的数据,利用滤波与估计算法,获得比单一传感器更精确、更可靠的环境感知能力。其技术价值在于提升系统的鲁棒性、精度和上下文理解能力,广泛应用于无人机导航、可穿戴设备、工业监测及智能驾驶等领域。本文聚焦于一个具体的工程实践案例——开源多功能滑翔伞升降速度表(Open-Vario),该项目巧妙地运用了**卡尔曼滤波器**进行气压与GNSS数据的融合,以精确计算升降率,并基于**FreeRTOS**实时操作系统构建了一个稳定、可扩展的嵌入式平台,

weixin_33657398的博客 176

OpenGL ES之六——绘制矩形和圆形

概述 上文中主要介绍了相机和投影,并利用二者做出了变换矩阵,画出了等腰三角形。本文将介绍如何绘制矩形和圆形。 重点:顶点法和索引法;OpenGL ES中多边形的构成 一 顶点法和索引法以及OpenGL Es中多边形的构成 1.1 顶点法和索引法 之前文中绘制点,线,三角形都是使用的GLES30.glDrawArrays ,它就是顶点法。是根据传入的顶点顺序进行绘制的。另外还有另外一种方法GLES3...

gongxiaoou的博客 7207

jetson orin nano 使用cuPCL

jetson开发板上使用pcl时,正常使用的是cpu,拖慢了整体的效率。cuPCL有一些库用于使用CUDA处理点云。

weixin_42256401的博客 1020

Windows下用Docker部署RagFlow的5个常见错误及解决方法(附详细日志分析)

本文针对Windows系统下使用Docker部署RagFlow的常见难题,提供了详细的避坑指南。文章深度剖析了WSL2配置、端口冲突、文件权限、资源限制及网络通信这五个典型错误场景,并结合具体日志分析,给出了经过验证的解决方案,帮助开发者高效完成部署。

weixin_29233857的博客 178

OpenglES2.0 Android:画矩形

OpenglES2.0 for Android:来画个矩形吧 原文链接:https://blog.csdn.net/cassiePython/article/details/51553842 OK,开始动手做吧,首先在上一节的项目中的shape目录下新建一个类——Square (Square.java),然后定义矩形的四个顶点的坐标,此时代码如下(Square.java): pack...

jacke121的专栏 2895

[A-21]ARMv8/v9-SMMU系统架构和功能概述

本文简述了SMMU的系统架构和核心功能

基层架构师的分享 1723

OpenglES2.0 for Android:来做个地球吧

OpenglES2.0 for Android:来做个地球吧 上两节中我们说了纹理映射,也利用纹理给我们的平面图形以及立方体穿上了漂亮的衣服,在继续学习其他知识之前,让我们先来用纹理映射以及我们前面做的球 来实现一个地球的贴图。整体效果如下 图所示: 贴图所需要的图片素材如下 : 素材  " 窃取 ” 了csdn另一位网友的

cassiePython的专栏 3732

Istio ICA考试之路---3-2

部署2个测试容器,分别是test和test2.test注入标签subset=v1。这里文档中省略了metadata的3行,可以从前面任意一个yaml复制粘贴过来。通过test2测试容器访问,50%概率触发500故障注入。通过test测试容器访问,20%概率触发延迟注入。发起20次请求,一共10次被500。

Q先生 725

深入理解鸿蒙输入子系统驱动:HDI接口、HAL层与内核驱动的协同机制

/ 扫描输入设备// 打开指定输入设备// 关闭指定输入设备// 获取指定设备信息// 获取所有设备列表鸿蒙输入子系统驱动采用分层架构设计,通过HDI接口层实现硬件抽象,HAL层提供统一的事件处理机制,用户空间驱动层负责设备管理和事件分发。整个系统支持多种输入设备类型,包括触摸屏、按键、鼠标、键盘等,并提供了完整的HID设备支持。分层架构:清晰的层次划分,便于维护和扩展事件驱动:基于epoll的高效事件处理机制设备管理:完善的设备生命周期管理HID支持。

m0_67505153的博客 212

OpenglES2.0 for Android:来画个球吧

OpenglES2.0 for Android:来画个球吧 首先看下球的坐标系 ,如图 :                             (图来自百度百科 ) 设球上有一点 A ,球心为O ,OA在 xOy上的投影与X轴夹角为 φ ,    OA在与Z的夹角为 θ ,球的半径为r,则有 ;      r * sin θ = y / sin φ

cassiePython的专栏 5999

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Opengles2.0 for android入门笔记(一)

oepngles2.0 for android的教程少的可怜,有的居然还是opengles 1.0版本的。鄙人刚学opengles,理论也是一知半解,其实android已经帮我们封装了一些内容了,so我直接从最基础的用法开始记录了。 1.oepngles2.0绘图基本流程 图形是绘制在GlSurfaceView中的,也就是画布。而具体绘制什么是由GLSurfaceView.Renderer的实现

lishaobo211985的博客 896

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OpenglES2.0 for Android:来画个圆吧

OpenglES2.0 for Android:来画个圆吧 首先看看本节的流程: 计算圆的顶点坐标: 我们先要明白OpenglES中圆是怎么画的,前面我们已经知道三角形扇的绘制方式,我们的圆其实也可以看成以圆心为中心点的三角形扇,如下图所示: 看到圆的内部是一个正多边形,当我们的正多边形的边数(或三角形的个数)足够多的话,我们肉眼看起来就变成

cassiePython的专栏 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OpenGL ES for Android 绘制矩形和正方形

前面的文章介绍了如何绘制三角形,在OpenGL ES中没有直接绘制矩形的方式,通过绘制2个三角形的方式绘制矩形。 绘制矩形的顶点shader: attribute vec4 vPosition; void main() { gl_Position = vPosition; } 绘制矩形的片段shader: precision mediump float; void main() { ...

老孟Flutter 2444

OpenglES2.0 for Android:纹理映射

OpenglES2.0 for Android:纹理映射 前言  纹理映射又叫做纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。就是把一幅图像贴到三维物体的表面上来增强真实感, 可以和光照计算、图像混合等技术结合起来形成许多非常漂亮的效果 (百度百科)。简单来说,纹理就是一个图形或者照片,我们可以将它们 加载到Opengl中用以美化我们绘制的物体。 前期准

cassiePython的专栏 5756

Android OpenGLES2.0(八)——纹理贴图之显示图片

前面几篇博客,我们将了Android中利用OpenGL ES 2.0绘制各种形体,并在上一篇博客中专门讲了GLSL语言。但是我们看到的基于OpenGL开发的应用和游戏,可不仅仅是那些规则形体和一些简单的色彩构成,而是各种不规则的形体构成了现实世界或者卡通世界的人和事物,他们都是外面穿着漂亮“衣服”的。本篇博客就是来讲解这些“衣服”的基础的。这些衣服就是纹理贴图。什么是纹理贴图 一般说来,纹理是表

偶尔记录的一些学习笔记 3万+

OpenGLES画一张图片

//.glsl文件 //pic_vertex.glsl attribute vec4 vPosition; attribute vec2 vCoord; varying vec2 aCoord; void main(){ gl_Position = vPosition; aCoord = vCoord; } //.glsl文件 //pic_fragment.glsl precis...

alaleidd的博客 609

Android OpenGLES2.0(六)——构建圆锥、圆柱和球体

之前的博客中,我们绘制了三角形、正方形、圆形、立方体,今天我们将绘制圆锥、圆柱和球体。能够绘制这些基本的常规几何形体后,其他的常见几何形体的绘制对于我们来说就基本没问题了。绘制圆锥由之前的博客,我们大家也应该都知道了,OpenGL ES2.0中物体的绘制重点就是在于把这个物体表面分解成三角形,分解成功后,绘制自然就不成问题了。圆锥我们很容易就能想到把它拆解成一个圆形和一个锥面,锥面的顶点与圆形的顶点

偶尔记录的一些学习笔记 1万+

OpenGLES2.0笔记

capacity:容量 allocate:分配 Coord:坐标 vertex:顶点 Square:平面 Program:程序 Compile:编译 font:字体 pname:工程名称 Validate:验证ByteBuffer和FloatBuffer是java.nio包下的类 ByteBuffer bb=ByteBuffer.allocate(capacity);//参数是一

laochidao的博客 1355
上一篇: OpenglES2.0 for Android:来画个三角形吧
下一篇: OpenglES2.0 for Android:来画个圆吧
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值