Opengl ES 1.x NDK实例开发之二:颜色的使用

NDK OpenGL ES 3.0 开发(十三):实例化(Instancing) 该原创文章首发于微信公众号:字节流动 OpenGL ES 实例化(Instancing) OpenGL ES 实例化(Instancing)是一种只调用一次渲染函数就能绘制出很多物体的技术,可以实现将数据一次性发送给 GPU ,告诉 OpenGL ES 使用一个绘制函数,将这些数据绘制成多个物体。 实例化(Instancing)避免了 CPU 多次向 GPU 下达渲染命令(避免多次调用 gl... 阅读详情

开发框架介绍请参见: Opengl ES NDK实例开发之一:搭建开发框架


【实例讲解】


本章在第一章的基础上讲解颜色的使用。

本例中绘制了一个三角形和一个正方形,三角形用的是光滑着色,正方形用的是平面着色。使用Flat coloring(单调着色)给四边形涂上固定的一种颜色。使用Smooth coloring(平滑着色)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。

[单一颜色渲染]

glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
[顶点渲染混合]

glEnableClientState(GL_COLOR_ARRAY);			// 启用颜色数组
glColorPointer(4, GL_FLOAT, 0, gColors);                // 指定颜色数组
glDisableClientState(GL_COLOR_ARRAY);			// 关闭颜色数组
需注意的是,如果调用了glEnableClientState(GL_COLOR_ARRAY),则在代码中就要调用glColorPointer(4, GL_FLOAT, 0, gColors)来指定颜色数组,否则在glDrawArrays(GL_TRIANGLES, 0, 3)会因找不到颜色数组而报错

【实例源码】

[GLJNIActivity.java]

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * author: mnorst@foxmail.com
 */

package com.android.gljni;

import com.android.gljni.GLJNIView;

import android.app.Activity;
import android.os.Bundle;

public class GLJNIActivity extends Activity {
	GLJNIView mView;

	@Override
	protected void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		mView = new GLJNIView(getApplication());
		setContentView(mView);
	}

	@Override
	protected void onPause() {
		super.onPause();
		mView.onPause();
	}

	@Override
	protected void onResume() {
		super.onResume();
		mView.onResume();
	}
}
[GLJNIView.java]

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * author: mnorst@foxmail.com
 */

package com.android.gljni;

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

import com.android.gljni.GLJNILib;

import android.content.Context;
import android.opengl.GLSurfaceView;

/**
 * A simple GLSurfaceView sub-class that demonstrate how to perform
 * OpenGL ES 1.x rendering into a GL Surface.
 */
public class GLJNIView extends GLSurfaceView {

	private static final String LOG_TAG = GLJNIView.class.getSimpleName();

	private Renderer renderer;

	public GLJNIView(Context context) {
		super(context);

		// setEGLConfigChooser会对fps产生影响
		setEGLConfigChooser(8, 8, 8, 8, 16, 0);

		renderer = new Renderer(context);
		setRenderer(renderer);
	}

	private static class Renderer implements GLSurfaceView.Renderer {

		public Renderer(Context ctx) {

		}

		public void onDrawFrame(GL10 gl) {
			GLJNILib.step();
		}

		public void onSurfaceChanged(GL10 gl, int width, int height) {
			GLJNILib.resize(width, height);
		}

		public void onSurfaceCreated(GL10 gl, EGLConfig config) {
			GLJNILib.init();
		}
	}

}
[GLJNILib.java]

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * author: mnorst@foxmail.com
 */

package com.android.gljni;

//Wrapper for native library
public class GLJNILib {
	
	static {
		System.loadLibrary("gljni");
	}

	/**
     * @param width the current view width
     * @param height the current view height
     */
	public static native void resize(int width, int height); 
	
    public static native void step();  
    
    public static native void init();  
}


[gl_code.cpp]

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * author: 	mnorst@foxmail.com
 * created:	2014/09/26
 * purpose:	颜色的使用
 */

// OpenGL ES 1.x code

#include <jni.h>
#include <android/log.h>

