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.rhkb.cn/news/362216.html

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

相关文章

【精选】数据治理项目实施(合集)05——解码“数据架构”,数据架构包含哪些内容?

上一篇讲到了数据治理项目的前期调研工作&#xff0c;继数据调研工作完成之后&#xff0c;就要开始关于治理工作的各项方案设计&#xff0c;整体方案设计包括数据架构、元数据、主数据、数据质量、数据安全、指标标签体系、数据生命周期管理和管理评价等内容。这一篇重点讲一下…

聊一聊UDF/UDTF/UDAF是什么,开发要点及如何使用?

背景介绍 UDF来源于Hive&#xff0c;Hive可以允许用户编写自己定义的函数UDF&#xff0c;然后在查询中进行使用。星环Inceptor中的UDF开发规范与Hive相同&#xff0c;目前有3种UDF&#xff1a; A. UDF--以单个数据行为参数&#xff0c;输出单个数据行&#xff1b; UDF&#…

为什么说展厅数字人是展览未来的趋势?

展厅数字人是利用数字化、智能化和网络化等信息技术手段提升展厅展览服务和游览体验的全新载体。随着人工智能和虚拟现实技术的应用发展&#xff0c;展厅数字人已成为展厅展览转型升级的重要趋势。 展厅数字人凭借其创新性、强可塑性&#xff0c;成为展厅新名片&#xff0c;为各…

趣测系统搭建APP源码开发,娱乐丰富生活的选择!

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 趣测系统提供了一个集合多种有趣测试的平台&#xff0c;如心理测试和星座测试等&#xff0c;这些测试内容富有趣味性和娱乐性&#xff0c;能够帮助大众在忙碌的生活中找到放松和娱乐的时刻…

Vite 动态导入警告问题解决方案

如上图我要实现从后台获取权限菜单并动态导入进行渲染 但由于 vite 暂时不支持这种导入方式 图中也给出了提示 本人也是这么去做了 但并没什么卵用 后来参考了 vite 的 import.meta.glob 这种方式 我在处理菜单权限控制的菜单里进行了如下操作&#xff1a; …

Hyperf 在 NginxProxyManager 如何配置 websocket?

新建代理 填写域名等服务信息&#xff0c;选择支持WebSockets。 创建 SSL 编写nginx配置 location /message.io{proxy_pass http://<你的ip>:<对应端口号>;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upg…

会计报表分析

目录 一. 会计报表的种类 \quad 一. 会计报表的种类 \quad 反应财务状况的是资产负债表 反应经营成果的是利润表 有时间点的就是静态表 动态表就是有一个区间的, 比如一年, 一个季度等

学习笔记——动态路由——RIP(RIP路由汇总介绍)

四、RIP路由汇总介绍 当网络中路由器的路由条目非常多时&#xff0c;可以通过路由汇总&#xff08;又称路由汇聚或路由聚合&#xff09;来减少路由条目数&#xff0c;加快路由收敛时间和增强网络稳定性。 路由汇总的原理是&#xff0c;同一个自然网段内的不同子网的路由在向外…

Django 如何使用视图动态输出 CSV 以及 PDF

Django 如何使用视图动态输出 CSV 以及 PDF 这一篇我们需要用到 python 的 csv 和 reportLab 库&#xff0c;通过django视图来定义输出我们需要的 csv 或者 pdf 文件。 csv文件 打开我们的视图文件 testsite/members/views.py 。新增一个视图方法&#xff1a; import csv …

活用变量,让Postman的使用飞起来

在 Postman 中使用变量是一种非常强大的功能&#xff0c;它可以极大地增强 API 测试和开发的灵活性和效率。 Postman变量的类型 变量在 Postman 中可以在多个层次设置和使用&#xff0c;包括 全局变量环境变量集合变量局部变量&#xff08;如在脚本中暂时创建的变量&#xf…

Clickhouse 的性能优化实践总结

文章目录 前言性能优化的原则数据结构优化内存优化磁盘优化网络优化CPU优化查询优化数据迁移优化 前言 ClickHouse是一个性能很强的OLAP数据库&#xff0c;性能强是建立在专业运维之上的&#xff0c;需要专业运维人员依据不同的业务需求对ClickHouse进行有针对性的优化。同一批…

想问一下stm32学习哪些东西才算入门并且能做项目?

STM32&#xff08;所有的MCU都一样&#xff09;归根结底只是一个工具&#xff0c;能做的事情也很多&#xff0c;如果只谈性能&#xff0c;不考虑稳定性等因素&#xff0c;那么103估计做个导弹控制器&#xff0c;火箭控制器都没有问题&#xff0c;阿波罗登月的主控主频才多少&am…

kafka 消费者 API 使用总结

前言 应用程序使用KafkaConsumer向Kafka订阅主题&#xff0c;并从订阅的主题中接收消息。不同于从其他消息系统读取数据&#xff0c;从Kafka读取数据涉及一些独特的概念和想法。如果不先理解这些概念&#xff0c;则难以理解如何使用消费者API。本文将先解释这些重要的概念&…

Attention步骤

一个典型的Attention思想包括三部分&#xff1a;Qquery、Kkey、Vvalue。 Q是query&#xff0c;是输入的信息&#xff1b;key和value成组出现&#xff0c;通常是原始文本等已有的信息&#xff1b;通过计算Q与K之间的相关性a&#xff0c;得出不同的K对输出的重要程度&#xff1b;…

数据结构与算法基础(王卓)--学习笔记

1 数据结构分类 1.1 逻辑结构分类 集合结构线性结构&#xff1a;线性表、栈、队列、串树形结构图形结构 1.2 物理结构分类 逻辑结构在计算机中的真正表示方式&#xff08;又称为映射&#xff09;称为物理结构&#xff0c;也可叫做存储结构 顺序存储结构&#xff1a;数组链…

百度安全X盈科全球数据合规服务中心:推进数据安全及合规智能化创新领域深化合作

6月19日&#xff0c;百度安全与盈科全球数据合规服务中心举行合作签约仪式&#xff0c;双方将充分发挥各自优势&#xff0c;在数据安全及合规智能化创新领域深化合作&#xff0c;在遵守国家法律法规和顺应市场规则的前提下&#xff0c;推动地方经济社会发展&#xff0c;促进企业…

【财经研究】并购重组的“不可能三角”

伴随着沪深IPO景气度下滑后&#xff0c;并购重组正受到市场的关注。 近期监管层正频频为并购重组发声 6月20日&#xff0c;证监会主席吴清在陆家嘴论坛上指出&#xff1a;“支持上市公司运用各种资本市场工具增强核心竞争力&#xff0c;特别是要发挥好资本市场并购重组主渠道作…

鸿蒙NEXT开发知识:工具常用命令—ohpm config

设置ohpm用户级配置项。 命令格式 ohpm config set <key> <value> ohpm config get <key> ohpm config delete <key> ohpm config list 说明 配置文件中信息以键值对<key> <value>形式存在。 功能描述 ohpm 从命令行和 .ohpmrc 文件中…

vue3 【提效】自动路由(含自定义路由) unplugin-vue-router 实用教程

不再需要为每一个路由编写冗长的 routes 配置啦&#xff0c;新建文件便可自动生成路由&#xff01; 使用方法 1. 安装 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

C++——时间戳转年月日时分秒格式

#include <stdio.h> #include <time.h> int main() { // 获取当前时间&#xff08;以秒为单位的时间戳&#xff09; time_t rawtime; time(&rawtime); // 将时间戳转换为本地时间&#xff08;struct tm&#xff09; struct tm * timeinfo localtime(&…