OpenGL非规则多边形(凹多边形,凸多边形)二维纹理映射(填充)

2024-06-08 16:58

本文主要是介绍OpenGL非规则多边形(凹多边形,凸多边形)二维纹理映射(填充),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近做项目需要实现二维平面对非规则多边形的纹理填充,要求纹理能够铺满任何形状的多边形。从网上找了一些二维纹理映射的方法。比如说:

glBindTexture(GL_TEXTURE_2D, furniture->GetImage2D()->GetTextureID())

glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(pt
1.x, pt1.y, pt1.z);
glTexCoord2f(0, 1);
glVertex3f(pt
2.x, pt2.y, pt2.z);
glTexCoord2f(1, 1);
glVertex3f(pt
3.x, pt3.y, pt3.z);
glTexCoord2f(1, 0);
glVertex3f(pt
4.x, pt4.y, pt4.z);
glEnd();

但是,这种方法有一定的局限性,它只能应用于四边形上,对于非规则的多边形并不适用。为了实现对非规则多边形的纹理映射,我采用一种新的方法,并且成功实现了此功能。由于项目比较大,功能融合到项目中,所以我只说明一下具体的实现思路。方法如下:

一、定义多边形三角化后的拓扑关系数据结构,用结构体TriangleInfo进行表示;

struct TriangleInfo
{
int m_iVertexNumber;//三角化后点的数目
glm::vec3* m_vVertice = NULL;//三角化后多边形上点的坐标
glm::vec3* m_vNormal = NULL;//三角化后多边形上点的法向
glm::vec2* m_vTexcoord = NULL;//三角化后多边形上点的纹理坐标
glm::ivec3* m_vTriangle = NULL;//三角后多边形上点的坐标对应的下边
}m_struTriangleInfo;

二、对多边形进行三角化,并把对应的点的拓扑关系加入到结构体TriangleInfo中:

(1)三角化多边形

使用Triangluation的三角化方法实现,这个接口已经做好了,是别人写好的代码。

网站链接如下:http://www.cs.cmu.edu/~quake/triangle.html

http://www.cs.cmu.edu/~quake/triangle.research.html

(2)构建点之间的拓扑结构

根据三角化后得到的TriangulateIO结构数据,对点的纹理坐标进行计算,并保存到结构体TriangleInfo

三、加载纹理,并绑定纹理对象;

四、将三角化后的多边形点的信息传入OpenGL渲染管线,进行绘制。

GLfloat curColor[4];
glGetFloatv(GL_CURRENT_COLOR, curColor);

glColor3f(1.0f, 1.0f, 1.0f);
int vertice_number = m_struTriangleInfo.m_iVertexNumber;
glm::vec3* vertices = m_struTriangleInfo.m_vVertice;
glm::vec2*  texcoords = m_struTriangleInfo.m_vTexcoord;
// enable and specify pointers to vertex arrays


if (vertices)
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
}

if (texcoords)
{
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
}

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureID);//TextureID是之前绑定的纹理对象
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
(float*)(&(vec4(1.0))));
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,
(float*)(&(vec4(0.1, 0.1, 0.1, 1.0))));

glDrawElements(GL_TRIANGLES, vertice_number, GL_UNSIGNED_INT, m_struTriangleInfo.m_vTriangle);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);


if (vertices)
{
glDisableClientState(GL_VERTEX_ARRAY);
}
if (texcoords)
{
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
glColor3f(curColor[0], curColor[1], curColor[2]);


通过这种方法,就可以实现任意多边形的纹理映射,图片效果如下:




这篇关于OpenGL非规则多边形(凹多边形,凸多边形)二维纹理映射(填充)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042769

相关文章

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<