android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组

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

OpenGL ES 3.0学习实践

目录

顶点属性

顶点数据也称作顶点属性,指定每个顶点的数据。如果你想要绘制固定颜色的三角形,可以指定一个常量值,用于三角形的全部3个顶点。但是,组成三角形的3个顶点的位置不同,所以我们指定一个顶点数组来存储3个位置值。

顶点属性数据可以用一个顶点数组对每个顶点指定,也可以将一个常量值用于一个图元的所有顶点。
所有OpenGL ES 3.0实现必须支持最少16个顶点属性。

査询OpenGL ES 3.0实现真正支持的顶点属性的准确数:

int[] maxVertexAttribs = new int[1];
GLES30.glGetIntegerv(GLES30.GL_MAX_VERTEX_ATTRIBS, maxVertexAttribs, 0);
常量顶点属性

常量顶点属性对于一个图元的所有顶点都相同,所以对一个图元的所有顶点只需指定一个值。可以用如下任何一个函数指定:

void GLES30.glVertexAttrib1f(int index, float x);
void GLES30.glVertexAttrib2£(int index, float x, float y);
void GLES30.glVertexAttrib3£(int index, float x, float y, float z);
void GLES30.glVertexAttrib4£(int index, float x, float y, float z, float w);
void GLES30.glVertexAttrib1fv (int index, float[] values,int offset);
void GLES30.glVertexAttrib2£v(int index, float[] values,int offset);
void GLES30.glVertexAttrib3£v(int index, float[] values,int offset);
void GLES30.glVertexAttrib4£v(int index, float[] values,int offset);

其中glVertexAttrib*方法用于加载index指定的通用顶点属性。

  • glVertexAttrib1f和glVertexAttrib1fv在通用顶点属性中加载(x, 0.0, 0.0, 1.0)。
  • glVertexAttrib2f和glVertexAttrib2fv在通用顶点属性中加载(x, y, 0.0, 1.0)。
  • glVertexAttrib3f和glVertexAttrib3fV在通用顶点属性中加载(x, y, z, 1.0)。
  • glVertexAltrib4f和glVertexAttrib4fv在通用顶点属性中加载(x, y, z, w)。
顶点数组

顶点数组指定每个顶点的属性,是保存在应用程序地址空间(OpenGLES称为客户空间)的缓冲区。它们作为顶点缓冲对象的基础,提供指定顶点属性数据的一种高效、灵活的手段,顶点数组用glVertexAttribPointer或glVertexAttribIPointer指定。

分配和存储顶点属性数据有两种常用的方法:

  • 在一个缓冲区中存储顶点属性:这种方法称为结构数组。结构表示顶点的所有属性,每个顶点有一个属性的数组。
  • 在单独的缓冲区中保存每个顶点属性:这种方法称为数组结构。

这里要注意的是glVertexAttribPointer的倒数第二个参数stride

每个顶点由size指定的顶点属性分量顺序存储。stride指定顶点索引 I 和(I+1)表示的顶点数据之间的位移。如果stride为0,则每个顶点的属性数据顺序存储。如果stride大于0,则使用该值作为获取下一个索引表示的顶点数据的跨距。

现在假定每个顶点有5个顶点属性:位置和颜色,这些属性一起保存在为所有顶点分配的一个缓冲区中。顶点位置属性以2个浮点数的向量的形式指定,顶点颜色以3个浮点数向量的形式指定。

这个缓冲区的内存布局如下图所示:

缓冲区的跨距(STRIDE)为组成顶点的所有属性总大小(8个字节用于位置,12个字节用于颜色),等于5个浮点数即:20个字节

下面来实践一下用glVertexAttribPointer指定顶点属性。

还是基于之前的工程项目,新建VertexPointerRenderer.java文件

/**
 * @anchor: andy
 * @date: 2018-11-02
 * @description:
 */
public class VertexPointerRenderer implements GLSurfaceView.Renderer {

    private final FloatBuffer vertexBuffer;

    private int mProgram;

    /**
     * 位置顶点属性的大小
     * 包含(x,y)
     */
    private static final int VERTEX_POSITION_SIZE = 2;

