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.pswp.cn/web/72141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72141.shtml
英文地址,請注明出處:http://en.pswp.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;或者是窗口需要重新繪制的時候&…