opengl - 为什么模型 View 矩阵?

标签 opengl glsl glsles

如果这是一个愚蠢的问题,我很抱歉,但我想知道为什么有这么多示例顶点着色器,包含一个模型 View 矩阵。在我的程序中我有以下情况:

  • 投影矩阵几乎不会改变(例如在调整应用程序窗口大小时)并且它是独立的,这很好,
  • 模型矩阵经常变化(例如对模型进行变换),
  • View 矩阵也经常更改(例如,更改 View 方向、四处移动……)。

如果我要在顶点着色器中使用模型 View 矩阵,我必须在 CPU 上执行矩阵乘法并上传单个矩阵。另一种方法是同时上传模型和 View 矩阵,然后在 GPU 上进行乘法运算。关键是, View 矩阵不一定与模型矩阵同时发生变化,但如果使用模型 View 矩阵,则无论何时其中任何一个发生变化,都必须执行 CPU 乘法和上传。为什么不使用单独的 View 和模型矩阵来进行快速 GPU 乘法运算,并且可能使用大约相同数量的 GPU 矩阵上传?

最佳答案

因为在顶点着色器中将矩阵相乘会使 GPU 对进入其中的每个顶点进行完整计算(请注意,最近的 GLSL 编译器会检测到所有顶点的乘积是一致的,并且可能会取消计算GPU 到 CPU)。

此外,在执行单个 4×4 矩阵计算时,CPU 实际上优于 GPU,因为没有数据传输和命令队列开销。

GPU 计算的一般规则是:如果它在所有顶点上都是一致的,并且您可以轻松地在 CPU 上预先计算它,那就在 CPU 上进行。

关于opengl - 为什么模型 View 矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290537/

相关文章:

opengl - 为什么视网膜屏幕坐标值是像素值的两倍

three.js - 如何在 Three.js 中使用着色器实现平滑过渡?

c++ - OpenGL在不同的VBO中绘制具有不同颜色、顶点位置和顶点颜色的点?

c++ - 如何将这些 OpenGL 着色器转换为适用于 Android NDK 的 GLES3 的 OpenGL ES 着色器?

android - Android 设备上的 OpenGLES 3.0 着色器编译错误,用于输入和输出存储限定符

macos - 循环遍历所有像素并在 OpenGL 中获取/设置单个像素颜色?

opengl - 使用 FreeImage 加载图像

c++ - 从文件加载后,顶点着色器和片段着色器均未编译

android - 阴影贴图在 Android 上的 OpenGL ES 3.0 中不起作用

java - Mapbox Android SDK 崩溃 - "java.lang.Error: Vertex shader fill failed to compile"