#include <GLES/gl.h>
#include <GLES/glext.h>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/************************************************************************/
/*                             定义                                     */
/************************************************************************/

#define  LOG_TAG    "libgljni"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

// 定义π
const GLfloat PI = 3.1415f;

// 顶点数组
const GLfloat gVertices[] = {
	0.0f, 1.0f, 0.0f,	// 上
	-1.0f,-1.0f, 0.0f,	// 左下
	1.0f,-1.0f, 0.0f,	// 右下
};

const GLfloat gVerticesSquare[] = {
	-1.0f, -1.0f, 0.0f, // 左下
	1.0f, -1.0f, 0.0f, 	// 右下
	-1.0f, 1.0f, 0.0f, 	// 左上
	1.0f, 1.0f, 0.0f 	// 右上
};

// 颜色数组
const GLfloat gColors[] = {
	1.0f,0.0f,0.0f, 1.0f,
	0.0f,1.0f,0.0f, 1.0f,
	0.0f,0.0f,1.0f, 1.0f,
};

/************************************************************************/
/*                             C++代码                                  */
/************************************************************************/

static void printGLString(const char *name, GLenum s) {
	const char *v = (const char *) glGetString(s);
	LOGI("GL %s = %s\n", name, v);
}

static void checkGlError(const char* op) {
	for (GLint error = glGetError(); error; error
		= glGetError()) {
			LOGI("after %s() glError (0x%x)\n", op, error);
	}
}

bool init() {
	printGLString("Version", GL_VERSION);
	printGLString("Vendor", GL_VENDOR);
	printGLString("Renderer", GL_RENDERER);
	printGLString("Extensions", GL_EXTENSIONS);

	// 启用阴影平滑
	glShadeModel(GL_SMOOTH);

	// 黑色背景	
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);	

	// 设置深度缓存	
	glClearDepthf(1.0f);

	// 启用深度测试
	glEnable(GL_DEPTH_TEST);	

	// 所作深度测试的类型	
	glDepthFunc(GL_LEQUAL);	

	// 对透视进行修正	
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	

	return true;
}

static void _gluPerspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar)
{
	GLfloat top = zNear * ((GLfloat) tan(fovy * PI / 360.0));
	GLfloat bottom = -top;
	GLfloat left = bottom * aspect;
	GLfloat right = top * aspect;
	glFrustumf(left, right, bottom, top, zNear, zFar);
}

void resize(int width, int height)
{
	// 防止被零除
	if (height==0)								
	{
		height=1;
	}

	// 重置当前的视口
	glViewport(0, 0, width, height);	
	// 选择投影矩阵	
	glMatrixMode(GL_PROJECTION);	
	// 重置投影矩阵	
	glLoadIdentity();							

	GLfloat ratio = (GLfloat)width/(GLfloat)height;

	// 设置视口的大小
	_gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	// 选择模型观察矩阵
	glMatrixMode(GL_MODELVIEW);	

	// 重置模型观察矩阵
	glLoadIdentity();							
}

void renderFrame() {
	// 清除屏幕及深度缓存
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
	// 设置背景颜色为黑色
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	// 重置当前的模型观察矩阵
	glLoadIdentity();		
	
	// 启用顶点数组
	glEnableClientState(GL_VERTEX_ARRAY);

	// 绘制三角形
	glTranslatef(0.0f,2.0f,-10.0f);						// 设置三角形位置
	glEnableClientState(GL_COLOR_ARRAY);				// 启用颜色数组
	glColorPointer(4, GL_FLOAT, 0, gColors);			// 指定颜色数组
	glVertexPointer(3, GL_FLOAT, 0, gVertices);			// 指定顶点数组
	glDrawArrays(GL_TRIANGLES, 0, 3);					// 绘制三角形
	glDisableClientState(GL_COLOR_ARRAY);				// 关闭颜色数组
	
	// 绘制正方形
	glTranslatef(0.0f,-4.0f,0.0f);						// 设置正方形位置
	glColor4f(1.0f, 0.0f, 0.0f, 1.0f);					// 设置颜色为红色
	glVertexPointer(3, GL_FLOAT, 0, gVerticesSquare);	// 指定顶点数组
	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);				// 绘制正方形
	
	// 关闭顶点数组
	glDisableClientState(GL_VERTEX_ARRAY);
}