    /**
     * 颜色顶点属性的大小
     * 包含(r,g,b)
     */
    private static final int VERTEX_COLOR_SIZE = 3;

    /**
     * 浮点型数据占用字节数
     */
    private static final int BYTES_PER_FLOAT = 4;

    /**
     * 跨距
     */
    private static final int VERTEX_ATTRIBUTES_SIZE = (VERTEX_POSITION_SIZE + VERTEX_COLOR_SIZE) * BYTES_PER_FLOAT;

    /**
     * 点的坐标
     */
    private float[] vertexPoints = new float[]{
            //前两个为坐标,后三个为颜色
            0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
            -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
            0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
            0.5f, 0.5f, 1.0f, 1.0f, 1.0f,
            -0.5f, 0.5f, 1.0f, 1.0f, 1.0f,
            -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
            //两个点的顶点属性
            0.0f, 0.25f, 0.5f, 0.5f, 0.5f,
            0.0f, -0.25f, 0.5f, 0.5f, 0.5f,
    };

    public VertexPointerRenderer() {
        //分配内存空间,每个浮点型占4字节空间
        vertexBuffer = ByteBuffer.allocateDirect(vertexPoints.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        //传入指定的坐标数据
        vertexBuffer.put(vertexPoints);
        vertexBuffer.position(0);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //设置背景颜色
        GLES30.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
        //编译
        final int vertexShaderId = ShaderUtils.compileVertexShader(ResReadUtils.readResource(R.raw.vertex_pointer_shader));
        final int fragmentShaderId = ShaderUtils.compileFragmentShader(ResReadUtils.readResource(R.raw.fragment_pointer_shader));
        //鏈接程序片段
        mProgram = ShaderUtils.linkProgram(vertexShaderId, fragmentShaderId);
        //使用程序片段
        GLES30.glUseProgram(mProgram);

        vertexBuffer.position(0);
        GLES30.glVertexAttribPointer(0, VERTEX_POSITION_SIZE, GLES30.GL_FLOAT, false, VERTEX_ATTRIBUTES_SIZE, vertexBuffer);
        //启用顶点属性
        GLES30.glEnableVertexAttribArray(0);
        //定位本地内存的位置
        vertexBuffer.position(VERTEX_POSITION_SIZE);
        GLES30.glVertexAttribPointer(1, VERTEX_COLOR_SIZE, GLES30.GL_FLOAT, false, VERTEX_ATTRIBUTES_SIZE, vertexBuffer);

        GLES30.glEnableVertexAttribArray(1);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES30.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);

        //绘制矩形
        GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 6);

        //绘制两个点
        GLES30.glDrawArrays(GLES30.GL_POINTS, 6, 2);

    }
}

顶点着色器

#version 300 es
layout (location = 0) in vec4 vPosition;
layout (location = 1) in vec4 aColor;
out vec4 vColor;
void main() {
     gl_Position  = vPosition;
     gl_PointSize = 10.0;
     vColor = aColor;
}

片段着色器

#version 300 es
precision mediump float;
in vec4 vColor;
out vec4 fragColor;
void main() {
     fragColor = vColor;
}

注意:OpenGLES 3.0建议应用程序使用顶点缓冲区对象,避免使用客户端顶点数组,以实现最佳性能,在OpenGLES3.0中,总是建议使用顶点缓冲区对象。

性能提示

OpenGLES 3.0硬件实现,在大部分情况下,答案是结构数组。因为每个顶点的属性数据可以顺序方式读取,这最有可能造成高效的内存访问模式。使用结构数组的缺点在应用程序需要修改特定属性时变得很明显。如果顶点属性数据的一个子集需要修改(例如:纹理坐标),这将造成顶点缓冲区的跨距更新。当顶点缓冲区以缓冲区对象的形式提供时,需要重新加载整个顶点属性缓冲区。可以通过将动态的顶点属性保存在单独的 缓冲区来避免这种效率低下的情况。

在常置顶点属性和顶点数组之间选择

应用程序可以让OpenGL ES使用常量数据或者来自顶点数组的数据,glEnableVertexAttribArray和glDisableVertexAttribArray方法分别用于启用和禁用通用顶点属性数组。如果某个通用属性索引的顶点属性数组被禁用,将使用为该索引指定的常量顶点属性数据。

