OpenglES2.0 for Android:再谈纹理映射

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

OpenglES2.0 for Android:再谈纹理映射

前言


上一节我们实现了一个简单的纹理映射的例子——一个简单的贴图,这节我们来做一些稍微复杂一点的例子,最后再给我们前面的立方体做一个纹理。


纹理拉伸 


重复拉伸方式


这种是经常使用的一张纹理拉伸方式,常用于绘制一些重复的元素,比如我们在游戏绘制一幅方格式的地图时。使用重复拉伸方式使得纹理能够根据目标平
面的大小自动重复,这样既不会失去纹理图的效果,也可以节省内存。如下图所示:



实现起来很简单,我们回到上节的项目,找到我们纹理的工具类TextureHelper.java ,修改如下 (TextureHelper.java):

package com.cumt.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLES20;
import android.opengl.GLUtils;
import android.util.Log;

public class TextureHelper {
	
	public static final String TAG = "TextureHelper";
	
	public static int loadTexture(Context context,int resourceId,boolean isRepeat){
		/*
		 * 第一步 : 创建纹理对象
		 */
		final int[] textureObjectId = new int[1];//用于存储返回的纹理对象ID
		GLES20.glGenTextures(1,textureObjectId, 0);
		if(textureObjectId[0] == 0){//若返回为0,,则创建失败
			if(LoggerConfig.ON){
				Log.w(TAG,"Could not generate a new Opengl texture object");
			}
			return 0;
		}
		/*
		 * 第二步: 加载位图数据并与纹理绑定
		 */
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inScaled = false;//Opengl需要非压缩形式的原始数据
		final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),resourceId, options);
		if(bitmap == null){
			if(LoggerConfig.ON){
				Log.w(TAG,"ResourceId:"+resourceId+"could not be decoded");
			}
			GLES20.glDeleteTextures(1, textureObjectId, 0);
			return 0;
		}
		GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureObjectId[0]);//通过纹理ID进行绑定
		
		if(isRepeat){
			GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
			GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
		}
		
		/*
		 * 第三步: 设置纹理过滤
		 */
		//设置缩小时为三线性过滤
		GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR_MIPMAP_LINEAR);
		//设置放大时为双线性过滤
		GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
		/*
		 * 第四步: 加载纹理到Opengl并返回ID
		 */
		GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
		bitmap.recycle();
		GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
		return textureObjectId[0];
	}
}

我们只做了两处修改,首先loadTexture新加一个布尔型参数isRepeat ,下面更加isRepeat的值来判断是否设置重复拉伸 。如果isRepeat为true则调用 :

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

设置纹理在S与T纬度都设置为重复拉伸 。

下面我们来设置绘制4*4个,我们只需将Square.java中的顶点坐标与纹理坐标的对应改为下面 所示 :

 //矩形顶点坐标  与 纹理坐标
    static float squareCoords[] = { //以三角形扇的形式绘制
    	//x     y       s   t
    	-0.5f,  0.5f ,  0 , 0 , // top left  
        0.5f,  0.5f  ,  4 , 0 ,// top right  
        0.5f, -0.5f  ,  4 , 4 ,// bottom right  
       -0.5f, -0.5f  ,  0 , 4};  // bottom left  

此时我们的纹理在S轴范围为0 到 4 ,在T轴也是0到4 ,于是纹理在S轴方向重复四次,在T轴方向重复四次。下面使用loadTexture方法时传入true,
运行一下即可看到上面的效果。

截取拉伸方式


将上面的纹理工具类中的 if (isRepeat )条件下的代码改为 :

if(isRepeat){
			GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
			GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
		}
其它代码不变 。我们将S轴方向与T轴方向都设置为截取拉伸 ,运行效果如下 :



能够看出在S轴方向与T轴方向纹理的边缘都被拉伸。当然也可以设置在S轴方向为重复拉伸,在T轴方向为截取拉伸。

if(isRepeat){
			GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
			GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
		}

如图所示 ;

立方体添加纹理


前面一直在说二维图形的贴图,其实对于三维物体也是一样。关键在于找到顶点坐标与纹理坐标的关系。
接下来我们来给我们上次绘制的立方体添加纹理。

首先,将我们的上节的纹理工具类copy到立方体的工具类下 ,修改顶点着色器和片段着色器如下 :

//vertex_shader_cube.glsl
uniform mat4 u_Matrix;
attribute vec4 a_Position;  
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
void main()                    
{                              
    gl_Position = u_Matrix * a_Position;
    v_TextureCoordinates = a_TextureCoordinates;	
}  

