OpenGL 隧道坐标计算

186 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 属性(下)
  6. Swift 属性
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 压缩纹理
  13. OpenGL 隧道坐标计算
  14. 0penGL 像素格式及数据类型
  15. OpenGL 纹理对象
  16. OpenGL 纹理
  17. OpenGL 模型变化
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测试的潜在风险
  23. OpenGL 浅析深度测试
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完成交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. OpenGL 环境搭建 - MacOS

设置Mip 贴图

上一篇我们整理了像素格式和数据类型的内容,今天我们来看看 关于 OpenGL 的隧道案例中,坐标的计算过程:

设置mip贴图基层

glTexParameteri (GL TEXTURE 2D, GL TEXTURE BASE LEVEL, O) ;

设置mip贴图最大层

glTexParameteri (GL TEXTURE 2D, GL TEXTURE BASE LEVEL, O) ;

经过Mip贴图的纹理过滤

常量描述
GL_NEAREST在Mip基层上执行最邻近过滤
GL_LINEAR在Mip基层执行线性过滤
GL_NEAREST_MIPMAP_NEAREST在最邻近Mip层,并执行最邻近过滤
GL_NEAREST_MIPMAP_LINEAR在Mip层之间执行线性插补,并执行最邻近过滤
GL_LINEAR_MIPMAP_NEAREST选择最邻近Mip层.并执行线性过滤
GL_LINEAR_MIPMAP_LINEAR在Mip层之问执行线性插补,并执行线性过滤,又称三线性Mip贴图

floorBatch几何坐标计算

计算坐标使用三角形拼接,计算地板面的几何坐标

floorBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
//z表示深度,隧道的深度
for(z = 60.0f; z ›= 0.0f;: z -=10.0f) {
    floorBatch.MultiTexCoordzf(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, '2);
    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, 2 - 10.0f):
    floorBatch. End() ;
}

image.png

ceilingBatch几何坐标计算

和上面的坐标计算 相对的 天花板的 几何坐标计算

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) :
    cellingsatch.velterstrao.07/'9o.bi%:7:90.or);
    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() ;
}

image.png

leftWallBatch几何坐标计算

左侧墙面的 坐标计算内容:

leftWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
for (z = 60.0f; z >= 0.0f; z-=10.0f) {
    leftWallBatch.MultiTexCoord2f(0, 0.of, 0.0f) ;
    leftWallBatch.Vertex3f(-10.0f, -10.0f, z);
    leftWallBatch.MultiTexCoord2f(0, 0.0f,1.0f):
    leftwallBatch.Vertex3f(-10.0f, 10.0f, 'z):
    leftwallBatch.Muttitexcoord27(8,2.0f,0.0f)0.of);
    leftWallBatch.Vertex3f(-10.0f, -10.0f, z-
    leftWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f) ;
    leftWallBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f) ;
    leftwallBatch.End0):
}

(-10.0f, 10.0f, z) image.png (-10.0f, -10.0f, z)

rightWallBatch几何坐标计算

和左侧墙面的计算内容基本上一样,只是这个墙在右侧:

rightWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1) ;
tor(Z = 60.0+; z >= 0.0f: z -=10.0f) {
    rightwallBatch.MultiTexCoord2f(0, 0.0f, 0.0f) ;
    rightWallBatch.Vertex3f(10.0f,'-10.0f, 2);
    rightwalisatch.verteksi90.077/8o.oi*fa,;.on):
    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() ;
}

                                                                        q(10.0f, 10.0f, z)

image.png

                                                                         q(10.0f, -10.0f, z)

最后, 我们通过将以上四面墙绘制到屏幕上,然后控制前景后退(深度值), 即 可以实现隧道中的前进后退的效果。