/************************************************************************/
/*                          JNI代码                                     */
/************************************************************************/

extern "C" {
	JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj,  jint width, jint height);
	JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj);
	JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj);
};

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj,  jint width, jint height)
{
	resize(width, height);
}

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj)
{
	renderFrame();
}

JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj)
{
	init();
}


[Android.mk]

LOCAL_PATH:= $(call my-dir)  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE    := libgljni  
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := gl_code.cpp  
LOCAL_LDLIBS    := -llog -lGLESv1_CM  
  
include $(BUILD_SHARED_LIBRARY)  






NDK OpenGL ES 3.0 开发(十一):模板测试 该原创文章首发于微信公众号:字节流动 OpenGL ES 模板测试 模板测试与深度测试类似,主要作用是利用模板缓冲区(Stencil Buffer)所保存的模板值决定当前片段是否被丢弃,且发生于深度测试之前。 图片来源:https://learnopengl.com/Advanced-OpenGL/Stencil-testing 模板测试一般步骤: 启用模板测试,开启模板缓冲写入glSte... 阅读详情

相关推荐

NDK OpenGL ES 3.0 开发(十四):粒子(Particles)

该原创文章首发于微信公众号:字节流动 OpenGL ES 粒子(Particles) NDK OpenGL ES 3.0 开发(十三):实例化(Instancing)一文中我们了解到 OpenGL ES 实例化(Instancing)是一种只调用一次渲染函数就能绘制出很多物体的技术,可以实现将数据一次性发送给 GPU ,避免了 CPU 多次向 GPU 下达渲染命令,提升了渲染性能。 而粒子系...

字节流动 7273

我的android——OpenGL(2)——gl10方法解析

javax.microedition.khronos.opengles 接口GL10 上级接口:GL 下级接口:GL11 公共接口GL10继承于GL GL10接口包含了Java(TM)程序语言为OpenGL绑定的核心功能。OES_byte_coordinates,OES

6788

NDK OpenGL ES 3.0 开发(十):深度测试

该原创文章首发于微信公众号:字节流动 深度测试 OpenGL 深度测试是指在片段着色器执行之后,利用深度缓冲所保存的深度值决定当前片段是否被丢弃的过程。 深度缓冲区通常和颜色缓冲区有着相同的宽度和高度,一般由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数。 当深度测试开启的时候, OpenGL 才会测试深度缓冲区中的深度值。如果此测试通过,深度缓冲内的值可以被设为新的深度...

字节流动 6982

android gl11,OpenGL(ES)Android - 爲什麼這個glcolorpointer只有黑色?

我想繪製一個漸變,但首先我只想讓glcolorpointer工作。如果我使用glColor4f(...),它會正確繪製顏色,但glcolorpointer只會繪製黑色。請幫助OpenGL(ES)Android - 爲什麼這個glcolorpointer只有黑色?gl11.glPushMatrix();//gl11.glColor4f(RGBBorder[0], RGBBorder[1], RGBB...

weixin_36163504的博客 285

05、基于ALV表报实现复选框、全选、取消全选等功能

基于Function ALV实现复选框、全选及取消全选等功能

wo520yl1314的博客 2372

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 262

OpenGL加速渲染:顶点数组

         加速渲染主要有两种方法:显示列表与顶点数组。         其中,显示列表是通过预编译方式加速,而顶点数组是通过优化实时编译方式加速。但是,不需要同时使用两种加速方式。如果把顶点数组放在预编译中,然后通过显示列表来显示,这样做所耗时间与直接使用顶点数组所耗时间基本相同。         使用顶点数组,也就是把所有点存储在一个数组中,然后将该数组的地址属性通知给OpenGL,然后...

超频化石鱼的博客 1718

OrangePi Kunpeng Pro 安装 ROS2 + Gazebo

