GPU_Gems-物理模型的水模拟

创建一个多网格的平面

void GraphicsWindowBase::RenderPlane() {constexpr int width = 150;constexpr int depth = 150;constexpr int vertNum = width * depth;float length = 60.f;if (quadVAO == 0){float planeVert[vertNum * 5];float offsetX = length / (width - 1.f);float offsetZ = length / (depth - 1.f);float offsetU = 1 / (width - 1.f);float offsetV = 1 / (depth - 1.f);for (int z = 0; z < depth; z++) {for (int x = 0; x < width; x++) {int vIdx = (x + z * width) * 5;planeVert[vIdx] = x * offsetX - length / 2;planeVert[vIdx + 1] = 0.f;planeVert[vIdx + 2] = -z * offsetZ;planeVert[vIdx + 3] = x * offsetU;planeVert[vIdx + 4] = z * offsetV;}}int planeIndices[(width - 1) * (depth - 1) * 2 * 3];for (int z = 0; z < depth - 1; z++) {for(int x = 0; x < width - 1; x++) {int leftBottomIdx = x + z * width;int leftTopIdx = x + z * width + width;int rightTopIdx = leftTopIdx + 1;int rightBottomIdx = leftBottomIdx + 1;int triangleIdx = (x + z * (width - 1)) * 2 * 3;planeIndices[triangleIdx] = leftTopIdx;planeIndices[triangleIdx + 1] = leftBottomIdx;planeIndices[triangleIdx + 2] = rightTopIdx;planeIndices[triangleIdx + 3] = leftBottomIdx;planeIndices[triangleIdx + 4] = rightBottomIdx;planeIndices[triangleIdx + 5] = rightTopIdx;}}glGenVertexArrays(1, &quadVAO);glGenBuffers(1, &quadVBO);glGenBuffers(1, &quadIBO);glBindVertexArray(quadVAO);glBindBuffer(GL_ARRAY_BUFFER, quadVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(planeVert), &planeVert, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadIBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(planeIndices), planeIndices, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));}glBindVertexArray(quadVAO);glDrawElements(GL_TRIANGLES, (width - 1) * (depth - 1) * 2 * 3, GL_UNSIGNED_INT, 0);glBindVertexArray(0);
}

直接输出看效果
vs

void main()
{gl_Position = projection*view*model*vec4(aPos, 1.0);
}

fs

void main()
{FragColor = vec3(0.196,0.346,0.654);
}

在这里插入图片描述

正弦波叠加模拟

D:波方向
L:波长/周期
S:波速
A:振幅

vs

layout (location = 0) in vec3 aPos;
//...
vec3 pos = aPos;
float nx = 0;
float nz = 0;
float ny = 0;
vec3 n;
for(int i = 0; i < waveNum; i++){float w =2 * PI / L[i];float phi = S[i] * w;vec2 D = getDirect(i, vec2(aPos.x, aPos.z));pos.y += 2 * A[i] * pow((sin(w * dot(D, vec2(aPos.x, aPos.z)) + iTime * phi)) * 0.5 + 0.5, k);nx += k * w * D.x * A[i] * pow((sin(w * dot(D, vec2(aPos.x, aPos.z)) + iTime * phi)) * 0.5 + 0.5, k-1) * cos(dot(D, vec2(aPos.x, aPos.z)) * w + iTime * phi);nz += k * w * D.y * A[i] * pow((sin(w * dot(D, vec2(aPos.x, aPos.z)) + iTime * phi)) * 0.5 + 0.5, k-1) * cos(dot(D, vec2(aPos.x, aPos.z)) * w + iTime * phi);
}
n = vec3(-nx, 1, -nz);
//...
gl_Position = projection*view*model*vec4(pos, 1.0);
vs_out.Position =vec3(model * vec4(pos, 1.0));
n = mat3(transpose(inverse(model))) * n;
vs_out.Normal = normalize(n);

fs

out vec4 FragColor;
//...
vec3 lightDir = vec3(0,1,0);
float diff = clamp(dot(fs_in.Normal, lightDir), 0, 1);
vec3 waterColor = vec3(0.196,0.346,0.654);
FragColor = vec4(waterColor * diff, 1);

在这里插入图片描述

Gerstner波叠加模拟

Q:波陡峭的参数,控制波峰尖锐情况
vs