选择常量或者顶点数组顶点属性:

还是基于之前的工程项目,新建EnableVertexRenderer.java文件

/**
 * @anchor: andy
 * @date: 2018-11-02
 * @description:
 */
public class EnableVertexRenderer implements GLSurfaceView.Renderer {

    private final FloatBuffer vertexBuffer, colorBuffer;

    private int mProgram;

    /**
     * 点的坐标
     */
    private float[] vertexPoints = new float[]{
            0.0f, 0.5f, 0.0f,
            -0.5f, -0.5f, 0.0f,
            0.5f, -0.5f, 0.0f
    };

    private float[] vertexColors = new float[]{
            0.5f, 0.5f, 0.8f, 1.0f
    };

    public EnableVertexRenderer() {
        //分配内存空间,每个浮点型占4字节空间
        vertexBuffer = ByteBuffer.allocateDirect(vertexPoints.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        //传入指定的坐标数据
        vertexBuffer.put(vertexPoints);
        vertexBuffer.position(0);
        //为颜色数据分配本地内存空间
        colorBuffer = ByteBuffer.allocateDirect(vertexColors.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        //传入指定的坐标数据
        colorBuffer.put(vertexColors);
        colorBuffer.position(0);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //设置背景颜色
        GLES30.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
        //编译
        final int vertexShaderId = ShaderUtils.compileVertexShader(ResReadUtils.readResource(R.raw.vertex_enable_shader));
        final int fragmentShaderId = ShaderUtils.compileFragmentShader(ResReadUtils.readResource(R.raw.fragment_enable_shader));
        //鏈接程序片段
        mProgram = ShaderUtils.linkProgram(vertexShaderId, fragmentShaderId);
        //使用程序片段
        GLES30.glUseProgram(mProgram);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES30.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 gl) {

        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
        //颜色数据都是一致的
        GLES30.glVertexAttrib4fv(1, colorBuffer);

        //获取位置的顶点数组
        GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, vertexBuffer);
        //启用位置顶点属性
        GLES30.glEnableVertexAttribArray(0);

        //绘制矩形
        GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 3);

        //禁用顶点属性
        GLES30.glDisableVertexAttribArray(0);
    }
}

顶点着色器

#version 300 es
layout (location = 0) in vec4 vPosition;
layout (location = 1) in vec4 aColor;
out vec4 vColor;
void main() {
     gl_Position  = vPosition;
     gl_PointSize = 10.0;
     vColor = aColor;
}

片段着色器

#version 300 es
precision mediump float;
in vec4 vColor;
out vec4 fragColor;
void main() {
     fragColor = vColor;
}

上面的注释已经很清楚了,顶点的颜色是一个常量值,直接使用glVertexAttrib4fv指定,不启用顶点属性数组1,而位置属性通过glVertexAttribPointer获取,并且通过glEnableVertexAttribArray启用,用来处理不同的位置坐标。

顶点着色器中声明顶点属性

在OpenGL ES 3.0顶点着色器中,变量通过使用in限定符声明为顶点属性。属性变量也可以选择包含一个布局限定符,提供属性索引。

layout(location = 0) in vec4 apposition;
layout(location = 1) in vec2 a_texcoord;
layout(location = 2) in vec3 a_normal;

in限定符只能用于数据类型float、vec2、vec3、vec4、int、ivec2、ivec3、ivec4、uint、 uvec2、uvec3、uvec4、mat2、mat2x2、mat2x3、mat2x4、mat3、mat3x3、mat3x4、mat4、 mat4x2和mat4x3。属性变量不能声明为数组或者结构。

OpenGL ES 3.0实现支持GL_MAX_VERTEX_ATTRIBS四分量向量顶点属性。声明为标量、二分量向量或者三分量向量的顶点属性将被当作一个四分量向量属性计算。声明为二维、三维或者四维矩阵的顶点属性将分别被作为2、3或者4个四分量向量属性计算。与编译器自动打包的统一变量及顶点着色器输出/片段着色器输入变量不同,属性不进行打包。在用小于四分量向量的尺寸声明顶点属性时请小心考虑,因为可用的最少顶点属性是有限的资源。将它们一起打包到单个四分量属性可能比在顶点着色器中声明为单个顶点属性更好。

