位置: 编程技术 - 正文

用球体模拟天空(用球体模拟天空的游戏)

编辑:rootadmin

推荐整理分享用球体模拟天空(用球体模拟天空的游戏),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:用球体模拟天空的游戏,u3d天空球,u3d天空球,用球体模拟天空的游戏,用球体模拟天空的图片,用球体模拟天空的游戏,用球体模拟天空怎么做,用球体模拟天空的图片,内容如对您有帮助,希望把文章链接给更多的朋友!

之前说到可以用球体作为Sky Dome模拟天空,那么就来说一说其中的细节.

Sky Dome就是天空穹顶,是一种在三维场景中模拟天空的方法,用Sky Dome模拟的天空较Sky Box更为&#;真,对应用Sky Box的场景采用雾效果很容易穿帮,而Sky Dome不会,因为Sky Box是方形从视点到各个顶点的距离不相等,Sky Dome则是球体,把视点设置为球体中心则到各个顶点的距离相等,雾效果的可见程度与视点到顶点的距离有直接关系.

那么来看看这么用之前的球体模型模拟Sky Dome吧.

之前已经给球体建了个模,现在的问题是怎么把天空贴图贴到球体上去,这将会用到一种新的贴图方法Cubemap以及着色器. 先看一下效果如何:

用球体模拟天空(用球体模拟天空的游戏)

嗯,效果就是这样.现在看下具体是怎么实现的:

首先要了解Cubemap的原理,具体的教程网上有很多,可以搜索一些来看,这边讨论一下天空穹顶的实现细节.

先准备6张图,Cubemap需要6张贴图分别是:

GL_TEXTURE_CUBE_MAP_POSITIVE_X​GL_TEXTURE_CUBE_MAP_NEGATIVE_X​GL_TEXTURE_CUBE_MAP_POSITIVE_Y​GL_TEXTURE_CUBE_MAP_NEGATIVE_Y​GL_TEXTURE_CUBE_MAP_POSITIVE_Z​GL_TEXTURE_CUBE_MAP_NEGATIVE_Z​

这6张图各自在四个方向上必须与相邻的四张贴图是连续的,这样才不会导致穿帮. 使用以下方法创建Cubemap:

[cpp] view plaincopybool loadCubemapTexture(const char* xpos,const char* xneg, const char* ypos,const char* yneg, const char* zpos,const char* zneg, GLuint& id) { BmpLoader bmpXpos,bmpXneg,bmpYpos,bmpYneg,bmpZpos,bmpZneg; if(!bmpXpos.loadBitmap((char*)xpos)|| !bmpXneg.loadBitmap((char*)xneg)|| !bmpYpos.loadBitmap((char*)ypos)|| !bmpYneg.loadBitmap((char*)yneg)|| !bmpZpos.loadBitmap((char*)zpos)|| !bmpZneg.loadBitmap((char*)zneg)) { printf("loadBitmap errorn"); return false; } glGenTextures(1,&id); glBindTexture(GL_TEXTURE_CUBE_MAP,id); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,GL_RGB, bmpXpos.bitInfo->biWidth,bmpXpos.bitInfo->biHeight ,0,GL_RGB,GL_UNSIGNED_BYTE,bmpXpos.image); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X,0,GL_RGB, bmpXneg.bitInfo->biWidth,bmpXneg.bitInfo->biHeight ,0,GL_RGB,GL_UNSIGNED_BYTE,bmpXneg.image); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y,0,GL_RGB, bmpYpos.bitInfo->biWidth,bmpYpos.bitInfo->biHeight ,0,GL_RGB,GL_UNSIGNED_BYTE,bmpYpos.image); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,0,GL_RGB, bmpYneg.bitInfo->biWidth,bmpYneg.bitInfo->biHeight ,0,GL_RGB,GL_UNSIGNED_BYTE,bmpYneg.image); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,0,GL_RGB, bmpZpos.bitInfo->biWidth,bmpZpos.bitInfo->biHeight ,0,GL_RGB,GL_UNSIGNED_BYTE,bmpZpos.image); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,0,GL_RGB, bmpZneg.bitInfo->biWidth,bmpZneg.bitInfo->biHeight ,0,GL_RGB,GL_UNSIGNED_BYTE,bmpZneg.image); return true; } 注意从此开始这6张贴图属于同一个Cubemap对象,它们是一个整体. [cpp] view plaincopyinitCubemapTexture(YZ_PATH,YZ_PATH,XZ_PATH,XZ_PATH, XY_PATH,XY_PATH,CUBE_MAP_TEXTURE); 现在这个Cubemap对象的名字叫做CUBE_MAP_TEXTURE.

使用glBindTexture(GL_TEXTURE_CUBE_MAP,CUBE_MAP_TEXTURE)我们就可以使用这个纹理对象了.等一下,纹理有了但是还没有纹理坐标.

让我们看一下OpenGL官方网站是怎么说的:

The texture coordinates for cubemaps are 3D vector directions. These are conceptually directions from within the cube defined by the cubemap, pointing in a particular direction.

