OpenglES2.0 for Android:来画个圆吧

OpenGL ES2.0 绘制圆形 Opengles 绘制的方式 int GL_POINTS //将传入的顶点坐标作为单独的点绘制 int GL_LINES //将传入的坐标作为单独线条绘制,ABCDEFG六个顶点,绘制AB、CD、EF三条线 int GL_LINE_STRIP //将传入的顶点作为折线绘制,ABCD四个顶点,绘制AB、BC、CD三条线 int GL_LINE_LOOP //将传入的顶点作为闭合折线绘制,ABCD四个顶点,绘制AB、BC、CD、DA四条线。 int GL_TRIANGLES //将传入的顶点作为单独的三角. 阅读详情

OpenglES2.0 for Android:来画个圆吧

首先看看本节的流程:




计算圆的顶点坐标:


我们先要明白OpenglES中圆是怎么画的,前面我们已经知道三角形扇的绘制方式,我们的圆其实也可以看成以圆心为中心点的三角形扇,如下图所示:


看到圆的内部是一个正多边形,当我们的正多边形的边数(或三角形的个数)足够多的话,我们肉眼看起来就变成了一个圆。

圆心坐标是很容易确定的,这里我们假设圆心坐标为(x , y ),然后设圆的半径为 r  接下来我们需要计算的就是周边的点的坐标,
我们很容易计算出来A点的坐标 : 
A点的横坐标为: x + r * cos θ  
A点的纵坐标为: y + r * sin θ
我们将圆分成 n 份的话,就可以得到 每一份的角度的值 ,即 θ 的值。通过一个for循环我们就可以很容易的得到所有点的坐标。
我们在工程的shape文件夹下新建一个类 Circle , 完成坐标的计算 ,当前代码如下 (Circle.java ):

package com.cumt.shape;

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

public class Circle {

	private Context context;
	private FloatBuffer vertexData;
	// 定义圆心坐标
	private float x;
	private float y;
	// 半径
	private float r;
	// 三角形分割的数量
	private int count = 10;
	// 每个顶点包含的数据个数 ( x 和 y )
	private static final int POSITION_COMPONENT_COUNT = 2;
	private static final int BYTES_PER_FLOAT = 4;

	public Circle(Context context) {
		this.context = context;
		x = 0f;
		y = 0f;
		r = 0.6f;
		initVertexData();
	}

	private void initVertexData() {
		// 顶点的个数,我们分割count个三角形,有count+1个点,再加上圆心共有count+2个点
		final int nodeCount = count + 2;
		float circleCoords[] = new float[nodeCount * POSITION_COMPONENT_COUNT];
		// x y
		int offset = 0;
		circleCoords[offset++] = x;// 中心点
		circleCoords[offset++] = y;
		for (int i = 0; i < count + 1; i++) {
			float angleInRadians = ((float) i / (float) count)
					* ((float) Math.PI * 2f);
			circleCoords[offset++] = x + r * (float)Math.sin(angleInRadians);
			circleCoords[offset++] = y + r * (float)Math.cos(angleInRadians);
		}
		// 为存放形状的坐标,初始化顶点字节缓冲
		ByteBuffer bb = ByteBuffer.allocateDirect(
		// (坐标数 * 4)float占四字节
				circleCoords.length * BYTES_PER_FLOAT);
		// 设用设备的本点字节序
		bb.order(ByteOrder.nativeOrder());
		// 从ByteBuffer创建一个浮点缓冲
		vertexData = bb.asFloatBuffer();
		// 把坐标们加入FloatBuffer中
		vertexData.put(circleCoords);
		// 设置buffer,从第一个坐标开始读
		vertexData.position(0);
	}
}

圆的绘制:


有了圆的顶点坐标我们就可以来绘制圆了,这里我们依然适用前面的着色器,着色器代码的读取,编译,连接都和前面两节绘制三角形,矩形的道理一样,直接看代码
(Circle.java):
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.LoggerConfig;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;

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