注意:在顶点着色器中声明为顶点属性的变量是只读变量,不能修改。属性可以在顶点着色器内部声明,但是如果没有使用,就不会被认为是活动属性,从而不会被计入限制。如果在顶点着色器中使用的属性数量大于GL_MAX_VERTEX_ ATTRIBS,这个顶点着色器就无法链接。

将顶点属性绑定到顶点着色器中的属性变量

顶点属性索引绑映射到顶点着色器中的一个属性变量名称,有三种方法:

  • 索引可以在顶点着色器源代码中用layout (location = N)限定符指定,推荐使用这种方式:
      将属性绑定到一个位置的最简单方法是简单地使用layout(location = N)限定符,这种方法需要的代码最少。
  • OpenGL ES 3.0将通用顶点属性索引绑定到属性名称。
  • 应用程序将顶点属性索引绑定到属性名称。

glBindAttribLocation方法可用于将通用顶点属性索引绑定到顶点着色器中的一个属性变量。这种绑定在下一次程序链接时生效,不会改变当前链接的程序中使用的绑定。这个方法要在link program程序之前调用。

void GLES30.glBindAttribLocation(int program,int index,String name);

如果之前绑定了name,则它所指定的绑定被索引代替。glBindAttribLocation甚至可以在顶点着色器连接到程序对象之前调用,因此,这个调用可以用于绑定任何属性名称。不存在的属性名称或者在连接到程序对象的顶点着色器中不活动的属性将被忽略。

public static int linkProgram(int vertexShaderId, int fragmentShaderId) {
        final int programId = GLES30.glCreateProgram();
        if (programId != 0) {
            //将顶点着色器加入到程序
            GLES30.glAttachShader(programId, vertexShaderId);
            //将片元着色器加入到程序中
            GLES30.glAttachShader(programId, fragmentShaderId);

			//绑定自定义的属性索引
            GLES30.glBindAttribLocation(programId, 5, "aColor");

            //链接着色器程序
            GLES30.glLinkProgram(programId);
            final int[] linkStatus = new int[1];

            GLES30.glGetProgramiv(programId, GLES30.GL_LINK_STATUS, linkStatus, 0);
            if (linkStatus[0] == 0) {
                String logInfo = GLES30.glGetProgramInfoLog(programId);
                System.err.println(logInfo);
                GLES30.glDeleteProgram(programId);
                return 0;
            }
            return programId;
        } else {
            //创建失败
            return 0;
        }
    }

在链接阶段,OpenGL ES 3.0实现为每个属性变量执行如下操作:

对于每个属性变量,检查是否已经通过glBindAttribLocation指定了绑定。如果指定了一个绑定,则使用指定的对应属性索引。否则,OpenGL ES实现将分配一个通用顶点属性索引。

int GLES30.glGetAttribLocation(int program,String name);

glGetAttribLocation根据属性名称返回属性索引。

11-08 12:38:49.534 32752-640/com.onzhou.opengles.shader D/EnableVertexRenderer: color location = 5

项目地址:
https://github.com/byhook/opengles4android

参考:
《OpenGL ES 3.0 编程指南第2版》
《OpenGL ES应用开发实践指南Android卷》

Android显示系统(02)- OpenGL ES - 概述 为了介绍清楚Android显示系统,得从实战的目的花几篇文章介绍下OpenGL ES,对OpenGL ES熟悉的可以直接跳过这几章。OpenGL ES是OpenGL的精简版,专门用于嵌入式平台,因为嵌入式平台硬件资源有限,做了定向的优化。而OpenGL就是定义了一套渲染API标准(注意不是库),方便不同操作系统,不同硬件对渲染进行统一。目的就是一个:将3D世界转换到2D屏幕显示出来,比如以前小学课文中有一篇叫做《画杨桃》,3D空间中的杨桃就像我们设计的一个模型,但是,从不同视角去看,在2D屏幕上形成的一张画 阅读详情

相关推荐

OpenGL ES 2.0笔记2——顶点、坐标、图元

