GPU_Gems-物理模型的水模拟

news2024/11/24 14:11:11

创建一个多网格的平面

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.coloradmin.cn/o/1869042.html

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

相关文章

低空经济再获新动能!沃飞长空完成新一轮数亿元融资

当下&#xff0c;作为中国"新质生产力"代表的低空经济正在成为新的发展“风口”&#xff0c;全国各地开足马力加速入场。 低空经济有多“火”&#xff1f;政策方面&#xff0c;据不完全统计&#xff0c;已有26个省份的政府工作报告对发展低空经济作出部署&#xff1…

Mysql需要知道的点

目录 一、数据库的三范式是什么 二、Mysql数据库引擎有哪些 三、说说Innodb与MYISAM的区别 四、数据库的事务 五、索引是什么 六、优化手段有哪些 七、简单说一说 drop&#xff0c;delete与truncate的区别 八、什么是视图 九、什么是内连接、左外连接、右外连接&#x…

mysql中in参数过多优化

优化方式概述 未优化前 SELECT * FROM rb_product rb where sku in(1022044,1009786)方案2示例 public static void main(String[] args) {//往list里面设置3000个值List<String> list new ArrayList<>();for (int i 0; i < 3000; i) {list.add(""…

知识图谱介绍及其应用领域分析

1.知识图谱 知识图谱(Knowledge Graph)乃一种精心设计的技术,旨在储存并整合交织的描述性知识信息。此技术通过构建由实体及其相互关系所组成的网络结构,实现对知识的有序组织与呈现。这些实体涵盖广泛的范畴,包括但不限于具体的物体、事件或抽象概念,它们经由多样化的关…

​​植物大战僵尸杂交版直装版v2.1 安卓版:全新策略塔防体验

《植物大战僵尸杂交版直装版》v2.1是由B站UP主“潜艇伟伟迷”精心制作的同人游戏&#xff0c;为策略塔防手游带来了全新的活力。游戏中引入了众多创新的杂交植物&#xff0c;例如结合了向日葵的阳光生成能力和豌豆射手的攻击特性的向日葵豌豆射手&#xff0c;以及拥有寒冰豌豆射…

2024平价蓝牙耳机推荐哪款?百元左右平价蓝牙耳机推荐

在2024的无线耳机市场中&#xff0c;蓝牙耳机已经成为了主流。无论是对于音乐爱好者还是普通消费者&#xff0c;选择一款音质出色、舒适度高且功能齐全的蓝牙耳机还是很重要的。一款好的蓝牙耳机不仅戴在耳朵上很舒服&#xff0c;而且音质还没有任何的杂音&#xff0c;但现在的…

uniapp字体ttf在小程序报错,解决方法

文章目录 导文解决方法1&#xff1a;把字体改成base64格式解决方法2&#xff1a;改成线上模式 导文 报错1&#xff1a; uniapp 小程序报错&#xff1a;app.js错误: Error: Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js): ModuleBuildErro…

【PWN · TcachebinAttack | UAF】[2024CISCN · 华中赛区] note

一道简单的tcache劫持 一、题目 二、思路 存在UAF&#xff0c;libc版本2.31&#xff0c;经典菜单题 1.通过unsorted-bin-attack来leak-libc 2.通过uaf打tcache-bin-attack劫持__free_hook实现getshell 三、EXP from pwn import * context(archamd64,log_leveldebug)ioproce…

Hive-存储-文件格式

一、前言 数据存储是Hive的基础&#xff0c;选择合适的底层数据存储格式&#xff0c;可以在不改变Hql的前提下得到大的性能提升。类似mysql选择适合场景的存储引擎。 Hive支持的存储格式有 文本格式&#xff08;TextFile&#xff09; 二进制序列化文件 &#xff08;SequenceF…

大家都在聊IPD(集成产品开发)?国内IPD体系做的比较好的是哪款项目管理软件?看IBM、华为的研发管理之道!

IPD&#xff08;集成产品开发&#xff09;到底是什么&#xff1f;一套体系&#xff1f;一些流程&#xff1f;还是一种模式&#xff1f; 一、回顾一下&#xff0c;什么是IPD&#xff1f; IPD到底是什么&#xff1f;一套体系&#xff1f;一些流程&#xff1f;还是一种模式&#…

Batch学习及应用案例

一、介绍 Batch是一种Windows操作系统中使用的批处理脚本语言&#xff0c;用于自动化执行一系列命令和操作。通过编写批处理脚本&#xff0c;可以实现自动化完成重复性或繁琐的任务&#xff0c;提高工作效率。 Batch脚本可以使用内置的命令和命令行工具&#xff0c;以及调用其…

学校机器该maven环境

在学校机器上 安装maven配置idea中的maven 后&#xff0c;发现无法运行&#xff0c; 推测是学校电脑上idea版本和我们下的maven 可能不太匹配。 学校的电脑上idea有集成的maven&#xff0c;但默认配置是访问国外的服务器 解决办法&#xff1a; 下载分享给各位同学的压缩包m…

顺序表--数据结构第一关

顺序表 数据结构概念 定义&#xff1a;数据结构是计算机存储、组织数据的⽅式 根据学过C语言的基础上&#xff0c;数组是最简单的数据结构 顺序表的底层就是数组 为什么呢&#xff1f; 例子如下&#xff1a; int arr[100]{1,2,3,4,5}; //修改某一个数据&#xff1a;arr[…

vcruntime140_1.dll是什么东东?vcruntime140_1.dll缺失的8个解决方法

当电脑出现找不到vcruntime140_1.dll,或vcruntime140_1.dll丢失无法打开软件怎么办&#xff1f;小编今天在本文详细为大家介绍解决方法与介绍vcruntime140_1.dll究竟是什么等vcruntime140_1.dll的问题。 一、vcruntime140_1.dll文件是什么 文件概述定义与功能 vcruntime140_…

校园圈子小程序系统搭建需求和需要哪些功能?APP小程序H5前后端源码交付

功能&#xff1a;小程序授权登陆&#xff0c;支持app双端&#xff0c;小程序&#xff0c;h5&#xff0c;pc端&#xff0c;手机号登陆&#xff0c;发帖&#xff0c;建圈子、发活动。可置顶推荐帖子&#xff0c;关注、粉 丝、点赞等。可作为圈子贴吧、小红书、校园社区、表白墙、…

【02】从0到1构建AI生成思维导图应用 -- 编写主页

【02】从0到1构建AI生成思维导图应用 – 编写主页 大家好&#xff01;最近自己做了一个完全免费的AI生成思维导图的网站&#xff0c;支持下载&#xff0c;编辑和对接微信公众号&#xff0c;可以在这里体验&#xff1a;https://lt2mind.zeabur.app/ 上一章&#xff1a;https:/…

【AI大模型RAG】深入探索检索增强生成(RAG)技术

目录 1. 引言2. RAG技术概述2.1 RAG技术的定义2.2 RAG技术的工作原理2.3 RAG技术的优势2.4 RAG技术的应用场景 3. RAG的工作流程3.1 输入处理3.2 索引建立3.3 信息检索3.4 文档生成3.5 融合与优化 4. RAG范式的演变4.1 初级 RAG 模型4.2 高级 RAG 模型4.3 模块化 RAG 模型优化技…

生命在于学习——Python人工智能原理(2.5.1)

五、Python的类与继承 5.1 Python面向对象编程 在现实世界中存在各种不同形态的事物&#xff0c;这些事物之间存在各种各样的联系。在程序中使用对象来映射现实中的事物&#xff0c;使用对象之间的关系描述事物之间的联系&#xff0c;这种思想用在编程中就是面向对象编程。 …

nodejs国内源下载

nodejs的官网下载太慢了 可以尝试网盘下载快一点 夸克网盘分享夸克网盘是夸克推出的一款云服务产品&#xff0c;功能包括云存储、高清看剧、文件在线解压、PDF一键转换等。通过夸克网盘可随时随地管理和使用照片、文档、手机资料&#xff0c;目前支持Android、iOS、PC、iPad。…

2024年公司加密软件排行榜(企业加密软件推荐)

在信息时代&#xff0c;企业数据安全至关重要&#xff0c;防止数据泄露和未授权访问是首要任务之一。以下是2024年备受好评的企业加密软件排行榜&#xff1a; 固信加密软件https://www.gooxion.com/ 1.固信加密软件 固信加密软件是新一代企业级加密解决方案&#xff0c;采用先…