7、基于osg引擎实现读取vtk数据通过着色器实现简单体渲染(1)

1、顶点着色器代码

#version 110
/* GLSL 1.10需要显式声明精度 (OpenGL ES要求) */
#ifdef GL_ES
precision highp  float;
#endif
// 体数据采样步长
uniform float xStepSize,yStepSize,zStepSize;
// 体数据纹理和颜色纹理
uniform sampler3D baseTexture;
uniform sampler1D tfTexture;
// 体数据包围盒边界
uniform vec3 minBound,maxBound;
varying vec3 vDirection;//模型空间下的光线方向
varying vec3 vCameraModelPosition;//模型空间下的相机位置
void main(void)
{// 计算裁剪空间的位置gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;vec4 cameraPos = (gl_ModelViewMatrixInverse * vec4(0, 0, 0, 1));vCameraModelPosition = cameraPos.xyz/cameraPos.w;vDirection = gl_Vertex.xyz/gl_Vertex.w- vCameraModelPosition;}

2、片元着色器代码

#version 110
/* GLSL 1.10需要显式声明精度 (OpenGL ES要求) */
#ifdef GL_ES
precision highp  float;
precision highp sampler3D;
precision highp sampler1D;
#endif
#define EPSILON 1e-3// 体数据纹理和颜色纹理
uniform sampler3D baseTexture;
uniform sampler1D tfTexture;uniform int steps;//采样步长,值越大,采样次数越多,效果越小,但性能越差
uniform float densityFactor;//值越大,颜色变化剧烈,细节边界变得锐利,可能出现不平滑的锯齿状过渡;值越小,颜色变化缓慢,叠加的颜色较多,导致整体视觉上更加柔和、模糊,增强了雾气感
// 体数据包围盒边界
uniform vec3 minBound,maxBound;varying vec3 vDirection;//模型空间下的光线方向
varying vec3 vCameraModelPosition;//模型空间下的相机位置const int maxSamples = 256;
vec2 hitBox(vec3 orig, vec3 dir) {vec3 inv_dir = 1.0 / dir;// 光线方向倒数(处理正负方向)vec3 tmin_tmp = (minBound - orig) * inv_dir;// 沿光线方向到达包围盒各轴最小边界的距离vec3 tmax_tmp = (maxBound - orig) * inv_dir; // 沿光线方向到达包围盒各轴最大边界的距离vec3 tmin = min(tmin_tmp, tmax_tmp);// 各轴向的最近交点vec3 tmax = max(tmin_tmp, tmax_tmp);// 各轴向的最远交点float near = max(max(tmin.x, max(tmin.y, tmin.z)),0.0);// 光线最终进入包围盒的距离float far = min(tmax.x, min( tmax.y, tmax.z)); // 光线最终离开包围盒的距离return vec2( near, far );
}void main(void)
{vec3 rayDir = normalize(vDirection);vec2 bounds = hitBox( vCameraModelPosition, rayDir );bounds.x -= 0.000001;if ( bounds.x >= bounds.y) discard;//光线与包围盒无交点。vec3 sampleStart = vCameraModelPosition + bounds.x * rayDir;// 初始化颜色累积vec4 finalColor = vec4(0.0);const float opacityThreshold = 0.99;   // 不透明度阈值float T = 1.0;// 光线步进采样float delta = sqrt(3.0) / float(steps);             // 均匀步长vec3 voxelSizeInv = 1.0 / (maxBound - minBound); for (float t = bounds.x; t < bounds.y; t += delta) {sampleStart = vCameraModelPosition + t * rayDir;vec3 texCoord = (sampleStart - minBound) * voxelSizeInv;float density = texture3D(baseTexture, texCoord).r;vec4 color = texture1D(tfTexture, density);color.rbg = pow(color.rbg, vec3(2.2));//从gamma空间转换到线性空间color *= densityFactor * delta;finalColor += T*color;T*=1.0-color.a;if (T<0.01) break;}// 丢弃完全透明的片元if (finalColor.a < EPSILON) discard;finalColor.rgb = pow(finalColor.rgb, vec3(1.0/2.2));gl_FragColor = finalColor;}

体渲染结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Ollama平台部署的Qwen大模型实现聊天机器人

文章目录 基于Ollama平台部署的Qwen大模型实现聊天机器人1 概述2 技术栈2.1 开发技术2.2 环境 3 实现步骤3.1 环境搭建3.1.1 WSL配置及Ubuntu安装3.1.2 Ollama安装及模型部署 3.2 模块安装3.2.1 安装Streamlit 1.42.23.2.2 安装requests 2.32.33.2.3 安装ollama 0.4.7 3.3 后端…

用DasViewer的时候3Dtiles 转osgb 可以直接指定目标坐标系吗?

没有指定坐标系选项&#xff0c;可以转换后&#xff0c;再进行一次坐标系转换。 DasViewer是一款免费极速实景三维模型浏览器&#xff0c;采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 目…

【MySQL】MySQL服务器——mysqld

1.MySQL服务器 是名为 mysqld 的数据库服务器程序&#xff0c;和“主机”&#xff08;host&#xff09;不一样是一个多线程的单进程管理对磁盘和内存中数据库的访问支持并发的客户端连接支持多个存储引擎&#xff0c;常见的存储引擎包括InnoDB、MyISAM、Memory、Archive支持事…

vue启动 localhost无法访问

1. localhost 和 127.0.0.1 虽然都指向本机&#xff0c;但它们有细微的区别&#xff1a; - localhost 是一个域名&#xff0c;需要通过 DNS 解析或本地 hosts 文件解析为 IP 地址 - 127.0.0.1 是直接的 IP 地址&#xff0c;不需要解析过程 2. 无法访问 localhost 的可…

爬虫案例十三js逆向模拟登录中大网校

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、网站分析二、代码 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; js 逆向模拟登录中大网校 提示&#xff1a;以下是本篇文章正文内…

Java IO 与文件系统:File 类与流操作详解

在 Java 编程中&#xff0c;IO&#xff08;输入输出&#xff09;操作是处理文件和数据流的核心部分。本文将围绕文件系统、硬盘存储、Java 的 File 类以及 InputStream 和 OutputStream 的使用进行详细总结&#xff0c;帮助读者全面掌握 Java IO 编程的核心知识。 一、IO、存储…

我与DeepSeek读《大型网站技术架构》(13)- 大型网站典型故障案例分析

文章目录 第13章 大型网站典型故障案例分析日志管理缺陷引发的故障高并发数据库访问问题锁机制滥用导致服务超时缓存运维不当引发的全站瘫痪流程不规范导致的线上事故编程习惯问题引发功能异常生产环境滥用问题其他典型问题总结 第13章 大型网站典型故障案例分析 本章通过九个…

Git与GitHub:它们是什么,有什么区别与联系?

1.Git是什么&#xff1f; Git 是一个开源的、分布式版本控制系统&#xff08;Version Control System, VCS&#xff09;&#xff0c;由 Linus Torvalds 于 2005 年开发&#xff0c;最初用于管理 Linux 内核的开发。它的核心功能是跟踪文件的变更历史&#xff0c;帮助开发者高效…

江科大51单片机笔记【12】AT24C02(I2C总线)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…

ClickHouse SQL优化:从原理到实战的深度指南

目录 ​ClickHouse架构核心解析 1.1 列式存储的利刃与短板 1.2 MergeTree引擎的物理存储密码 1.3 向量化执行引擎的运算革命 ​数据建模的黄金法则 2.1 分区键设计的二十倍性能差异实验 2.2 主键排序的磁盘命中率法则 2.3 稀疏索引的数学选择策略 ​SQL优化十诫 3.1 查询模式反…

面试之《前端常见的设计模式》

前端开发中运用多种设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是一些常见的前端设计模式&#xff1a; 创建型模式 1. 单例模式 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。应用场景&#xff1a;在前端中&#xff0c;像全局状…

Unity Android出包

Unity Android出包 1.Android Studio版本 不能高于Unity的版本 2.so库 这个库需要自己拷贝到Android工程当中 3.JDK版本太老 编译可以正常&#xff0c;但无法运行 File->ProjectStructure->SDK Location->Gradle Setting->Gradle JDK->X:/Android Stuido/jre …

Android 中临时文件存放路径选择

在 Android 中&#xff0c;下载临时文件通常可以放在以下目录中&#xff0c;具体选择取决于应用的需求和目标 Android 版本的限制&#xff1a; 1. 通用临时目录&#xff08;/data/local/tmp/&#xff09; 这是 Android 系统提供的一个通用临时目录&#xff0c;适用于存储临时…

【软件测试】--面试

准备简历–面试邀请 投递简历 面试&#xff08;笔试&#xff0c;HR面试&#xff0c;技术官面试&#xff09; 入职准备&#xff08;体检&#xff0c;背调&#xff09; 办理入职&#xff08;签合同&#xff09; 入职培训 试用期 转正 【简历要点】 1.基本信息 学校专业&#xff…

C盘清理技巧分享:释放空间,提升电脑性能

目录 1. 引言 2. C盘空间不足的影响 3. C盘清理的必要性 4. C盘清理的具体技巧 4.1 删除临时文件 4.2 清理系统还原点 4.3 卸载不必要的程序 4.4 清理下载文件夹 4.5 移动大文件到其他盘 4.6 清理系统缓存 4.7 使用磁盘清理工具 4.8 清理Windows更新文件 4.9 禁用…

rpm安装nux-dextop时出现 epel-release is needed的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

qt加载VeloView工程

接上一篇点云软件配置与编译&#xff0c;使用qt加载需要先完成编译。编译完成后到编译目录下lidarview-superbuild\common-superbuild\lidarview\build 找到CmakeCache.txt&#xff0c;如下是我的编译目录。 使用QT6.5.3加载了CmakeCache.txt&#xff0c;QT5.14还加载不了cmake…

python编写的一个打砖块小游戏

游戏介绍 打砖块是一款经典的街机游戏&#xff0c;玩家控制底部的挡板&#xff0c;使球反弹以击碎上方的砖块。当球击中砖块时&#xff0c;砖块消失&#xff0c;球反弹&#xff1b;若球碰到挡板&#xff0c;则改变方向继续运动&#xff1b;若球掉出屏幕底部&#xff0c;玩家失…

git 基本常用操作,切换分支,合并分支

分支 two 查看所有分支 git branch 切换分支&#xff08;two&#xff09; git checkout two 创建并切换到新分支&#xff08;two&#xff09; git checkout -b two 提交当前代码到到源分支 git push --set-upstream origin two 合并分支 1. 切换到目标分支 例如&#xff0c;…

【QT】事件系统入门——QEvent 基础与示例

一、事件介绍 事件是 应用程序内部或者外部产生的事情或者动作的统称 在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&…