顶点 在OpenGL中,所有的东西的结构都是从一个顶点开始的。 所谓顶点,就是一个几何图形的拐点。在介绍顶点之前,我们首先介绍下OpenGL坐标。 OpenGL坐标系 如果有会Android开发的朋友,一定会默认为从屏幕的左上角开始,水平往右是x轴,竖直向下是y轴。 但是在OpenGL中是不同的,OpenGL是从显示视窗的正中心是中心,也就是(0,0)(0, 0)(0,0),而屏幕最左边的x轴坐标...

小柯基_littlecogi的博客 729

Android OpenGL ES 3.0 开发 :3D实例化(Instancing 3D)

OpenGL ES 实例化(Instancing)是一种只调用一次渲染函数就能绘制出很多物体的技术,可以实现将数据一次性发送给 GPU ,告诉 OpenGL ES 使用一个绘制函数,将这些数据绘制成多个物体。表示当前正在绘制实例的 ID ,每个实例对应一个唯一的 ID ,通过这个 ID 可以轻易实现基于一个物体而绘制出位置、大小、形状或者颜色不同的多个物体(实例)。,表示需要渲染的实例数量,调用完实例化绘制函数后,我们便将绘制数据一次性发送给GPU,然后告诉它该如何使用一个函数来绘制这些实例。

风的轨迹 1913

Android Studio + OpenGL ES 学习记录

Android Studio + OpenGL ES 学习记录 OpenGL是一种应用程序编程接口,它是一种可以对图形硬件设备特性进行访问的软件库,而OpenGL ES是OpenGL的子集,针对手机、PDA和游戏主机嵌入式设备而设计。OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性,剩下最核心有用的部分。 简介 OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用

huhfairy的博客 3016

LearnOpenGL - Android OpenGL ES 3.0 基础特效实现

本章我们学习下如何来写一个基础特效,本文所有代码你可以在找到本文介绍了 8 中基础特效的实现逻辑,所有代码可以在找到。

记录学习的过程 2042

Android OpenGL es 纹理坐标设定与贴图规则

当opengl对一个四方形进行贴图时,会定义纹理贴图坐标,一串数组,相信初学openggl es者看到后会很头疼,不知道写得是什么东西。现在就将我的研究成果与大家分享下!当纹理映射启动后绘图时,你必须为OpenGL ES提供其他数据,即顶点数组中各顶点的纹理坐标。纹理坐标定义了图像的哪一部分将被映射到多边形。它的工作方式有点奇怪。相信初学者看到后会很头疼,不知道写得是什么东西。现在就将我的研究成果与大家分享下!下面看下在android平台下Opengl纹理系统坐标,左下角为原点。我们现在讨论怎样使用这些纹理

cjkwin的专栏 3万+

Android显示系统(06)- OpenGL ES - VBO和EBO和VAO

本文主要介绍了VBO、EBO、VAO,大家掌握了基本概念和使用之后,其实也就掌握了一种产品性能优化的思路。

Ziwubiancheng的博客 2044

Android OpenGL ES 3.0开发实战(01):Android OpenGL ES 3.0 Native开发环境搭建

Android OpenGL ES 3.0开发实战

Scott_S的博客 2675

OpenGL ES 3.0 开发(一):绘制一个三角形

该原创文章首发于微信公众号:字节流动 什么是 OpenGLES OpenGLES 全称 OpenGL for Embedded Systems ,是三维图形应用程序接口 OpenGL 的子集,本质上是一个跨编程语言、跨平台的编程接口规范,主要应用于嵌入式设备,如手机、平板等。由科纳斯(Khronos)组织定义和推广,科纳斯是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。 O...

字节流动 8万+

android平台下OpenGL ES 3.0着色语言基础知识(下)

OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘制圆点、直线和三角形 android平台下OpenGL ES 3.0绘制彩色三角形 android平台下OpenGL ES 3.0从矩形中看矩阵和坐标系 android平台下OpenGL ES 3....

handy周 2285

量化策略缺数据?一份QMT/PTrade免费数据清单与特殊数据源QtFactor评测

本文为量化策略开发者提供QMT和PTrade平台的免费数据资源清单,并深度评测QtFactor在补充特色数据方面的价值。涵盖Tick级数据、Level2行情、资金流向等关键信息,帮助开发者在预算有限的情况下构建高效数据解决方案,特别适合打板策略和日内回转交易。

