前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NDK OpenGLES 3.0 开发(二):纹理映射

NDK OpenGLES 3.0 开发(二):纹理映射

作者头像
字节流动
发布于 2020-06-03 02:17:19
发布于 2020-06-03 02:17:19
1.1K00
代码可运行
举报
文章被收录于专栏:字节流动字节流动
运行总次数:0
代码可运行

什么是纹理?

现实生活中,纹理(Texture)最通常的作用是装饰 3D 物体,它就像贴纸一样贴在物体表面,丰富了物体的表面和细节。

在 OpenGLES 开发中,纹理除了用于装饰物体表面,还可以用来作为存储数据的容器

那么在 OpenGLES 中,纹理实际上是一个可以被采样的复杂数据集合,是 GPU 的图像数据结构,纹理分为 2D 纹理、 立方图纹理和 3D 纹理。

2D 纹理是 OpenGLES 中最常用和最常见的纹理形式,是一个图像数据的二维数组。纹理中的一个单独数据元素称为纹素或纹理像素。

立方图纹理是一个由 6 个单独的 2D 纹理面组成的纹理。立方图纹理像素的读取通过使用一个三维坐标(s,t,r)作为纹理坐标。

3D 纹理可以看作 2D 纹理作为切面的一个数组,类似于立方图纹理,使用三维坐标对其进行访问。

什么是纹理映射?

在 OpenGLES 中,纹理映射就是通过为图元的顶点坐标指定恰当的纹理坐标,通过纹理坐标在纹理图中选定特定的纹理区域,最后通过纹理坐标与顶点的映射关系,将选定的纹理区域映射到指定图元上。

纹理映射也称为纹理贴图,简单地说就是将纹理坐标(纹理坐标系)所指定的纹理区域,映射到顶点坐标(渲染坐标系或OpenGLES 坐标系)对应的渲染区域。

纹理坐标系

4 个纹理坐标分别为 T0(0,0),T1(0,1),T2(1,1),T3(1,0)。

渲染(屏幕)坐标系

4 个纹理坐标对于的顶点坐标分别为

V0(-1,0.5),V1(-1, -0.5),V2(1,-0.5),V3(1,0.5)。

由于 OpenGLES 绘制是以三角形为单位的,设置绘制的 2 个三角形为 V0V1V2 和 V0V2V3。

当我们调整纹理坐标的顺序保持顶点坐标的顺序不变,如 T0T1T2T3 -> T1T2T3T0 ,绘制后将得到一个顺时针旋转 90 度的纹理贴图。所以调整纹理坐标和顶点坐标的对应关系可以实现纹理图简单的旋转。

纹理映射的简单实现

纹理映射的一般步骤:

  • 生成纹理,编译链接着色器程序
  • 确定纹理坐标及对应的顶点坐标
  • 加载图像数据到纹理,加载纹理坐标和顶点坐标到着色器程序
  • 绘制

生成纹理并加载图像数据到纹理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//生成一个纹理,将纹理 id 赋值给 m_TextureId
glGenTextures(1, &m_TextureId); 

//将纹理 m_TextureId 绑定到类型 GL_TEXTURE_2D 纹理
glBindTexture(GL_TEXTURE_2D, m_TextureId);

//设置纹理 S 轴(横轴)的拉伸方式为截取
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
//设置纹理 T 轴(纵轴)的拉伸方式为截取
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

//设置纹理采样方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

//加载 RGBA 格式的图像数据
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_RenderImage.width, m_RenderImage.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_RenderImage.ppPlane[0]);

对纹理采样的片元着色器脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#version 300 es                                     
precision mediump float;                            
in vec2 v_texCoord;                                 
layout(location = 0) out vec4 outColor;             
uniform sampler2D s_TextureMap; //声明采用器                     
void main()                                         
{
  // texture() 为内置的采样函数,v_texCoord 为顶点着色器传进来的纹理坐标
  // 根据纹理坐标对纹理进行采样,输出采样的 rgba 值(4维向量)                                                  
  outColor = texture(s_TextureMap, v_texCoord);      
}                                                   