//fragment_shader_cube.glsl
precision mediump float; 				
uniform sampler2D u_TextureUnit;      	 								
varying vec2 v_TextureCoordinates;
void main()                    		
{                              	
    gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);                                       		
}

最后修改我们的Cube类 ,添加纹理坐标,传入纹理坐标数据等 ,过程和上一节一样 ,我们直接看代码 :

package com.cumt.shape;

import static android.opengl.GLES20.GL_TEXTURE0;
import static android.opengl.GLES20.GL_TEXTURE_2D;
import static android.opengl.GLES20.glActiveTexture;
import static android.opengl.GLES20.glBindTexture;
import static android.opengl.GLES20.glUniform1i;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import com.cumt.openglescubewen.R;
import com.cumt.utils.MatrixState;
import com.cumt.utils.ShaderHelper;
import com.cumt.utils.TextResourceReader;
import com.cumt.utils.TextureHelper;

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

public class Cube {

	//顶点坐标
	private FloatBuffer vertexBuffer;
	private Context context;
	//float类型的字节数
	private static final int BYTES_PER_FLOAT = 4;
	//共有72个顶点坐标,每个面包含12个顶点坐标
	private static final int POSITION_COMPONENT_COUNT = 6*12;
	// 数组中每个顶点的坐标数
    private static final int COORDS_PER_VERTEX = 3;
    // 颜色数组中每个颜色的值数
	
	private static final String A_POSITION = "a_Position";
	private static final String U_MATRIX = "u_Matrix";
	private int uMatrixLocation;
	private int aPositionLocation;
	private int program;
	private static final int TEXTURE_COORDIANTES_COMPONENT_COUNT = 2; //一个纹理坐标含有的元素个数
	private static final int STRIDE = (COORDS_PER_VERTEX + TEXTURE_COORDIANTES_COMPONENT_COUNT)
			* BYTES_PER_FLOAT;
	
	private static final String A_TEXTURE_COORDINATES = "a_TextureCoordinates";//纹理
	private static final String U_TEXTURE_UNIT = "u_TextureUnit";//纹理
    private int uTextureUnitLocation;
    private int aTextureCoordinates;
    private int texture;
    