public class Circle {

	private Context context;
	private FloatBuffer vertexData;
	// 定义圆心坐标
	private float x;
	private float y;
	// 半径
	private float r;
	// 三角形分割的数量
	private int count = 40;
	// 每个顶点包含的数据个数 ( x 和 y )
	private static final int POSITION_COMPONENT_COUNT = 2;
	private static final int BYTES_PER_FLOAT = 4;

	private static final String U_COLOR = "u_Color";
	private static final String A_POSITION = "a_Position";
	private int program;
	private int uColorLocation;
	private int aPositionLocation;
	
	public Circle(Context context) {
		this.context = context;
		x = 0f;
		y = 0f;
		r = 0.6f;
		initVertexData();
	}

	private void initVertexData() {
		// 顶点的个数,我们分割count个三角形,有count+1个点,再加上圆心共有count+2个点
		final int nodeCount = count + 2;
		float circleCoords[] = new float[nodeCount * POSITION_COMPONENT_COUNT];
		// x y
		int offset = 0;
		circleCoords[offset++] = x;// 中心点
		circleCoords[offset++] = y;
		for (int i = 0; i < count + 1; i++) {
			float angleInRadians = ((float) i / (float) count)
					* ((float) Math.PI * 2f);
			circleCoords[offset++] = x + r * (float)Math.sin(angleInRadians);
			circleCoords[offset++] = y + r * (float)Math.cos(angleInRadians);
		}
		// 为存放形状的坐标,初始化顶点字节缓冲
		ByteBuffer bb = ByteBuffer.allocateDirect(
		// (坐标数 * 4)float占四字节
				circleCoords.length * BYTES_PER_FLOAT);
		// 设用设备的本点字节序
		bb.order(ByteOrder.nativeOrder());
		// 从ByteBuffer创建一个浮点缓冲
		vertexData = bb.asFloatBuffer();
		// 把坐标们加入FloatBuffer中
		vertexData.put(circleCoords);
		// 设置buffer,从第一个坐标开始读
		vertexData.position(0);
		
		getProgram();
		
		uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
		aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
		
		GLES20.glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT,
				GLES20.GL_FLOAT, false, 0, vertexData);

		GLES20.glEnableVertexAttribArray(aPositionLocation);
	}
	
	private void getProgram(){
		String vertexShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_vertex_shader);
		String fragmentShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_fragment_shader);

		int vertexShader = ShaderHelper.compileVertexShader(vertexShaderSource);
		int fragmentShader = ShaderHelper
				.compileFragmentShader(fragmentShaderSource);

		program = ShaderHelper.linkProgram(vertexShader, fragmentShader);

		if (LoggerConfig.ON) {
			ShaderHelper.validateProgram(program);
		}

		GLES20.glUseProgram(program);
	}
	
	public void draw(){
		GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);		
		GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, count +2);
	}
}

接下来我们在MyRender类中new 一个Circle对象,调用其draw方法进行绘制,结果如下:



对的,你没有看错,它看起来一点都不圆,明明是个椭圆~~  还记得上一节绘制的矩形吗,那个矩形根据我们定义的坐标应该是个正方形,但我们的图示显示并不是正方形,
而是个长方形,这是什么原因呢?

宽高比的问题

在Opengl中我们要渲染的一切物体都是要映射到X轴和Y轴上【-1 ,1】的范围内(对Z轴也是一样,我们目前为止还未讨论三维,所以不用管Z轴),这个范围内的坐标称为
归一化设备坐标,这个归一化坐标独立于屏幕的尺寸或者形状。如此就导致一个问题,我们假定在归一化坐标下有一个铺满的圆,在手机上就会有下图中的问题:



【-1,1】对应的屏幕的像素高与像素宽并不同,图像在x轴就会显得扁平了(竖屏时),在横屏时图像在y轴就会显得扁平。

正交投影


