区块链技术博客
www.b2bchain.cn

3dTiles 自定义着色器求职学习资料

D0b2wT.gif

本文介绍了3dTiles 自定义着色器求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

三维白模直接加载到Cesium中的效果太过朴素,就算是根据属性设置不同的颜色还是丑,归根结底是颜色渲染太单一,我们可以使用渐变色来渲染一下,效果会立马提升一个档次,再配合泛光效果,可以出来点数字城市的意思。

自定义渲染,原理就是着色器编程,但是Cesium并没有为3dtiles的着色器编程的入口,那么目前已有的办法,一是改源码,二是通过作用链,运行时注入 shader 代码。本文使用第二种方法来修改渲染效果。

1、封装一个管理函数 add3DTiles

“`javascript
// 加载白模(自定义渲染)
export function add3DTiles (url, viewer) {
const tileset1 = new Cesium.Cesium3DTileset({
url,
// 控制切片视角显示的数量,可调整性能
maximumScreenSpaceError: 2,
maximumNumberOfLoadedTiles: 100000
})
tileset1.readyPromise.then((tileset) => {
viewer.scene.primitives.add(tileset)
let r = tileset.boundingSphere.radius
if (tileset.boundingSphere.radius > 10000) {
r = tileset.boundingSphere.radius / 10
}
viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.0, -0.5, r))
tileset.style = new Cesium.Cesium3DTileStyle({
color: ‘vec4(0, 0.5, 1.0,1)’
})
// 注入 shader
tileset.tileVisible.addEventListener((tile) => {
var content = tile.content
var featuresLength = content.featuresLength
for (var i = 0; i < featuresLength; i += 2) {
const feature = content.getFeature(i)
const model = feature.content._model

    if (model && model._sourcePrograms && model._rendererResources) {       Object.keys(model._sourcePrograms).forEach((key) => {         const program = model._sourcePrograms[key]         const fragmentShader = model._rendererResources.sourceShaders[program.fragmentShader]         let vPosition = ''         if (fragmentShader.indexOf(' v_positionEC;') !== -1) {           vPosition = 'v_positionEC'         } else if (fragmentShader.indexOf(' v_pos;') !== -1) {           vPosition = 'v_pos'         }         const color = `vec4(${feature.color.toString()})`

三维白模直接加载到Cesium中的效果太过朴素,就算是根据属性设置不同的颜色还是丑,归根结底是颜色渲染太单一,我们可以使用渐变色来渲染一下,效果会立马提升一个档次,再配合泛光效果,可以出来点数字城市的意思。

自定义渲染,原理就是着色器编程,但是Cesium并没有为3dtiles的着色器编程的入口,那么目前已有的办法,一是改源码,二是通过作用链,运行时注入 shader 代码。本文使用第二种方法来修改渲染效果。

1、封装一个管理函数 add3DTiles

“`javascript
// 加载白模(自定义渲染)
export function add3DTiles (url, viewer) {
const tileset1 = new Cesium.Cesium3DTileset({
url,
// 控制切片视角显示的数量,可调整性能
maximumScreenSpaceError: 2,
maximumNumberOfLoadedTiles: 100000
})
tileset1.readyPromise.then((tileset) => {
viewer.scene.primitives.add(tileset)
let r = tileset.boundingSphere.radius
if (tileset.boundingSphere.radius > 10000) {
r = tileset.boundingSphere.radius / 10
}
viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.0, -0.5, r))
tileset.style = new Cesium.Cesium3DTileStyle({
color: ‘vec4(0, 0.5, 1.0,1)’
})
// 注入 shader
tileset.tileVisible.addEventListener((tile) => {
var content = tile.content
var featuresLength = content.featuresLength
for (var i = 0; i < featuresLength; i += 2) {
const feature = content.getFeature(i)
const model = feature.content._model

    if (model && model._sourcePrograms && model._rendererResources) {       Object.keys(model._sourcePrograms).forEach((key) => {         const program = model._sourcePrograms[key]         const fragmentShader = model._rendererResources.sourceShaders[program.fragmentShader]         let vPosition = ''         if (fragmentShader.indexOf(' v_positionEC;') !== -1) {           vPosition = 'v_positionEC'         } else if (fragmentShader.indexOf(' v_pos;') !== -1) {           vPosition = 'v_pos'         }         const color = `vec4(${feature.color.toString()})`

三维白模直接加载到Cesium中的效果太过朴素,就算是根据属性设置不同的颜色还是丑,归根结底是颜色渲染太单一,我们可以使用渐变色来渲染一下,效果会立马提升一个档次,再配合泛光效果,可以出来点数字城市的意思。

自定义渲染,原理就是着色器编程,但是Cesium并没有为3dtiles的着色器编程的入口,那么目前已有的办法,一是改源码,二是通过作用链,运行时注入 shader 代码。本文使用第二种方法来修改渲染效果。

1、封装一个管理函数 add3DTiles

“`javascript
// 加载白模(自定义渲染)
export function add3DTiles (url, viewer) {
const tileset1 = new Cesium.Cesium3DTileset({
url,
// 控制切片视角显示的数量,可调整性能
maximumScreenSpaceError: 2,
maximumNumberOfLoadedTiles: 100000
})
tileset1.readyPromise.then((tileset) => {
viewer.scene.primitives.add(tileset)
let r = tileset.boundingSphere.radius
if (tileset.boundingSphere.radius > 10000) {
r = tileset.boundingSphere.radius / 10
}
viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.0, -0.5, r))
tileset.style = new Cesium.Cesium3DTileStyle({
color: ‘vec4(0, 0.5, 1.0,1)’
})
// 注入 shader
tileset.tileVisible.addEventListener((tile) => {
var content = tile.content
var featuresLength = content.featuresLength
for (var i = 0; i < featuresLength; i += 2) {
const feature = content.getFeature(i)
const model = feature.content._model

    if (model && model._sourcePrograms && model._rendererResources) {       Object.keys(model._sourcePrograms).forEach((key) => {         const program = model._sourcePrograms[key]         const fragmentShader = model._rendererResources.sourceShaders[program.fragmentShader]         let vPosition = ''         if (fragmentShader.indexOf(' v_positionEC;') !== -1) {           vPosition = 'v_positionEC'         } else if (fragmentShader.indexOf(' v_pos;') !== -1) {           vPosition = 'v_pos'         }         const color = `vec4(${feature.color.toString()})`

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 3dTiles 自定义着色器求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们