    static float vertices[] = {
    	//X   Y   Z        S    T
		//前面
    	0,0,1.0f,  			0.5f,0.5f,
    	1.0f,1.0f,1.0f, 	1.0f,0,
    	-1.0f,1.0f,1.0f, 	0,0,
    	0,0,1.0f,           0.5f,0.5f,
    	-1.0f,1.0f,1.0f,    0,0,
    	-1.0f,-1.0f,1.0f,   0,1.0f,
    	0,0,1.0f,           0.5f,0.5f,
    	-1.0f,-1.0f,1.0f,   0,1.0f,
    	1.0f,-1.0f,1.0f,    1.0f,1.0f,
    	0,0,1.0f,           0.5f,0.5f,
    	1.0f,-1.0f,1.0f,    1.0f,1.0f,
    	1.0f,1.0f,1.0f,     1.0f,0,
    	//后面
    	0,0,-1.0f,        	0.5f,0.5f,
    	1.0f,1.0f,-1.0f,    1.0f,0,
    	1.0f,-1.0f,-1.0f,   1.0f,1.0f,
    	0,0,-1.0f,          0.5f,0.5f,
    	1.0f,-1.0f,-1.0f,   1.0f,1.0f,
    	-1.0f,-1.0f,-1.0f,  0,1.0f,
    	0,0,-1.0f,          0.5f,0.5f,
    	-1.0f,-1.0f,-1.0f,  0,1.0f,
    	-1.0f,1.0f,-1.0f,   0,0,
    	0,0,-1.0f,          0.5f,0.5f,
    	-1.0f,1.0f,-1.0f,   0,0,
    	1.0f,1.0f,-1.0f,    1.0f,0,
    	//左面
    	-1.0f,0,0,      	0.5f,0.5f, 
    	-1.0f,1.0f,1.0f,    1.0f,0,
    	-1.0f,1.0f,-1.0f,   0,0,
    	-1.0f,0,0,          0.5f,0.5f,
    	-1.0f,1.0f,-1.0f,   0,0,
    	-1.0f,-1.0f,-1.0f,  0,1.0f,
    	-1.0f,0,0,          0.5f,0.5f,
    	-1.0f,-1.0f,-1.0f,  0,1.0f,
    	-1.0f,-1.0f,1.0f,   1.0f,1.0f,
    	-1.0f,0,0,          0.5f,0.5f,
    	-1.0f,-1.0f,1.0f,   1.0f,1.0f,
    	-1.0f,1.0f,1.0f,    1.0f,0,
    	//右面  
    	1.0f,0,0,           0.5f,0.5f,
    	1.0f,1.0f,1.0f,     0,0,
    	1.0f,-1.0f,1.0f,    0,1.0f,
    	1.0f,0,0,           0.5f,0.5f,
    	1.0f,-1.0f,1.0f,    0,1.0f,
    	1.0f,-1.0f,-1.0f,   1.0f,1.0f,
    	1.0f,0,0,           0.5f,0.5f,
    	1.0f,-1.0f,-1.0f,   1.0f,1.0f,
    	1.0f,1.0f,-1.0f,    1.0f,0,
    	1.0f,0,0,           0.5f,0.5f,
    	1.0f,1.0f,-1.0f,    1.0f,0,
    	1.0f,1.0f,1.0f,     0,0,
    	//上面
    	0,1.0f,0,           0.5f,0.5f,
    	1.0f,1.0f,1.0f,     1.0f,0,
    	1.0f,1.0f,-1.0f,    1.0f,1.0f,
    	0,1.0f,0,        	0.5f,0.5f,
    	1.0f,1.0f,-1.0f,    1.0f,1.0f,
    	-1.0f,1.0f,-1.0f,   0,1.0f,
    	0,1.0f,0,           0.5f,0.5f,
    	-1.0f,1.0f,-1.0f,   0,1.0f,
    	-1.0f,1.0f,1.0f, 	0,0,
    	0,1.0f,0,           0.5f,0.5f,
    	-1.0f,1.0f,1.0f,    0,0,
    	1.0f,1.0f,1.0f,  	1.0f,0,
    	//下面
    	0,-1.0f,0,        	0.5f,0.5f,
    	1.0f,-1.0f,1.0f,    1.0f,0,
    	-1.0f,-1.0f,1.0f,   0,0,
    	0,-1.0f,0,          0.5f,0.5f,
    	-1.0f,-1.0f,1.0f,   0,0,
    	-1.0f,-1.0f,-1.0f,  0,1.0f,
    	0,-1.0f,0,          0.5f,0.5f,
    	-1.0f,-1.0f,-1.0f,  0,1.0f,
    	1.0f,-1.0f,-1.0f,   1.0f,1.0f,
    	0,-1.0f,0,          0.5f,0.5f,
    	1.0f,-1.0f,-1.0f,   1.0f,1.0f,
    	1.0f,-1.0f,1.0f ,   1.0f,0,
	};
	
	
	public Cube(Context context){
		this.context = context;
		
		vertexBuffer = ByteBuffer
    			.allocateDirect(vertices.length * BYTES_PER_FLOAT)
    			.order(ByteOrder.nativeOrder())
    			.asFloatBuffer();
    	// 把坐标们加入FloatBuffer中
        vertexBuffer.put(vertices);
        // 设置buffer,从第一个坐标开始读
        vertexBuffer.position(0);
        
        getProgram();
        
		aPositionLocation = GLES20.glGetAttribLocation(program, A_POSITION);
		uMatrixLocation = GLES20.glGetUniformLocation(program, U_MATRIX);
		
		aTextureCoordinates = GLES20.glGetAttribLocation(program, A_TEXTURE_COORDINATES);
		uTextureUnitLocation = GLES20.glGetAttribLocation(program, U_TEXTURE_UNIT);
		texture = TextureHelper.loadTexture(context, R.drawable.umei,false);
		// Set the active texture unit to texture unit 0.
        glActiveTexture(GL_TEXTURE0);
        // Bind the texture to this unit.
        glBindTexture(GL_TEXTURE_2D, texture);
        // Tell the texture uniform sampler to use this texture in the shader by
        // telling it to read from texture unit 0.
        glUniform1i(uTextureUnitLocation, 0);
        
		//---------传入顶点数据数据
		GLES20.glVertexAttribPointer(aPositionLocation, COORDS_PER_VERTEX,
				GLES20.GL_FLOAT, false, STRIDE, vertexBuffer);
		GLES20.glEnableVertexAttribArray(aPositionLocation);
		//设置从第二个元素开始读取,因为从第二个元素开始才是纹理坐标
		vertexBuffer.position(COORDS_PER_VERTEX);
		GLES20.glVertexAttribPointer(aTextureCoordinates, TEXTURE_COORDIANTES_COMPONENT_COUNT,
						GLES20.GL_FLOAT, false, STRIDE, vertexBuffer);
		GLES20.glEnableVertexAttribArray(aTextureCoordinates);
	}
	