我们可以使用正交投影来解决这个问题,把虚拟坐标变换回归一化设备坐标。我们使用一个正交投影矩阵,使用该矩阵与我们的顶点矩阵相乘,得到新的顶点坐标值,
利用这个值来绘制就不会有上述的问题了。关于正交投影的知识网上很多,这里不再叙述。
在Android的android.opengl包的Matrix类中有一个 orthoM ( )方法,使用这个函数可以方便的生成一个投影矩阵,



这里说一下各参数的含义:

float[ ] m :目标数组,长度至少为16个元素,这样才足以存储正交矩阵 ;
int mOffset :结果矩阵起始的偏移值
float left :x轴的最小范围
float right :x轴的最大范围
float bottom :y轴的最小范围
float top :y轴的最大范围
float near :z轴的最小范围
float far :z轴的最大范围 


绘制真正的圆


现在我们开始着手绘制真正的圆,首先我们修改顶点着色器的代码,引入这个投影矩阵,我们新建一个顶点着色器 (vertex_shader.glsl ):

uniform mat4 u_Matrix;
attribute vec4 a_Position;  
 
void main()                    
{                              
    gl_Position = u_Matrix * a_Position;
} 

u_Matrix即我们的4X4的投影矩阵,下面我们来修改Circle.java的代码 ,共分为四步,见下面代码中的 步骤 (Circle.java 中的第一步 ~~第四步) :

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.LoggerConfig;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.Matrix;

public class Circle {

	private Context context;
	private FloatBuffer vertexData;
	// 定义圆心坐标
	private float x;
	private float y;
	// 半径
	private float r;
	// 三角形分割的数量
	private int count = 10;
	// 每个顶点包含的数据个数 ( x 和 y )
	private static final int POSITION_COMPONENT_COUNT = 2;
	private static final int BYTES_PER_FLOAT = 4;

	private static final String U_COLOR = "u_Color";
	private static final String A_POSITION = "a_Position";
	private int program;
	private int uColorLocation;
	private int aPositionLocation;
	
	/*
	 * 第一步: 定义投影矩阵相关
	 */
	private static final String U_MATRIX = "u_Matrix";
	private final float[] projectionMatrix = new float[16];
	private int uMatrixLocation;
	
	public Circle(Context context) {
		this.context = context;
		x = 0f;
		y = 0f;
		r = 0.6f;
		initVertexData();
	}

	private void initVertexData() {
		// 顶点的个数,我们分割count个三角形,有count+1个点,再加上圆心共有count+2个点
		final int nodeCount = count + 2;
		float circleCoords[] = new float[nodeCount * POSITION_COMPONENT_COUNT];
		// x y
		int offset = 0;
		circleCoords[offset++] = x;// 中心点
		circleCoords[offset++] = y;
		for (int i = 0; i < count + 1; i++) {
			float angleInRadians = ((float) i / (float) count)
					* ((float) Math.PI * 2f);
			circleCoords[offset++] = x + r * (float)Math.sin(angleInRadians);
			circleCoords[offset++] = y + r * (float)Math.cos(angleInRadians);
		}
		// 为存放形状的坐标,初始化顶点字节缓冲
		ByteBuffer bb = ByteBuffer.allocateDirect(
		// (坐标数 * 4)float占四字节
				circleCoords.length * BYTES_PER_FLOAT);
		// 设用设备的本点字节序
		bb.order(ByteOrder.nativeOrder());
		// 从ByteBuffer创建一个浮点缓冲
		vertexData = bb.asFloatBuffer();
		// 把坐标们加入FloatBuffer中
		vertexData.put(circleCoords);
		// 设置buffer,从第一个坐标开始读
		vertexData.position(0);
		
		getProgram();
		
		uColorLocation = GLES20.glGetUniformLocation(program, U_COLOR);
		aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
		
		/*  
		 * 第二步: 获取顶点着色器中投影矩阵的location 
		 */
		uMatrixLocation = GLES20.glGetUniformLocation(program, U_MATRIX);
		
		GLES20.glVertexAttribPointer(aPositionLocation, POSITION_COMPONENT_COUNT,
				GLES20.GL_FLOAT, false, 0, vertexData);

		GLES20.glEnableVertexAttribArray(aPositionLocation);
	}
	