OrangePi Kunpeng Pro 的优点很明显,内置openEuler,配备PD电源,做到开箱即用;板子设计也不错,风扇噪音不大,散热良好,昇腾芯片又确保小板子的性能,接口丰富是这类板子共同的优点,也很好的继承了下来,甚至还可以外接固态,可靠性大大提升。使用起来,哪怕不用openEuler的话,也可以很方便的刷Ubuntu来实现一些需要依赖的开发工作,这次没有跑AI模型,所以对算力的优势还没有很明显的感受,下次可以试一下yolo跑跑看。

Arcan 1824

OpenGL常见函数功能查询

 一:GL库函数使用颜色glshadeModel--选择平面明暗模式或光滑明暗模式glColor--设置当前颜色glColorPointer--定义颜色数组gllndex--设置当前颜色索引gllndexPointer--定义颜色索引数组glCOforTableEXT--为目标调色板纹理指定调色板的格式和大小glColorsubTableEXT--指定需要替代的目标纹理调色板的一部分绘制几何图

若洒的专栏 2576

解决微信浏览器弹出 Download: Null 问题的终极指南(附阿里云 OSS 配置详解)

微信内置浏览器点击下载链接时弹出 "Download: Null" 的问题,是开发者常遇到的痛点。本篇文章全面解析其原因,包括 iOS 文件下载限制、Content-Disposition 响应头的重要性,以及阿里云 OSS 默认配置的影响。通过详细教程,教你如何在阿里云 OSS 中设置 Content-Disposition 元数据(attachment;filename=xxx.pdf),有效解决该问题。同时,拓展介绍微信浏览器的文件下载限制、跨平台兼容性优化以及 CDN 配置注意事项。

楠搏万的博客 3996

STM32F103四位数码管动态显示实战:从硬件连接到代码调试(附Proteus仿真)

本文详细介绍了STM32F103驱动四位数码管的动态显示技术,从硬件连接到代码调试的全过程。内容包括共阴/共阳数码管的区别、GPIO配置、动态显示原理及优化方法,并附有Proteus仿真验证。通过实战案例,帮助开发者快速掌握STM32数码管动态显示的核心技术。

weixin_29168393的博客 470

OpenGL着色

OpenGL着色分为:光滑作色和单调着色。 平滑着色设置三角形每个顶点的颜色 设置颜色数组 int one = 0x10000; //三角形的顶点颜色值(r,g,b,a) private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{ one,0,0,one, 0,one,0,one, 0,0,one,one, })

1671

Tushare Day2——了解stock_basic数据并根据行业和地区进行统计

了解stock_basic数据 1  stock_basic基础信息2  导入包和stock_basic数据、查看基本信息3  根据行业列进行统计3.1  1.先把不同行业列举出来,看一下一共有多少种行业3.2  2.统计每个行业分别有多少家公司3.3  3.把行业从array的二维数组形式变成list形式3.4  4.把行业从list形式转换成文本形式3.5&nbsp

绒绒的Routine 2797

Opengl ES 1.x NDK实例开发之五:顶点缓存VBO

转自:http://blog.csdn.net/mnorst/article/details/40300191 本章在上一章的基础上讲解顶点缓存数组(Vertex Buffer Object)即VBO的使用,使用VBO来实现金字塔和立方体的绘制,绘制的效果和上一章相同。这个系列教程主要是采用实例演示 Opengl ES 1.x NDK开发,对一些要点进行解...

153

读取rosbag中的IMU信息并转为tum格式的csv和txt

rostopic -b xx.bag -p /xx > xxx.txt #for euroc structvio import os, sys,re,csv name="street_07" # basedir="/media/yinjie/2498AF1F98AEEF0C/adataset/15results/imu_bagtxt/"+name+'.txt' # txtdir="/media/yinjie/2498AF1F98AEEF0C//adataset/15results/imu_o

qq_42928559的博客 1919

VTK学习(入门级教程,包括安装和使用)~持续更新中

说明:研究QT+VTK有段时间了,准备把学到的东西分享给大家,这篇博客以VS+QT+VTK为主进行展开学习的。

HXX904的博客 4758

Android opengl es 3.0 + ndk 绘画涂鸦项目