weixin_29058331的博客 416

智能优化算法-北方苍鹰优化算法(NGO)(附源码)

北方苍鹰优化算法 (Northern Goshawk Optimizer, NGO) 是一种基于群体智能的元启发式优化算法,它模拟了北方苍鹰(Northern Goshawk)的捕食行为、领地行为以及社交互动,用于解决复杂的优化问题。总之,NGO作为一种新颖的优化算法,在处理复杂优化问题方面展现出了潜力。随着进一步的研究和应用,NGO有望成为解决实际问题的有效工具。

w971656545的博客 1361

android平台下OpenGL ES 3.0实例详解顶点缓冲区对象(VBO)和顶点数组对象(VAO)

顶点缓冲区对象 顶点缓冲区对象(Vertex Buffer Object),简称VBO。如果不使用顶点缓冲区对象(VBO)则是将顶点、颜色、纹理坐标等数据存放在内存(客户内存)当中,在每次进行glDrawArxays或者gIDrawElements等绘图调用时,必须从客户内存复制到图形内存。而顶点缓冲区对象使OpenGL ES 3.0应用程序可以在高性能的图形内存中分配和缓存顶点数据,并从这个内存...

handy周 2849

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

android opengl 3.0,android平台下OpenGL ES 3.0从零开始

OpenGL ES 3.0学习实践android平台下OpenGL ES 3.0从零开始android平台下OpenGL ES 3.0绘制纯色背景android平台下OpenGL ES 3.0绘制圆点、直线和三角形android平台下OpenGL ES 3.0绘制彩色三角形android平台下OpenGL ES 3.0从矩形中看矩阵和正交投影android平台下OpenGL ES 3.0着色语言基...

weixin_35148943的博客 1244

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5729

nvprof:CUDA编程性能分析工具

NVIDIA提供了具有高性能计算的GPU产品,如何检验硬件的实际性能,写出高效的CUDA代码让算力加速卡物尽其用,那可以通过其配套提供的“护城河”软件工具链来检验和帮助发挥GPU的性能:nvprof。如下,对于将8192个A,B向量进行向量加法运算,即C[i] = A[i] + B[i],当软件设置不同的blocknum, threadnum时候,CUDA执行kernel的时间是不同的。比如如下命令,可以看到程序tmp1的总体性能,下面一行是打印gpu的执行时间情况。

Briwisdom的博客 3384

Android OpenGL ES详解——实例化

就像你所看到的,在合适的条件下,实例渲染对于你的显卡来说和普通渲染有很大不同。处于这个理由,实例渲染通常用来渲染草、草丛、粒子以及像这样的场景,基本上来讲只要场景中有很多重复物体,使用实例渲染都会获得好处。参考文章。

闲暇部落 1580

【人工智能】架构师必读:大模型时代的意图识别 (Intent Recognition) 四大技术流派与实践指南

意图识别没有“银弹”,选择哪种方案取决于具体的业务需求、数据积累以及成本预算。如果追求极简与低成本,BERT 是不二之选。如果业务极其复杂且依赖上下文,RAG 或 Agent 模式更合适。如果追求极致的稳定与效果,基于 LLM 的微调 + Function Calling 是目前的行业最佳实践。参考资源:基于 LLM 的意图识别解决方案(Embedding 相关课程章节)

奶爸的编程之路,也就一周冷个三天 702

opengles 顶点数组 android,android平台下OpenGL ES 3.0绘制圆点、直线和三角形

OpenGL ES 3.0学习实践android平台下OpenGL ES 3.0从零开始android平台下OpenGL ES 3.0绘制纯色背景android平台下OpenGL ES 3.0绘制圆点、直线和三角形android平台下OpenGL ES 3.0绘制彩色三角形android平台下OpenGL ES 3.0从矩形中看矩阵和正交投影android平台下OpenGL ES 3.0着色语言基...

weixin_36204513的博客 737

【专栏必读】王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记使用说明及章节导航