	private void getProgram(){
		String vertexShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.vertex_shader);
		String fragmentShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.simple_fragment_shader);

		int vertexShader = ShaderHelper.compileVertexShader(vertexShaderSource);
		int fragmentShader = ShaderHelper
				.compileFragmentShader(fragmentShaderSource);

		program = ShaderHelper.linkProgram(vertexShader, fragmentShader);

		if (LoggerConfig.ON) {
			ShaderHelper.validateProgram(program);
		}

		GLES20.glUseProgram(program);
	}
	/**
	 * 第三步 : 根据屏幕的width 和 height 创建投影矩阵
	 * @param width
	 * @param height
	 */
	 public void projectionMatrix(int width,int height){
		 final float aspectRatio = width > height ?
				 (float) width / (float) height :
			     (float) height / (float) width;
		 if(width > height){
			 Matrix.orthoM(projectionMatrix, 0, -aspectRatio, aspectRatio, -1f, 1f, -1f, 1f);
		 }else{
			 Matrix.orthoM(projectionMatrix, 0, -1f, 1f, -aspectRatio, aspectRatio, -1f, 1f);
		 }
	 }
	
	public void draw(){
		GLES20.glUniform4f(uColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);		
		/*
		 * 第四步:传入投影矩阵
		 */
		GLES20.glUniformMatrix4fv(uMatrixLocation, 1, false, projectionMatrix,0);
		GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, count +2);
	}
}

注意此时传入的顶点着色器是vertex_shader.glsl  而不是我们原来的simple_vertex_shader.glsl  。然后在MyRender中使用 :

此时MyRender的代码如下 :

package com.cumt.render;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import com.cumt.shape.Circle;
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;
	}
	
	Circle circle;
	
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		Log.w("MyRender","onSurfaceCreated");
		glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
		circle = new Circle(context);
	}

	public void onSurfaceChanged(GL10 gl, int width, int height) {
		Log.w("MyRender","onSurfaceChanged");
		glViewport(0,0,width,height);
		//设置投影矩阵
		circle.projectionMatrix(width, height);
	}

	public void onDrawFrame(GL10 gl) {
		Log.w("MyRender","onDrawFrame");
		glClear(GL_COLOR_BUFFER_BIT);
		circle.draw();
	}
}


看到我们绘制出了一个正多边形,看下我们的Circle类 ,其中有个参数 
private int count = 10;// 三角形分割的数量

我们只分割了10个 ,大家可以数一下,上面的正多边形正好是一个正10多边形,下面我们把这个值改为40,再运行一下:




哈 ,我们的圆终于画出来了~~ ,相信大家连画椭圆都会了。

Android OpenGLES2.0开发(十):FBO离屏渲染 FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO)。FBO可以让我们的渲染不渲染到屏幕上,而是渲染到离屏Buffer中。可以理解为将OpenGL ES绘制的图像内容输出到一块内存中,而我们可以对这块内存进行多次绘制。当然这块内存中的数据也可保存到本地SD卡中,也可重新绘制到屏幕上用于显示。FBO是一个容器,自身不能用于渲染,需要与一些可渲染的缓冲区绑定在一起,像纹理或者渲染缓冲区。 阅读详情

相关推荐

OpenGL ES 2.0 for Android教程(一)

本文是一系列OpenGL ES 2.0 for Android教程,基于Kotlin与一点点Compose来创建代码示例。通过本系列教程你可以从零开始一步步学习OpenGL ES。

重来的博客 7477

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

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

gongxiaoou的博客 7207

Android OpenGLES2.0开发(六):着色器语言GLSL

该篇文章讲解了GLSL的基本语法,需要结合实例去不断练习才能熟练的使用