	//获取program
    private void getProgram(){
    	//获取顶点着色器文本
    	String vertexShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.vertex_shader_cube);
    	//获取片段着色器文本
		String fragmentShaderSource = TextResourceReader
				.readTextFileFromResource(context, R.raw.fragment_shader_cube);
		//获取program的id
		program = ShaderHelper.buildProgram(vertexShaderSource, fragmentShaderSource);
		GLES20.glUseProgram(program);
    }
    
    public void draw(){
		GLES20.glUniformMatrix4fv(uMatrixLocation, 1, false, MatrixState.getFinalMatrix(),0);
		GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, POSITION_COMPONENT_COUNT);
    }
}

运行结果如下 (屏幕方向设置为横向):



这里如上面所说,关键是找到顶点坐标与纹理坐标的对应。 
我们以正面为例,按照我们的绘制方式正面我们实际上需要确定五个顶点对应的纹理坐标,这五个顶点分别是 :
-----------------------------------------------------------------------------------------------------------------------------------------------------
左上角   (-1 ,-1,1 )   左下角  (-1,1,1 )  右上角  (1 ,-1 , 1)
右下角   (1, 1 ,1 )    中心点  (0 ,0 ,1)
------------------------------------------------------------------------------------------------------------------------------------------------------
对应的纹理的坐标依次为  : (0 , 1 )   (0 ,0 )  (1 ,1 )  (1, 0)  (0.5 , 0.5 )要注意纹理的左上角的ST坐标并不是(0,0)而是(0,1)
否则我们绘制的纹理绘制上下颠倒的。




Android OpenGLES2.0 渲染ffmpeg解码后的视频 平台:Android 版本:OpenGL SE 2.0 OpenGL SE 和 EGL相关概念介绍请参考 https://www.2cto.com/kf/201806/752471.html 流程: 当前已有条件:H264已解码完的数据。 显示控件为:SurfaceView。 PS: 本文只适合android ffmpeg软解码后的视频渲染,其他情况请大家搜索其他大佬的博客 OpenGL 需要渲染... 阅读详情

相关推荐

利用android_ndk开发OpenGLES如何利用上层Bitmap生成纹理

在网上找了很多的资料,想利用android上层生成Bitmap,然后把Bitmap的pixel传递给JNI,然后再C++中生成纹理映射,但是结果都失败了。最后自己想得到了一个方法,在android上层直接生成纹理映射,然后把纹理映射的地址传递给JNI,这样就可以利用上层的Bitmap生成纹理映射了。当然这不是最好的方法,但是由于自己现在的能力有限,暂时只能依靠这个方法了,如果有人知道如何正确的利用

ygc87的专栏 3763

OpenGL ES2.0基础

初级学习OpenGL ES2.0的课程,从无到有,从进本的函数讲起,每一课时都附带一个例子程序。深入浅出的讲解可编程管线技术,令人费解的文理,以及混合技术,各种优化技术:顶点缓冲区,索引缓冲区,帧缓冲区,介绍精灵的使用,并使用shader制作粒子特效。

超详细!新手必看STM32-DMA配置与实验(串口使用DMA发送数据)

DMA就是:直接存储器访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和存储器或者存储器和存储器之间的高速数据传输。

qq_1033275663的博客 2万+

《OpenGLES 2.0 Programming Guide》学习笔记(持续更新)

《OpenGLES 2.0 Programming Guide》 学习笔记 1 介绍OpenGLES gles由KhronosGroup创立,目前有3个版本1.0,1.1(统称1.x)和2.0。ES1.0,1.1由OpenGL1.3,1.5继承而来,ES2.0由OpenGL2.0继承而来。 OpenGLES 2.0的specifications有两份:theOpenGL ES 2.0 ...

v5qqcom 423

(蓝桥杯)STM32G431RBT6(SysTick timer)

选用最基础的定时器。

2301_81764359的博客 1899

AI辅助游戏开发实战:Kimi K3提升Unity开发效率与代码质量

在游戏开发领域,有限状态机(FSM)是构建角色AI行为逻辑的核心设计模式,它通过定义明确的状态和转换条件,使游戏实体能够智能地响应环境变化。其原理在于将复杂的行为分解为离散的状态节点,并通过事件驱动状态切换,从而实现清晰、可维护的AI架构。这项技术的价值在于显著提升了游戏角色的行为真实感和开发效率,被广泛应用于NPC行为控制、角色动画管理、UI流程等场景。随着AI编程助手的兴起,开发者现在可以借助如Kimi K3这类工具,通过自然语言指令快速生成和优化FSM等复杂系统的代码框架,将更多精力投入到核心玩法与性

