opengl - OpenGL 在流水线中乘以哪些矩阵?

标签 opengl matrix vertex-shader

最后一段时间我一直在组合一个 OpenGL 程序,我已经到了在我的变换矩阵(模型变换、相机变换和透视变换)中编码的地步。到目前为止,我一直在计算我的模型变换并发送到一个统一体并在顶点着色器中将其相乘。最近,我将相机和透视变换添加到发送到着色器中的统一体的矩阵中。

但是现在,很多事情都不起作用,还有一些我无法理解的事情:

首先,this webpage说 OpenGL 会自动将所有内容除以位置的 Z 分量(用于透视变换),但我无法弄清楚发生这种情况的地方,其次:

numberresources那个mention OpenGL 函数,例如 glFrustumf()、glMatrixMode()、glPushMatrix()、glPopMatrix()、glLoadIdentity()、gRotatef() 等。所有这些似乎在 OpenGL 中传递和修改矩阵的函数,我不需要打扰与它们在顶点着色器中。

所以现在我完全不知道如何在 OpenGL 中完成转换。我们是自己计算它们并在顶点着色器中将它们相乘,还是将参数发送到 OpenGL 并让它完成 API 背后的所有工作,或者其他完全不同的事情?

谢谢

最佳答案

透视部
一旦您通过 ModelViewProjection 矩阵转换了您的顶点,它们就在裁剪空间中。如果不将 x、y 和 z 分量除以 w 分量,则值在 -w 到 w 的范围内。超出该范围的所有内容都将被剪裁。
透视除法(除以 w 分量)将该范围变为 -1 到 1,称为“标准化设备坐标”。这是由 OpenGL 在顶点着色器输出 gl_Position 上自动完成的。这(如果我没记错的话)是针对硬件完成的,因此所有后续计算都不必考虑可变范围。
固定与可编程管道
如果您使用uniforms 将您自己的变换传递给顶点着色器,那么您使用的是现代OpenGL 管道(是的!)。这使您可以完全控制顶点的变换。
如果您使用过时的函数,例如 glFrustumf()、glMatrixMode()、glPushMatrix()、glPopMatrix()、glLoadIdentity()、gRotatef() 等,那么您使用的是旧的固定函数管道。

关于opengl - OpenGL 在流水线中乘以哪些矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24852934/

相关文章:

c++ - 我如何有效地处理 OpenGL 中的大量逐顶点属性?

opengl - 阵列纹理是否与采样器阵列相关?

opengl - 如何在OpenGL中绘制2D不规则曲线形状

algorithm - 给定一个包含随机数的矩阵,如果某个位置有1,则使该行和该列的所有元素都为1

metal - 如何在 Metal 顶点着色器 MTL 顶点属性描述符中描述 packed_float3?

opengl-es - WebGL - 在平面上显示球体

c++ - 如何将指向 GLEW 函数的指针传递给模板?

c++ - 为 OpenGL 纹理加载带有 stb_image 的 PNG 会给出错误的颜色

arrays - 已排序矩阵中的第 K 个最小元素

algorithm - 在矩阵中查找 k 组不相交的行