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

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

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 网