本文档汇总了王道考研408计算机网络和湖科大教书匠计算机网络课程的重点内容,包括计算机网络体系结构、物理层、数据链路层、网络层、传输层和应用层的详细讲解。通过ISO/OSI和TCP/IP模型,深入探讨了通信基础、介质访问控制、IP地址、TCP/UDP协议、流量控制和网络编程等关键概念。此外,还提供了Linux网络编程实践,帮助读者巩固理论知识

快乐江湖的博客 2万+

国科大作业考试资料-人工智能原理与算法-2024新编-第十一次作业整理

1、有一位教授想知道学生是否睡眠充足。每天,教授观察学生在课堂 上是否睡觉,并观察他们是否有红眼。教授获得如下的领域知识: (1)没有观察数据时,学生睡眠充足的先验概率为0.7。 (2)给定学生前一天睡眠充足为条件,学生在晚上睡眠充足的概率是0.8;如果前一天睡眠不充足,则是0.3。 (3)如果学生睡眠充足,则红眼的概率是0.2,否则是0.7。 (4)如果学生睡眠充足,则在课堂上睡觉的概率是0.1,否则是0.3。 将这些信息形式化为一个动态贝叶斯网络,使教授可以使用这个网络从观察序列中进行滤波和预

MatsumotoChrikk 1055

安卓进阶——OpenGL ES

本文系统介绍了OpenGL在2D和3D图形开发中的应用。2D部分重点阐述了OpenGL ES在Android平台的高性能优势、核心渲染管线(顶点处理、纹理映射、着色器编程)以及实现流程,包括GLSurfaceView配置和Renderer实现。3D部分深入讲解了坐标系转换、矩阵变换(MVP矩阵)、深度测试、光照模型等关键技术,并提供了3D场景渲染的实现框架。文章不仅覆盖了基础绘制方法,还介绍了纹理滤镜、粒子系统、帧缓冲等进阶技巧,为移动端图形开发提供了全面指导。通过系统学习这些内容,开发者可以实现...

Meteors.的博客 981

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

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

LearnOpenGL - Android OpenGL ES 3.0 绘制三角形

经过一段时间 OpenGL 的学习,我们已经掌握了如何使用 glwf 在桌面端绘制简单图形。现在让我们把目光投向移动端,看看如何在 Android 上使用 OpenGL 绘制图形。本文假设你对 Android 基础有所了解,并使用 Kotlin 编写示例 demo,项目的代码你可以在中找到。本文参考了以下资料Android OpenGL开发——图像绘制详解android平台下OpenGL ES 3.0实例详解顶点缓冲区对象(VBO)和顶点数组对象(VAO)

记录学习的过程 2268

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[OpenGL]从零开始写一个Android平台下的全景视频播放器——1.3 用OpenGL ES 2.0显示一张图片(上)

Github项目地址,欢迎star~!为了方便没有准备好梯子的同学,我把项目在优快云上打包下载,不过更新会慢一些回到目录解决变形问题要解决变形,我们需要引入Projection Matrix(投影矩阵)的概念,在OpenGL中,投影矩阵用来改变场景在屏幕上的显示方式(近大远小,平行投影等等)。 因为我们绘制的是二维平面,所以问题还是比较好解决的,假如我们的屏幕是16:9的(横屏情况),那么只要让

Martin的博客 4831

计算机控制技术及应用

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

android openGL ES详解(一)

主线程与GLSurfaceView:主线程负责的实例化、布局和生命周期管理,并通过特定方法(如queueEvent)与渲染线程进行通信。渲染线程与GLSurfaceView:渲染线程是内部维护的,专门用于执行OpenGL ES渲染命令的线程。渲染线程根据渲染器的指示,在需要时重新绘制场景。主线程与渲染线程:两者通过提供的机制(如queueEvent)进行通信,确保UI更新和渲染工作能够协调进行,避免阻塞主线程或造成渲染延迟。通过这种方式,

闲暇部落 3099

android平台下OpenGL ES 3.0给图片添加黑白滤镜

android平台下OpenGL ES 3.0给图片添加黑白滤镜

handy周 2020
上一篇: android平台下OpenGL ES 3.0着色语言基础知识(下)
下一篇: android平台下OpenGL ES 3.0实例详解顶点缓冲区对象(VBO)和顶点数组对象(VAO)
handy周
handy周 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄14年 507粉丝 240原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值