美文网首页
OpenGL 给图形贴纹理(金字塔,隧道案例)

OpenGL 给图形贴纹理(金字塔,隧道案例)

作者: iOS_沧海一笑 | 来源:发表于2020-07-21 17:56 被阅读0次

前言:我们知道在OpenGL中,图形都是通过一个或多个三角形来绘制的,所以给图形贴纹理,我们就需要把图形拆分为多个三角形,通过三角形的各个顶点位置来算出纹理坐标,有了纹理坐标,我们就可以给图形贴纹理了。

金字塔图形的解析,我们可以分为两部分:

  • 底部四边形 = 三角形X + 三角形Y
  • 顶点坐标 vApex, 如图所示:
image.png

金字塔每个点的坐标如下:

顶点坐标:
vApex(0.0, 1.0, 0.0)
vBackLeft(-1.0,-1.0,-1.0)
vBackRight(1.0,-1.0,-1.0)
vFrontLeft(-1.0,-1.0,1.0)
vFrontRight(1.0,-1.0,1.0)

三角形X的坐标:
vBackLeft(-1.0,-1.0,-1.0)
vBackRight(1.0,-1.0,-1.0) 
vFrontRight(1.0,-1.0,1.0)

三角形Y的坐标:
vFrontLeft(-1.0,-1.0,1.0) 
vBackLeft(-1.0,-1.0,-1.0) 
vFrontRight(1.0,-1.0,1.0)

纹理坐标:
vApex(0.5, 1.0)
vBackLeft(0.0, 0.0)
vBackRight(1.0, 0.0)
vFrontLeft(0.0, 1.0) 
vFrontRight(1.0, 1.0)

给图形设置Mip贴图的方法:

//设置mip贴图基层 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0); 
//设置mip贴图最⼤层 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);

经过Mip贴图的纹理过滤如下图:

image.png

通过以上对图形顶点坐标的理解,我们用隧道案例代码来加以解释:

  1. 地板floorBatch几何坐标的计算:
image.png
    GLfloat z;
    floorBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    //Z表示深度,隧道的深度
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        floorBatch.Vertex3f(-10.0f, -10.0f, z);
        
        floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        floorBatch.Vertex3f(10.0f, -10.0f, z);
        
        floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        floorBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);
        
        floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        floorBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);
    }
    floorBatch.End();
  1. 天花板 ceilingBatch的几何坐标计算:
image.png
    ceilingBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        ceilingBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        ceilingBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);
        
        ceilingBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        ceilingBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);
        
        ceilingBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        ceilingBatch.Vertex3f(-10.0f, 10.0f, z);
        
        ceilingBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        ceilingBatch.Vertex3f(10.0f, 10.0f, z);
    }
    ceilingBatch.End();
  1. 左边墙壁leftWallBatch的几何坐标计算:
image.png
    leftWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        leftWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        leftWallBatch.Vertex3f(-10.0f, -10.0f, z);
        
        leftWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        leftWallBatch.Vertex3f(-10.0f, 10.0f, z);
        
        leftWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        leftWallBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);
        
        leftWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        leftWallBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);
    }
    leftWallBatch.End();
  1. 右边rightWallBatch的几何坐标计算:
image.png
    rightWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        rightWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        rightWallBatch.Vertex3f(10.0f, -10.0f, z);
        
        rightWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        rightWallBatch.Vertex3f(10.0f, 10.0f, z);
        
        rightWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        rightWallBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);
        
        rightWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        rightWallBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);
    }
    rightWallBatch.End();

总结,通过上面对图形拆解为多个三角形,计算每个顶点的坐标和纹理坐标,我们就可以对图形进行贴纹理,具体代码实现请点这里隧道

相关文章

  • OpenGL 给图形贴纹理(金字塔,隧道案例)

    前言:我们知道在OpenGL中,图形都是通过一个或多个三角形来绘制的,所以给图形贴纹理,我们就需要把图形拆分为多个...

  • OpenGL纹理坐标&&隧道案例(二)

    一.隧道案例效果 二.纹理坐标 纹理坐标主要是把图形映射到OpenGL中去,图形中每个顶点关联到对应的纹理坐标下,...

  • OpenGL 纹理隧道案例

    隧道示例程序使用了和纹理有关的内容,并在视觉上显示了不同的过滤器和贴图模式。 该示例程序在启动时加载3个纹理用于对...

  • OpenGL 纹理案例-隧道

    在学习了纹理之后,我们尝试着用纹理来实现一个类似于下图这样的隧道效果,并且让他可以通过键盘的上下键可以来进行前进和...

  • OpenGL纹理案例-隧道

    使用OpenGL常用的API,绘制一个简单的隧道模型并贴图。最终下过如下: 完成代码: #include "GLT...

  • OpenGL纹理案例-隧道

    OpenGL纹理案例-隧道 之前我写过一些关于纹理的一些基本API和API的方法参数的解释,现在我们来弄一个隧道案...

  • OpenGL纹理MipMap和隧道案例

    开场白 本文介绍一下纹理的mip映射以及用一个隧道案例来展示不同mip过滤模式的效果。 MipMap简介一下 Mi...

  • 八:OpenGL纹理(中):隧道案例

    前言: 上节为大家介绍了一个金字塔的原型,接下来为大家来实现一个更加复杂的案例吧,本节为大家介绍一个“隧道穿行”,...

  • OpenGL:纹理隧道

    本案例主要目的多个纹理如何使用,加深对纹理的使用的理解。 整体的案例效果如图所示 下面接着说说隧道的绘制过程,整体...

  • OPenGL ES纹理翻转解决方案

    纹理翻转 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL要求纹理坐标原...

网友评论

      本文标题:OpenGL 给图形贴纹理(金字塔,隧道案例)

      本文链接:https://www.haomeiwen.com/subject/ydaikktx.html