xiaozhiwz的专栏 1454

OpenGL ES2.0绘制圆形点Android

使用Android SDK开发,使用OpenGL ES2.0绘制圆形点,支持横竖屏转换,点的大小有两种方式设置效果图如下: 着色器代码 package com.hb.drawpoint; public final class ShaderCode { public final static String VERTEX = "uniform...

做GIS梦的人 1965

Android OpenGLES2.0开发(三):绘制一个三角形

本章讲解了OpenGL ES中最基本图形三角形的绘制,让我们最OpenGL ES绘制流程有一个全面的了解

xiaozhiwz的专栏 2005

手把手教你用Arduino Uno控制meArm机械臂(附完整代码+避坑指南)

本文提供了一份详尽的meArm机械臂控制指南,涵盖从Arduino Uno硬件连接到Servo库编程的完整流程。重点讲解了如何通过独立供电、软件限位和平滑运动函数实现稳定控制,并设计了串口指令协议与高级功能,帮助创客有效规避舵机抖动、电源不足等常见问题,让机械臂运行更流畅可靠。

gpt4scribbler的博客 540

OpenGLES:绘制一个混色的圆形

今天使用OpenGLES实现一个圆心是玫红色,向圆周渐变成蓝色的圆。 本篇博文的内容也是后续绘制3D图形的基础。

肖云鹤的博客 1308

SAP 发货在途库存管理:POD确认差异下的2种后续调整方案对比

本文详细解析了SAP发货在途库存管理中POD确认差异后的财务调整方案,对比了移动类型417和555 T两种处理方式的适用场景及财务影响。通过实际案例说明如何优化POD流程,减少库存差异损失,提升供应链管理效率。特别适合SAP SD模块用户及供应链管理人员参考。

chiman6219的博客 394

【OpenGL ES】绘制圆形

1 前言 【OpenGL ES】绘制三角形中介绍了绘制三角形的方法,【OpenGL ES】绘制正方形中介绍了绘制正方形的方法,本文将介绍绘制圆形的方法。 项目目录如下: 2 案例 MainActivity.java package com.zhyan8.circle; import android.opengl.GLSurfaceView; import android.os.Bundle; import androidx.appcompa...

little_fat_sheep 3540

智能车竞赛环岛处理全解析:从图像识别到状态机控制

在嵌入式系统与自动控制领域,状态机是管理复杂系统行为、实现清晰逻辑流的核心设计模式。其原理在于定义一组有限的状态,以及触发状态迁移的事件和条件,从而将连续、模糊的过程分解为离散、确定的阶段。这种技术在机器人导航、工业自动化等场景中价值显著,尤其适用于需要应对多种场景、做出序列化决策的场合。在智能车竞赛中,赛道元素识别与路径跟踪是典型应用,其中环岛作为连续闭环的复杂场景,对系统的鲁棒性和决策连贯性提出了更高要求。通过图像处理提取赛道边线、宽度和曲率等特征,结合陀螺仪等传感器数据,可以构建一个专门处理环岛的状态

weixin_34033624的博客 561

手把手教你用smarteye搭建免费GB28181监控平台(含海康设备接入避坑指南)

本文提供了一份基于SmartEye搭建免费GB28181视频监控平台的实战指南。详细介绍了从服务器部署、GB28181协议核心配置,到海康威视等主流设备接入的完整流程,并重点分享了设备注册失败、无法预览等常见问题的深度排错方法,旨在帮助中小企业及开发者低成本实现多品牌监控设备的统一管理。

pz89012345的博客 326

Android OpenGLES2.0开发(八):Camera预览

该篇章主要讲解了OpenGL ES对外部纹理Camera预览数据的渲染

xiaozhiwz的专栏 1681

保姆级教程:Win10/Win11系统下ArcGIS 10.2中文版完整安装与破解(含License Manager启动失败解决方案)

本文提供Windows 10/11系统下ArcGIS 10.2中文版的完整安装与破解教程,重点解决License Manager启动失败等常见问题。从安装准备、破解文件处理到最终配置验证,详细指导用户完成每一步操作,确保软件正常运行。特别针对主机名修改、端口占用等疑难问题提供专业解决方案。

weixin_29596051的博客 545

Android OpenGLES2.0(一)OpenGLES2.0基础介绍

Andoid OpenGlES基础认识,OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根据不同的语言环境稍有不同而已。OpenGL这套3D图形API从1992年发布的1.0版本到目前最新2014年发布的4.5版本,在众多平台上多有着广泛的使用。...

主要记录一些问题处理记录,部分是作为知识库使用 2400

TDS水质检测传感器原理图设计,已量产(液体传感器)

最近调试了一款针对生活用水、水培系统的 TDS 水质检测模块 —— 毕竟 TDS(总溶解固体)值直接关联水的洁净程度,是这类场景里既实用又易获取的水质指标。下面拆解下这个电路的设计逻辑,说说每个部分是怎么配合实现精准检测的。

不脱发的程序猿 1538

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 372

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

端到端自动驾驶:特斯拉FSD Beta技术拆解

端到端自动驾驶:特斯拉FSD Beta技术拆解 ,人工智能,计算机视觉,大模型,AI,这篇文章围绕特斯拉FSD Beta的端到端自动驾驶技术展开,先介绍端到端自动驾驶的定义、与传统方案的区别及FSD Beta的特点,再阐述其硬件基础、技术架构,解析关键技术,还涉及训练数据与标注、安全与冗余设计、实际应用场景与挑战以及技术迭代与更新等内容,展现了该技术的多方面情况。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

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

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

cassiePython的专栏 3732

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android OpenGLES2.0(一)——了解OpenGLES2.0

OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根据不同的语言环境稍有不同而已。OpenGL这套3D图形API从1992年发布的1.0版本到目前最新2014年发布的4.5版本,在众多平台上多有着广泛的使用。OpenGL ES相对于OpenGL来说,减少了许多不是必须的方法和数据类型,去掉了不必须的功能,对代价大的功能做了限制,比OpenGL更为轻量。在OpenGL ES的世界里,没有四边形

liuliuhelingdao的博客 2016

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

OpenglES2.0 for Android:来画个球吧

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

cassiePython的专栏 5999

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OpenGLES应用开发实践指南——OpenGLES2.0实战第一课

要用OpenGl ES在应用程序中绘制图像,首先你要创建与之对应的视图容器。 当中最直接的方法就是使用GLSurfaceView和GLSurfaceView.Renderer接口。 GLSurfaceView是OpenGL所绘制的图形的视图容器,而GLSurfaceView.Renderer控制在视图上所绘制的图像。想获取更多关于这两个类的信息,请参考OpenGl ES开发指南。 GLSur...

我的专栏 1680

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

OpenglES2.0 for Android:来画个矩形吧 上一节中我们绘制了一个三角形,我们在上一节的基础上来完成矩形的绘制 。 OK,开始动手做吧,首先在上一节的项目中的shape目录下新建一个类——Square (Square.java),然后定义矩形的四个顶点的坐标,此时代码如下(Square.java): package com.cumt.shape;

cassiePython的专栏 7743

Android OpenGLES2.0开发(五):绘制正方形和圆形

本章节我们用OpenGL ES绘制了正方形和圆形,让我们对OpenGL ES绘制图形又加深的印象

xiaozhiwz的专栏 2207

OpenglES2.0 for Android:来画个立方体吧

OpenglES2.0 for Android:来画个立方体吧 前言: 前面一直在说OpenglES2.0二维图形的绘制,接下来我们步入三维的世界 ,三维世界远比二维要有趣的多,与此同时复杂性也要高得多,在unity3D中我们可以很容易的就创建 一个立方体,而在OpenglES2.0中这个过程要复杂得多,但是更加有趣 。先来看下我们的整个流程:

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值