layout (location = 0) in vec3 aPos;
//...
vec3 pos = aPos;
float nx = 0;
float nz = 0;
float ny = 0;
vec3 n;
for(int i = 0; i < waveNum; i++){float w = 2 * PI / L[i];float phi = S[i] * w;vec2 D = getDirect(i, vec2(aPos.x, aPos.z));float Q = clamp(Q[i] / (w * A[i] * waveNum), 0, 1);float arg = w * dot(D, vec2(aPos.x, aPos.z)) + iTime * phi;pos.x += Q * A[i] * D.x * cos(arg);pos.z += Q * A[i] * D.y * cos(arg);pos.y += A[i] * sin(arg);nx += D.x * w * A[i] * cos(arg);nz += D.y * w * A[i] * cos(arg);ny += Q * w * A[i] * sin(arg);
}
n = vec3(-nx, 1 - ny, -nz);
//...
gl_Position = projection*view*model*vec4(pos, 1.0);
vs_out.Position =vec3(model * vec4(pos, 1.0));
n = mat3(transpose(inverse(model))) * n;
vs_out.Normal = normalize(n);

fs

out vec4 FragColor;
//...
vec3 lightDir = vec3(0,1,0);
float diff = clamp(dot(fs_in.Normal, lightDir), 0, 1);
vec3 waterColor = vec3(0.196,0.346,0.654);
FragColor = vec4(waterColor * diff, 1);

在这里插入图片描述

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

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

相关文章

朴素贝叶斯机器学习算法:从基础到高级

文章目录 一、说明二、从一个简单例子入手2.1 简单示例2.2 朴素贝叶斯算法的直觉解释 三、在训练阶段&#xff0c;朴素贝叶斯内部会发生什么&#xff1f;3.1 朴素贝叶斯如何处理数值数据&#xff1f;3.2 如果数据分布不是高斯分布怎么办&#xff1f;3.3 朴素贝叶斯的数值稳定性…

Flutter Navigator.popUntil 参数传递

Flutter 使用页面传参 以下是 在flutter 中页面传参的常用形式&#xff0c;都可以有有直接的传值参数提供。 Navigator.push #跳转到指定页面 压栈路由表Navigator.pushReplacement #关闭当前页面 跳转到指定页面压栈路由表Navigator.pus…

JavaScript的学习之自增自减

目录 一、自增 第一种&#xff1a;a 第二种&#xff1a;a 二、自减 一、自增 定义&#xff1a;可以是变量在自身的基础上增加1 自增分为两种&#xff1a;后&#xff08;a&#xff09;和前&#xff08;a&#xff09; 无论是a和a都会立即使原变量的值增1&#xff0c;不同的使…

【windows】电脑如何关闭Bitlocker硬盘锁

如果你的硬盘显示这样的一把锁&#xff0c;说明开启了Bitlocker硬盘加密。 Bitlocker硬盘锁&#xff0c;可以保护硬盘被盗&#xff0c;加密防止打开查看数据。 方法一&#xff1a;进入“控制面板->BitLocker 驱动器加密”进行设置。或者“控制面板\系统和安全->BitLocke…

排序算法系列二:归并排序、快速排序

零、说在前面 本文是一个系列&#xff0c; 入口请移步这里 一、理论部分 1.4&#xff1a;归并排序 1.4.1&#xff1a;算法解读&#xff1a; 使用二分法和插入排序两种算法的思想来实现。流程分为“拆分”、“合并”两大部分&#xff0c;前者就是普通的二分思想&#xff0c;将…

电商平台数据功能封装API需要注意些什么?如何调用封装后的API?

一、引言 随着电商行业的蓬勃发展&#xff0c;电商平台的数据功能愈发复杂多样&#xff0c;如何高效、安全地管理和使用这些数据成为了电商平台开发者面临的重要问题。API&#xff08;Application Programming Interface&#xff09;作为不同软件之间进行通信的桥梁&#xff0…

预警与校准并行:可燃气体报警器在矿区井下甲烷泄露防控中的应用

在矿区井下作业中&#xff0c;甲烷泄露是一个严重威胁工人生命安全和矿区生产安全的隐患。因此&#xff0c;及时、准确地预警甲烷泄露并采取相应的处理措施显得尤为重要。 可燃气体报警器作为一种有效的监测工具&#xff0c;在预防甲烷泄露事故中发挥着不可替代的作用。 在这…

STM32HAL库 -- RS485 开发板通信(速记版)

在本章中&#xff0c; 我们将使用 STM32F429的串口 2 来实现两块开发板之间的 485 通信(半双工)。 RS485 简介 485&#xff08;一般称作 RS485/EIA-485&#xff09;隶属于 OSI 模型物理层&#xff0c;是串行通讯的一种。电气特性规定为 2 线&#xff0c;半双工&#xff0c;多…

CVPR 2024最佳论文分享:文本到图像生成的丰富人类反馈

CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;是计算机视觉领域最有影响力的会议之一&#xff0c;主要方向包括图像和视频处理、目标检测与识别、三维视觉等。近期&#xff0c;CVPR 2024公布了最佳论文。共有10篇论文获奖&#xff0c;其…

如何实现智慧农田的精准灌溉

如何实现智慧农田的精准灌溉 智慧农田的精准灌溉是现代农业技术发展的重要组成部分&#xff0c;它集成了物联网、大数据分析、人工智能以及现代水利技术&#xff0c;旨在通过实时监测土壤湿度、气象条件及作物生长状况&#xff0c;实现水资源的高效利用和作物产量、品质的双重…

解决2021版IDEA新建没有Server问题

2024-06-27可用 我是这样解决的&#xff0c;仅供参考 IDEA软件是2021.1.1版 导入Tomcat的Servlet包&#xff0c;就解决了&#xff0c;详见下图操作 1. 打开项目结构 2. 选Libraries 3. 找到Tomcat安装路径 比如我安装在了“C:\soft”目录&#xff0c;就去这个目录找 然后记得…

基于Cardinal的AWD攻防平台搭建与使用以及基于docker的题目环境部署

关于 CTF 靶场的搭建与完善勇师傅前面已经总结过了&#xff0c;参考&#xff1a; CTF靶场搭建及Web赛题制作与终端docker环境部署_ctfoj搭建-CSDN博客 基于H1ve一分钟搭好CTF靶场-CSDN博客 Nginx首页修改及使用Nginx实现端口转发_nginx 修改欢迎首页-CSDN博客 关于H1ve导…

cPanel的SSL证书续订方法

在现代互联网环境中&#xff0c;SSL证书对于保障网站的安全和数据加密至关重要。下面我们将介绍如何在cPanel中续订SSL证书&#xff0c;并适时结合Hostease服务器的优势&#xff0c;帮助您更好地理解和操作。 生成私钥和CSR&#xff08;证书签名请求&#xff09; 难易程度&am…

Unity中模拟抛物线(非Unity物理)

Unity中模拟抛物线非Unity物理 介绍剖析问题以及所需公式重力加速度公式&#xff1a;h 1/2*g*t*t(h 1/2 * g * t ^ 2)速度公式&#xff1a;Vt V初 a * t 主要代码总结 介绍 用Unity物理系统去做的抛物线想要控制速度或者想要细微的控制一些情况是非常困难的。所以想要脱离U…

国产CPU兆芯发展分析

国产信创CPU-兆芯CPU CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU已形成自主架构、x86、ARM三大阵营。自主架构以龙芯、申威的LoongArch、SW-64为代表&#xff1b;ARM阵营由鲲鹏、飞腾领军&#xff0c;依托ARM授权开发处理器&#xff1b;x86阵营则以海光、兆芯等品牌…

基于halcon的眼在手外(Eye-to-Hand)标定

前言 上个月写了一个《基于halcon的眼在手上&#xff08;Eye-in-Hand&#xff09;标定》的文章&#xff0c;通过官方的示例代码进行了简单的叙述&#xff0c;想学习的小伙伴可以点击链接进行学习。之前博主认为眼在手上&#xff08;Eye-in-Hand&#xff09;的案例更多&#xff…

leetcode209:长度最小的子数组

题目链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();if(n 0) return 0;int end 0, start 0, sum 0, ans 0x3f3f3f3f;while…

OpenAI将终止对中国提供服务,国内模型接棒

说起来&#xff0c;OpenAI自始至终就没有对中国提供过服务&#xff0c;OpenAI官方支持的国家和地区&#xff1a;https://platform.openai.com/docs/supported-countries 列表里面没有“Chinese”的选项&#xff0c;那为什么又要明令禁止呢&#xff0c;国类IT高手们&#xff0…

day001 环境的配置与工具的安装

VMware的软件包&#xff1a;https://pan.xunlei.com/s/VNs1KShnlZalTSJtejXXzchlA1?pwdudy5# 其他的软件可以在电脑管家中下载&#xff0c;注意不要安装到c盘&#xff0c;否则影响开机速度。 虚拟机工具&#xff1a;VMware17.5.1 1&#xff0c; 2&#xff0c; 3&#xff0c…

欢乐钓鱼大师攻略:卡鱼骨、典藏鱼、藏宝图怎么钓?

《欢乐钓鱼大师》是一款以钓鱼为核心玩法的休闲模拟手游&#xff0c;通过逼真的画面和丰富的钓鱼体验吸引了大量玩家。本文将为你详细介绍这款游戏的亮点、常见问题以及一些实用的游戏技巧&#xff0c;帮助你在《欢乐钓鱼大师》中获得更愉快的游戏体验。 辅助工具 1. 辅助工具…