weixin_30430677的博客 407

OpenGL ES 2.0 for Android教程(七):使用纹理添加细节

我们已经设法用简单的形状和颜色完成了很多工作。不过,我们缺少了一些东西:如果我们希望在图形上绘画,并添加精致的细节呢?像艺术家一样,我们可以从基本图形和颜色开始,通过使用纹理在表面上添加额外的细节。简单来说,纹理就是可以加载到OpenGL上的图像或图片。 我们可以通过纹理(Texture)添加大量细节。想想你最近可能玩过的一款精美的3D游戏,这些游戏的本质也只是使用点、线和三角形,就像其他3D程序一样。然而,通过纹理添加的细节和艺术家的加工,这些三角形可以用纹理构建美丽的3D场景。 一旦我们开始使用纹理

重来的博客 9472

SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)

二维回波信号分析

zr2006_7的专栏 2万+

Android OpenGLES2.0开发(七):纹理贴图之显示图片

本文讲解了纹理贴图的基本用法,纹理坐标和OpenGL ES坐标系的不同

xiaozhiwz的专栏 1923

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1618

SmartFusion从FPGA到ARM(一)——MSS_GPIO点灯

文章目录前言GPIO点灯 前言 GPIO点灯

whik1194的博客 5270

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

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

cassiePython的专栏 3732

社会网络仿真软件:NetLogo_(14).社会网络数据导入与导出

在NetLogo中,社会网络的仿真不仅依赖于模型的内部逻辑,还需要能够灵活地导入和导出数据。这使得用户可以利用外部数据来初始化模型,或者将模型的运行结果导出以便进一步分析。本节将详细介绍如何在NetLogo中实现社会网络数据的导入和导出,包括常见的数据格式和具体的代码示例。

kkchenjj的博客 600

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

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

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

Python 爬虫实战:微博自动化运营工具(点赞 / 转发 / 评论 + 反封号策略)

微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的数据资源。通过 Python 爬虫技术,我们可以实现微博的自动化运营,包括点赞、转发、评论等功能,同时采取有效的反封号策略,确保账号的安全和稳定运行。

u014481728的博客 1177

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

什么是OpenGL ES? OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。 OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OpenglES2.0 for Android:纹理映射

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

cassiePython的专栏 5756

LearnOpenGL - Android OpenGL ES 3.0 绘制纹理

在LearnOpenGL - Android OpenGL ES 3.0 绘制三角形中我们学会了如何在 Android 下搭建 GLES 环境,并绘制三角形。本文我们将讨论如何绘制纹理。本文代码在顶点着色器: 执行次数与顶点数量相同,每个顶点执行一次。片元着色器: 执行次数与片元(像素)数量相同,每个片元执行一次。因此,片元着色器的执行次数通常远多于顶点着色器的执行次数,因为片元数量通常大于顶点数量。具体执行次数取决于渲染的几何图形在屏幕上的覆盖范围。

记录学习的过程 1337

(转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片

转:http://blog.csdn.net/junzia/article/details/52842816 前面几篇博客,我们将了Android中利用OpenGL ES 2.0绘制各种形体,并在上一篇博客中专门讲了GLSL语言。但是我们看到的基于OpenGL开发的应用和游戏,可不仅仅是那些规则形体和一些简单的色彩构成,而是各种不规则的形体构成了现实世界或者卡通世界的人和事物,他们都是...

828

OpenGL ES 纹理以及纹理的映射

OpenGL ES 纹理以及纹理的映射

Lud的博客 931

android纹理坐标,Android OpenGL ES 2.0 手把手教学(6)- 纹理

大家好,下面和大学一起学习纹理,在我的github上有一个项目OpenGLES2.0SamplesForAndroid,我会不断地编写学习样例,文章和代码同步更新,欢迎关注,链接:github.com/kenneycode/…在前面的例子中,我们渲染的都是一些比较简单的颜色,如果我们要渲染一张图片,该怎么做呢?这就需要用到纹理,我们需要创建一个纹理并把图片加载到纹理中,然后在fragment sh...

weixin_36452379的博客 504
上一篇: OpenglES2.0 for Android:纹理映射
下一篇: OpenglES2.0 for Android:来做个地球吧
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值