嗯,Cubemap的纹理坐标是一个3d向量,并非是传统纹理坐标的2d向量, 应该是从球体中心到球体表面上的向量,如图所示:看明白了吧,那么来看一下Shader又是怎么写的:Vertex Shader:[plain] view plaincopyvarying vec3 texCoord; void main() { texCoord = vec3(gl_Vertex.x, gl_Vertex.y, gl_Vertex.z); texCoord = normalize(texCoord); gl_Position = ftransform(); } Fragment Shader:[plain] view plaincopyuniform samplerCube texCube; varying vec3 texCoord; void main() { gl_FragColor = textureCube(texCube, texCoord); } 接着编写渲染代码:[cpp] view plaincopyuseShader(shaderTex); glBindTexture(GL_TEXTURE_CUBE_MAP,CUBE_MAP_TEXTURE); glPushMatrix(); glTranslatef(0,-,-); glScalef(,,); sphere->render(); glPopMatrix(); 先使用坐标轴贴图,让我们看看效果对不对:呦,效果不对,xy轴反了,怎么办?修改Vertex Shader![plain] view plaincopyvarying vec3 texCoord; void main() { texCoord = vec3(gl_Vertex.x, -gl_Vertex.y, -gl_Vertex.z); texCoord = normalize(texCoord); gl_Position = ftransform(); } 嗯,这样就对了,然后换上天空贴图就行了. 还在等什么,赶紧试一试呗!

如何向GLSL中传入多个纹理 如何向GLSL中传入多个纹理这几天在研究如何实现用GLSL对多个纹理进行融合处理,发现除了第一个纹理之外其它的纹理参数都无法传递到GLSL中去,在网

使用着色器模拟雾效果 上一篇关于天空盒的blog谈到了雾效果,那么这次来讨论一下用着色器实现雾效果的具体实现方法.雾在大自然中是一种常见的天气现象,比如清晨时分在山

OpenGL学习之API详解 转载自

标签: 用球体模拟天空的游戏

本文链接地址:https://www.jiuchutong.com/biancheng/373156.html 转载请保留说明!

上一篇:OpenGL 超级宝典学习,制作 圆柱,球体,花托,圆盘等多边体(opengl超级宝典pdf)

下一篇:使用着色器模拟雾效果(着色器模型)

  • 共享税种
  • 超率累进税率有哪些税种呢怎么算
  • 个税返还手续费奖励员工账务处理
  • 待摊费用属于企业的费用
  • 增值税申报表与财务报表不一致
  • 个人销售自产农产品 个人所得税
  • 发票没用完可以申请超限量吗
  • 年前采购
  • 个人所得税税前扣除是什么意思
  • 股息交个人所得税怎么交
  • 电子商务交易成本
  • 自产产品用于捐赠的会计处理
  • 出口销售收入怎么算
  • 公司预存话费应该怎么做会计处理?
  • 地方教育费附加是什么意思
  • 合伙企业投资需要缴纳印花税吗
  • 保险费可以抵扣嘛
  • 企业所得税弥补亏损明细表怎么看
  • 固定资产折旧计入成本还是费用
  • 小规模纳税人购买货物怎么入账
  • 专用发票上注明的税额是什么
  • 房屋租赁税务局开票税点
  • 主营业务收入会计分录怎样写
  • 营业外收入有哪些情况
  • 出口汇兑损益的会计分录
  • 职工教育经费的扣除限额
  • 中途建账科目余额表怎么建
  • window10安装教程u盘
  • 中专学历可以报成人本科吗
  • (Select)解决:Element-ui 中 Select 选择器下拉框样式及输入框样式的修改问题(背景色透明与悬停背景色变化与下拉框边距变化等操作)
  • 工程结算需要哪些施工方案
  • encore是什么软件
  • PHP:pcntl_sigprocmask()的用法_PCNTL函数
  • linux多网卡聚合
  • 增值税怎样计算
  • idea安装vue.js
  • 增值税专用发票怎么开
  • php 路由实现
  • 公司电脑配件也要交税吗
  • 认缴制对实务操作的可能影响有哪些?
  • 2023年终奖一次性扣税对照表
  • 个人出租房屋需要缴纳个税吗
  • 旅行社开具的发票
  • 财付通支付备付金
  • 疫情防控重点保障企业名单
  • 软件开发的账务处理
  • 建筑行业挂靠代扣税款如何入账?
  • 企业验资的好处
  • 小规模购买税控盘分录怎么写
  • 所得税减免的企业税率
  • 收回理财款会计分录
  • 客户赔款会计科目
  • 建筑施工企业劳务费怎么入成本
  • 旅行社开的发票如何记账?
  • 财务报表中的存货包括哪些内容
  • 预收物业费预收什么意思
  • MySQL数据库索引设计
  • 在Linux环境下mysql的root密码忘记解决方法(三种)
  • 三星电脑安装系统为什么进入不了安装页面
  • XP系统安装不了QQ
  • 苹果发布会最新消息
  • win10拖动窗口快捷键
  • win10文件资源
  • find.exe应用程序错误
  • msxct.exe - msxct是什么进程 有什么用
  • ngctw32.exe - ngctw32是什么进程 有什么用
  • linux中vi替换
  • app的文件名
  • 如何使用jquery插件
  • js深度拷贝的方法
  • 基于web的旅游网站毕业设计
  • 深入理解计算机系统
  • 雷爵电动车官网
  • javascript原型
  • 陕西新版电子税务局怎么使用
  • 税务系统领发票
  • 地税注销流程
  • 深圳国税电子税务局入口
  • 汽车票用什么查
  • 律师费不给了会怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设