简单实现代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 生成纹理,编译链接着色器程序
void TextureMapSample::Init()
{
    //create RGBA texture
    glGenTextures(1, &m_TextureId);
    glBindTexture(GL_TEXTURE_2D, m_TextureId);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, GL_NONE);

    char vShaderStr[] =
            "#version 300 es                            \n"
            "layout(location = 0) in vec4 a_position;   \n"
            "layout(location = 1) in vec2 a_texCoord;   \n"
            "out vec2 v_texCoord;                       \n"
            "void main()                                \n"
            "{                                          \n"
            "   gl_Position = a_position;               \n"
            "   v_texCoord = a_texCoord;                \n"
            "}                                          \n";

    char fShaderStr[] =
            "#version 300 es                                     \n"
            "precision mediump float;                            \n"
            "in vec2 v_texCoord;                                 \n"
            "layout(location = 0) out vec4 outColor;             \n"
            "uniform sampler2D s_TextureMap;                     \n"
            "void main()                                         \n"
            "{                                                   \n"
            "  outColor = texture(s_TextureMap, v_texCoord);     \n"
            "}                                                   \n";

    m_ProgramObj = GLUtils::CreateProgram(vShaderStr, fShaderStr, m_VertexShader, m_FragmentShader);
    if (m_ProgramObj)
    {
        m_SamplerLoc = glGetUniformLocation(m_ProgramObj, "s_TextureMap");
    }
    else
    {
        LOGCATE("TextureMapSample::Init create program fail");
    }

}

// 加载图像数据、纹理坐标和顶点坐标数据,绘制实现纹理映射
void TextureMapSample::Draw(int screenW, int screenH)
{
    LOGCATE("TextureMapSample::Draw()");

    if(m_ProgramObj == GL_NONE || m_TextureId == GL_NONE) return;
    GLfloat verticesCoords[] = {
            -1.0f,  0.5f, 0.0f,  // Position 0
            -1.0f, -0.5f, 0.0f,  // Position 1
            1.0f, -0.5f, 0.0f,  // Position 2
            1.0f,  0.5f, 0.0f,  // Position 3
    };

    GLfloat textureCoords[] = {
            0.0f,  0.0f,        // TexCoord 0
            0.0f,  1.0f,        // TexCoord 1
            1.0f,  1.0f,        // TexCoord 2
            1.0f,  0.0f         // TexCoord 3
    };

    GLushort indices[] = { 0, 1, 2, 0, 2, 3 };

    //upload RGBA image data
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_TextureId);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_RenderImage.width, m_RenderImage.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_RenderImage.ppPlane[0]);
    glBindTexture(GL_TEXTURE_2D, GL_NONE);

    // Use the program object
    glUseProgram (m_ProgramObj);

    // Load the vertex position
    glVertexAttribPointer (0, 3, GL_FLOAT,
                            GL_FALSE, 3 * sizeof (GLfloat), verticesCoords);
    // Load the texture coordinate
    glVertexAttribPointer (1, 2, GL_FLOAT,
                            GL_FALSE, 2 * sizeof (GLfloat), textureCoords);

    glEnableVertexAttribArray (0);
    glEnableVertexAttribArray (1);

    // Bind the RGBA map
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_TextureId);

    // Set the RGBA map sampler to texture unit to 0
    glUniform1i(m_SamplerLoc, 0);

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

}

