从能量频谱到振幅
明确目标:我们要生成什么?根据物理海洋学的观测,海面高度通常被认为是一个高斯随机场。这意味着,如果我们想在频域中表达这个海面,我们需要生成一系列复数 $H_0$ 表示振幅,并且这些复数 $H_0$ 必须满足两个条件:
标签 "计算机图形学" 下的所有文章
明确目标:我们要生成什么?根据物理海洋学的观测,海面高度通常被认为是一个高斯随机场。这意味着,如果我们想在频域中表达这个海面,我们需要生成一系列复数 $H_0$ 表示振幅,并且这些复数 $H_0$ 必须满足两个条件:
真实的海浪是由风吹拂产生的,所以波浪的主要传播方向应该与风向 一致。但风是混沌的,波浪不会 100% 笔直地顺着风走,而是会以风向为主轴,向两侧呈扇形发散。
为了便于表示频谱信息和后续的傅里叶变换,我们需要从原本的基于像素位置的坐标空间,通过平移、拉伸,构建出原点在中心的、以基频为单位的波数坐标。 平移:居中处理 HLSL 折叠 复制 float nx = (float)id.x - (float)Size / 2.0; float …
JONSWAP 公式 (Joint North Sea Wave Project Spectrum) 是海洋工程和海岸工程中广泛使用的风浪频谱模型。 JONSWAP 数学公式公式和参数$$ S(\omega) = \alpha g^2 \omega^{-5} \exp\left[ …
从像素坐标空间(空间域)到波矢量(波数域) /posts/ac8a5d7f 2. 使用 JONSWAP 初始化海洋频谱
Gerstner Waves 简介Gerstner Waves 最初是作为流体力学的一个精确解析解(严格推导)被提出,假设每一个水质点都在做圆周运动,那么在忽略粘性和假设流体不可压缩的情况下,这组方程可以完美满足流体力学的基本方程。 尽管 Gerstner Waves 是严格的数 …
前置计算:通过ddx、ddy计算 T、B数学推导1. 曲面参数化定义设三维几何表面由纹理坐标 $(u, v)$ 参数化,表面上的任意点 $P$ 可表示为:
深度图重建世界空间是从深度信息计算出对应像素的世界位置坐标,对于实现如阴影映射、环境遮挡和后处理效果(例如景深和运动模糊)等高级图形效果至关重要。
在HLSL中,常量缓冲区 Constant Buffer(简称 CBuffer) 是一种用于在 CPU 与 GPU 之间高效传输常量数据 的机制,其对常量变量使用进行了优化,其特点是访问延迟更低,CPU 更新更频繁。
注意 适用于DirectX10+的语法,旧版参考: 2D 纹理(Built-In)
GLFW 的事件机制基于回调函数(Callback Functions) 和事件轮询(Event Polling) 实现,其核心设计围绕“事件驱动”模型。 核心机制回调函数 CallbacksGLFW 允许用户注册自定义函数(回调函数),当特定事件发生时(如键盘输入、鼠标点击、窗 …
internalformatinternalformat指的是函数glTexImage2D的一个参数,它指定的是纹理数据最终存储在GPU显存中所采用的格式。
齐次裁剪空间 Homogenous Clip Space在OpenGL等图形API中,顶点在通过顶点着色器(Vertex Shader)处理后,通常会输出一个 vec4 类型的位置变量,称为 gl_Position。这个 gl_Position 就处于 齐次裁剪空间 …
读取图像在使用纹理前,我们需要将读取对应的图像文件到CPU并对其进行解析。然而OpenGL作为图形API并不提供读取、解析图像文件的功能,因此我们需要自己实现或调用第三方库,这里就以第三方项目stb 的stb_image为例。
在计算机中颜色信息有两个重要参数,一是通道,二是位深。 更多详见:glTexImage2D - OpenGL 4 Reference Pages 通道指的是用于表示一个像素颜色所需独立数值的数量,决定了数据的存储格式,更多的通道能够表示更丰富的色彩。
MVP,全称是Model-View-Projection,是计算机拿到你的模型之后,把他呈现到你屏幕上进行的变换的必要流程,将局部空间变换到裁剪空间。
Uniform 块std140 内存布局规则OpenGL 提供了不同的 layout 策略来定义 Uniform 块的内存布局。最常用的是 std140,其规则如下:
Uniform 是在着色器程序运行期间保持不变的全局变量(由CPU设置),用于从应用程序向着色器(Vertex/Fragment等)传递数据。 它是 只读变量(在 shader 中不能修改) 生命周期为 一次绘制调用(Draw Call) 所有顶点/片段共享同一个 uniform …
OBJ 文件是一种简单的文本格式,用于存储 3D 模型信息(顶点、法线、纹理坐标、面连接关系)。 顶点坐标 (Vertex Position) 关键字: v 格式: v x y z [w] x, y, z: 三维坐标(浮点数) w: 可选齐次坐标,默认值 1.0 示例: OBJ …
结构体 声明: GLSL 折叠 复制 struct Vertex { vec3 position; } 点击展开查看更多 使用: GLSL 折叠 复制 void main() { Vertex vtx; vtx.position = vec3(1); } 点击展开查看更多 注意 …
判断一个面的朝向(正面或背面)主要基于顶点缠绕顺序(Winding Order) 的规则。 缠绕顺序(Winding Order) 当定义三角形时,三个顶点的连接顺序决定了面的“缠绕方向”。 默认规则: 逆时针(CCW) 顶点顺序 → 正面(Front Face) 顺时针(CW) …
纹理环绕方式 环绕方式 描述 对应OpenGL选项 重复 重复纹理图像 GL_REPEAT 镜像重复 和重复一样,但每次重复图片是镜像放置的 GL_MIRRORED_REPEAT 边缘钳制 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘 …
假如你有一个有许多模型的场景,而这些模型的顶点数据都一样,只是进行了不同的世界空间的变换、顶点属性等,多次绘制之后,很快将达到一个瓶颈,这是因为你glDrawArrays或glDrawElements这样的函数(Draw call)过多。 如果我们能够将数据一次发送给GPU,然 …
执行渲染执行渲染所需: 完整的ShaderProgram VAO C 折叠 复制 glUseProgram(ShaderProgramID); // 使用着色器 glBindVertexArray(VAO); // 绑定VAO /* --- 绘制函数 --- */ // 法一:基 …
在执行渲染之前,需要将各种顶点相关的数据传递到顶点着色器中,如位置、法线、UV等 顶点数据传递流程 flowchart TB subgraph EBO["EBO"] e1["glGenBuffers"] --> …
编译 C 折叠 复制 // 创建着色器对象 GLuint id = glCreateShader(GL_VERTEX_SHADER); // 传入着色器源码 glShaderSource(id, 1, &source_chars, NULL); // 编译着色器 …
GLAD 是一个开源的OpenGL 加载库(OpenGL Loader Library),它的主要作用是帮助开发者在不同的平台和环境下,动态加载 OpenGL 的函数指针,从而实现对 OpenGL 高级特性的访问。
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的。
渲染流程 GLFW 最小系统
着色器管线 flowchart LR c1["CPU"] --> s1["顶点着色器"] subgraph x["细分着色器"] s2["细分控制着色器"] --> s3["细分验证着色器 …
注意 在HLSL中为ddx、ddy 原理在光栅化时,GPUs会在同一时刻并行运行很多Fragment Shader,但是并不是一个Pixel一个Pixel去执行的,而是将其组织在2x2的一组Pixels分块中,去并行执行。而偏导数(dFdx、dFdy)就正好是计算的这一块像素中 …
为什么要进行Model变换原始的法线向量是模型空间(局部坐标系)的,当我们需要进行光照计算时,便需要将法线向量转换到世界空间,参与与同为世界空间的光照计算(或者处理光照向量)。
输入关键词搜索文章内容