前言 写一个opengl es 3.0 + ndk 的绘画涂鸦项目,命名为白板哈哈哈,记录自己遇到的问题,顺便学到的知识整合一遍,算是对自己一段时间的总结。 项目地址:Whiteboard 如果对你有帮助,不妨点个start支持一下。感谢 效果图 调研如何绘制,具体思路? 主要调研的结果是方式有两种,一种是使用原生的 api 线条+drawPath 绘制贝塞尔曲线 而笔触纹理 可以通过 Canvas 生成圆点bitmap。 输出可以使用两个bitmap作为交换显示,形成一个双缓冲机制。 我之前写了一.

L 4862

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Opengl ES 1.x NDK实例开发之四:立方体的旋转

本章在第三章的基础上讲解如何绘制立方体并按照各自的中心进行旋转 绘制立方体实际上是绘制立方体的各个面,其中金字塔包括三个三角形侧面和一个正方形底面, 因为opengl ES里面不支持直接绘制正方形,所以需要将正方形拆分为两个三角形, 因此金字塔总共需要绘制5个三角形 立方体总共有8个顶点,我们在这里采用顶点索引的方式进行绘制 索引里面的值表示顶点的序号

give me five 2280

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NDK50_OpenGL

NDK开发汇总 什么是OpenGL? Open Graphics Library 图形领域的工业标准,是一套跨编程语言、跨平台的、专业的图形编程(软件)接口。它用于二维、三维图像,是一个功能强大,调用方便的底层图形库。 与硬件无关。可以在不同的平台如Windows、Linux、Mac、Android、IOS之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。 OpenGL ES 1.0 和 1.1 :Android 1.0和更高的版本支持这个API规范。 OpenG

baopengjian的专栏 449

WINCC7.3破解文件

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

安卓 NDK 秘籍(二)

在本章中,我们将涵盖以下内容:使用 OpenGL ES 1.x API 绘制 2D 图形并应用变换使用 OpenGL ES 1.x API 绘制 3D 图形并照亮场景使用 OpenGL ES 1.x API 将纹理映射到 3D 对象使用 OpenGL ES 2.0 API 绘制 3D 图形使用 EGL 显示图形开放图形库(OpenGL)是一个跨平台的工业标准 API,用于生成 2D 和 3D 图形。它定义了一个与语言无关的软件接口,用于图形硬件或软件图形引擎。OpenGL ES是针对嵌入式设备的 OpenG

龙哥盟 1162

Android基于OpenGL ES 3.0的VBO,VAO,EBO的使用(NDK开发)

有过一点OpenGL开发经验的人就知道每次绘图之前都会绑定顶点数组,每次将一个顶点传到GPU进行绘制。但是从CPU传数据到GPU的效率并不高,所以我们就需要使用VBO顶点缓存对象来一次性传递多个顶点到GPU,而VAO是3.0以后的版本才有的功能,它允许我们保存对于顶点的配置信息,我们配置好之后就只需要绑定对应的VAO,然后直接绘制即可。索引缓冲对象EBO和VBO类似也就是保存下标的缓冲。 - ...

JabamiYu的博客 1776

【OPENGL ES 3.0 学习笔记】其他内容:认识OpenVG

OpenVG是Khronos Group制定的2D矢量图形渲染API标准,专注于高效渲染SVG、自定义路径等矢量图形,具有缩放不失真和低内存占用的特点。与OpenGL ES不同,OpenVG专攻矢量图形,适用于UI控件、地图矢量图层等场景。其核心组件包括路径(Path)、画笔(Paint)和渲染(Render),通过"路径+属性"描述图形,支持硬件加速和跨平台一致性。使用流程依赖EGL初始化,需创建OpenVG上下文并设置抗锯齿等属性,最后通过路径和画笔资源实现图形绘制。OpenVG特别

u012739527的博客 920
上一篇: Opengl ES 1.x NDK实例开发之一:搭建开发框架
下一篇: Opengl ES 1.x NDK实例开发之三:多边形的旋转
mnorst
博客等级 码龄16年 38粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值