结果图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节流动 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AI 数据观 | 生成式人工智能加速发展中,实时数据能否再添一把火?
随着算法、计算等的突破,生成式人工智能持续从实验室走入现实,人们对这项技术的预期也在不断升级,生成式 AI 技术的发展正在为各行各业插上想象的翅膀。
Tapdata
2024/06/18
1610
自适应应用程序如何在人工智能新时代释放创新
我们正站在生成式人工智能 (GenAI) 革命的边缘。根据 Couchbase 的 最新研究,约 98% 的组织为 2024 年制定了特定的 GenAI 目标——占去年和 2024 年数字化现代化支出的近三分之一。我们的调查显示,除了许多其他宣扬的好处外,首席信息官对提高生产力、快速原型制作和客户体验 (CX) 改进的前景感到兴奋。但现有的 IT 基础设施能否支持大规模人工智能项目?
云云众生s
2024/05/22
2010
列式存储:开发人员实时分析的关键
将运营分析和实时分析功能融合到一个数据库平台中,消除了开发人员使用多个数据存储带来的摩擦。
云云众生s
2024/09/30
1330
2018数据库技术发展趋势
当前,正由IT时代进入DT时代,随着移动互联网、物联网的发展,企业正产生大量的数据,而数据的存储和组织离不开数据库技术,更多的公司意识到了数据能够为公司带来商业利益,于是如何管理和利用好数据已经变得越来越重要。
田帅萌
2018/09/14
1.2K0
2018数据库技术发展趋势
数据库的前世今生
被称之为基础软件三驾马车之一的数据库,在经历了层次型和网状型、关系型数据型库以及更加强大的数据管理功能等三个时期之后,其在未来的发展历程中还有哪些更多的可能性?
数据猿
2019/11/20
4840
数据库的前世今生
​深度解读腾讯云云数据库:赋能数据管理与业务创新
在当今的数字化时代,数据已成为企业最重要的资产之一,如何高效、安全地存储、管理和利用这些数据,是每一个开发者和企业都需要面对的挑战。腾讯云作为领先的云计算平台,其云数据库产品为各类企业和开发者提供了强大的数据管理解决方案,不仅提升了数据的存储和处理效率,还在多个业务场景中展现了广泛的应用价值。本文将围绕腾讯云云数据库的产品能力、应用场景、业务价值和技术原理进行深入解析,并为新手开发者提供操作指引。
凯子坚持C
2024/10/21
2670
数据库新闻速递 Mongodb 不示弱添加向量搜索功能,全力打造开发人员最喜爱的数据库
年MongoDB试图扩大其用户群,包括传统的数据库专业人员,但现在公司转变方向,为其NoSQL Atlas数据库服务(DBaaS)添加功能,将其打造成更完整的数据平台,以支持开发者构建生成式人工智能应用程序。
AustinDatabases
2023/09/06
3100
数据库新闻速递  Mongodb 不示弱添加向量搜索功能,全力打造开发人员最喜爱的数据库
构建可靠的GenAI应用的5个最佳实践
Apache Kafka 如何作为 Elemental Cognition 中可信 GenAI 解决方案的支柱。
云云众生s
2024/06/06
1830
智能客服的演变:从传统到向量数据库的新时代
国产数据库的发展在21世纪初取得了显著的进展。根据不完全统计,目前在国内已有超过300种不同的数据库在案。这一现象在40年前几乎是不可想象的,标志着中国在数据库领域取得了巨大的突破和多样化选择。对于对老一辈的故事或数据库发展史充满兴趣的朋友们,我强烈推荐观看纪录片《中国数据库的前世今生》。虽然是纪录片形式,但内容生动有趣,非常值得一看。
努力的小雨
2024/08/20
4470
图灵奖得主回顾与展望:数据库发展 60 年,AI 颠覆在即?
文章概要:数据库领域的两位重量级人物 Michael Stonebraker 和 Andrew Pavlo 联合发表论文,以 20 年为周期洞悉数据库产业发展,盘点数据库领域的发展,本文是第二篇(https://db.cs.cmu.edu/papers/2024/whatgoesaround-sigmodrec2024.pdf),第一篇发表于 2004 年(https://books.google.com/books?hl)。文章结合近 2 年来 AI 蓬勃发展,给出了非常具体的辛辣“评论”。两位大神作者,帮助读者拨开迷雾,了解数据库领域发展的脉络,帮助读者看清数据技术的发展路线。Michael Stonebraker 和 Andrew Pavlo 的总结很有洞见,但笔者不完全同意文中对未来的预测观点,同时认为支撑 RDBMS 和 SQL 的核心支柱正在发生动摇:AI 的出现正在撼动数据库领域的“传统”模式。未来的数据架构和模式的演进,有更多可能性等待业界学者和产研专家们发掘。
深度学习与Python
2024/07/24
2700
图灵奖得主回顾与展望:数据库发展 60 年,AI 颠覆在即?
向量数据库:AI智能体创新的基石
未来数年,向量数据库的增长势头丝毫没有减弱的迹象,Forrester 预测,到 2026 年,大多数组织都将在生产环境中使用向量数据库。然而,向量数据库及其面临的挑战将发生巨大变化,尤其是在大规模使用的情况下。如今,这在向量数据库在企业采用 AI 智能体中所扮演的角色中尤为明显。
云云众生s
2025/01/26
1220
如何选择合适的NoSQL数据库
与传统的表格(或SQL)数据库相比,NoSQL数据库为软件开发人员和其他用户提供了更高的运行速度和更高的灵活性。
银河1号
2019/04/12
2.9K0
2018云、大数据、人工智能将上演“三国鼎立”?
虽然我们喜欢新技术,但一般的企业所有者、IT买家和软件开发人员对这一巨大的创新不太了解,不知道如何将其转化为商业价值。我们将在2018年看到一些趋势,他们的重点将是使新技术变得容易和可消费。   集成平台和一切都变成了无服务器计算   亚马逊和其他云服务提供商正在竞相获取和维护市场份额,因此他们不断提高抽象和跨服务集成的水平,以提高开发人员的生产力,并加强客户的本地化。我们看到亚马逊推出了新的数据库服务,并在上个月的AWS峰会上全面发布了整合人工智能图书馆和工具。它也开始区分不同形式的服务器:AWS Lam
BestSDK
2018/03/02
7690
AI需要更多,不仅仅是向量数据库
AI 数据库是一个多功能平台,它管理结构化和非结构化数据,并将 AI 模型应用于各种数据格式。
云云众生s
2024/09/07
1680
构建基于事件的GenAI应用
我从事人工智能工作近 20 年,应用的技术涵盖预测建模、知识工程和符号推理。AI 的巨大潜力一直感觉十分明显,但其广泛应用似乎总是还有几年才能到来。然而,以当前的生成式 AI(GenAI)技术作为体现,这一次感觉不同。
云云众生s
2024/03/28
2170
构建基于事件的GenAI应用
AI项目的十大向量数据库解决方案
探索AI项目十大向量数据库:Pinecone、Chroma、Weviate、Milvus、Faiss等,涵盖开源的Qdrant、Pgvector、ClickHouse、OpenSearch和Deep Lake。它们利用ANN算法高效处理高维向量,应用于LLM、推荐系统、图像识别等云原生场景,助力企业实现AI驱动的数据分析与相似性搜索。
云云众生s
2025/03/18
2940
为什么AI Agent需要一个运营数据库
一个专门为速度、可扩展性和低延迟而设计的平台,确保 AI 代理能够有效地收集、处理和交付上下文丰富的可观测性结果。
云云众生s
2025/02/15
990
向量数据库:人工智能时代的数据管理革命
在人工智能时代,向量数据库已成为数据管理和AI模型不可或缺的一部分。向量数据库是一种专门设计来存储和查询向量嵌入数据的数据库。这些向量嵌入是AI模型用于识别模式、关联和潜在结构的关键数据表示。随着AI和机器学习应用的普及,这些模型生成的嵌入包含大量属性或特征,使得它们的表示难以管理。这就是为什么数据从业者需要一种专门为处理这种数据而开发的数据库,这就是向量数据库的用武之地。
用户3578099
2024/05/18
4180
向量数据库:人工智能时代的数据管理革命
《自建数据库VS云数据库》
在当今的信息化时代,数据的存储与管理变得至关重要。对于企业和开发者来说,选择合适的数据库解决方案是确保业务顺利运行的关键。本文将对自建数据库与云数据库进行详细介绍,并结合实际案例帮助初学者了解两者的区别、优势与适用场景。
AiCharm
2024/08/11
1740
《自建数据库VS云数据库》
AI堆栈的演变:从基础到代理
AI 技术栈,包含编程语言、模型、LLM 框架、数据库等,能够快速大规模构建 AI 应用。
云云众生s
2024/07/28
2010
AI堆栈的演变:从基础到代理
推荐阅读
相关推荐
AI 数据观 | 生成式人工智能加速发展中,实时数据能否再添一把火?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验