顶点着色器中的透视划分?

2024-06-22

当在顶点着色器中使用透视矩阵时,我应该编写代码来除以 w 还是在稍后阶段自动完成?

我的问题的原因是我看到很多顶点着色器使用:

gl_Position = matrix * pos;

如果后面有一个阶段将向量除以它的 w 分量,这就有意义了。

然而,直到我在顶点着色器中使用以下内容之前,我从未让它工作:

gl_Position = matrix * pos;
gl_Position = gl_Position / gl_Position.w;

第二个示例是正确的还是可能缺少其他设置?

换句话说:图中所示的步骤OpenGL 顶点变换 http://www.songho.ca/opengl/gl_transform.html(第一张图片)我必须在顶点着色器中写入吗?

我确信模型视图和投影矩阵属于那里(或两者的合并)。视口变换不是顶点着色器的一部分,但是divide by w?

My setup是一些简单的三角形,x/y/z 的坐标在 [-1 1] 范围内。

透视矩阵应该将从 z=-1 到 -10 的坐标投影到 z=-1、x=[-1,1]、y=[-1,1] 上。

-1.0   0.0   0.0   0.0
 0.0  -1.0   0.0   0.0
 0.0   0.0  -1.2  -2.2
 0.0   0.0   1.0   0.0

它是由以下内容生成的:

x = 2.0f * zNear / (xMax - xMin);
y = 2.0f * zNear / (yMax - yMin);
a = -(xMax + xMin) / (xMax - xMin);
b = -(yMax + yMin) / (yMax - yMin);
c = (zFar + zNear) / (zNear - zFar);
d = -(2.0f * zFar * zNear) / (zNear - zFar);

制作矩阵 P:

x, 0, a, 0
0, y, b, 0
0, 0, c, d
0, 0, 1, 0;

最后,我通过矩阵 = P * T 生成最终矩阵,其中 T 是平移 (0,0,-2)

我尝试在 CPU 上进行数学计算,它似乎可以生成预期结果,但是我也手动除以 w。

Update: 已解决,但需要理解

我对矩阵中的所有分量取反(乘以 -1),现在它可以工作了。 上面的示例还存在将正 z 坐标和负 z 坐标投影到投影平面上的问题,这一更改也解决了这个问题。

欢迎任何参考或解释为什么通过此更改解决了这个问题。


您不应该在顶点着色器中自己进行透视划分,它将在稍后的管道中自动完成。

如果这不起作用,您可以展示一些代码或更多地描述问题吗?我很惊讶它对你产生了影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

顶点着色器中的透视划分? 的相关文章

  • OpenGL什么时候完成函数中指针的处理?

    OpenGL有多项功能 http www opengl org wiki GLAPI glTexSubImage2D直接获取指针 他们中有一些从这些指针读取数据 http www opengl org wiki GLAPI glBuffer
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 按像素值偏移 gl_Position 或 gl_Vertex

    我的属性包含像素值 我想用这个属性值来偏移我的 gl vertex 问题是我的 gl vertex 以世界单位为单位 而 offset attribute 以像素为单位 如果我将屏幕尺寸作为统一发送 然后将像素转换为 1 到 1 值 并将其
  • OpenGL - 自动生成 glDrawArrays 的索引/步幅参数

    我正在渲染一个包含大量数据点 gt 1M 的网格结构 我的数据结构如图所示 所以我的索引缓冲区的内容看起来像这样0 100 1 101 2 102 3 103 我对索引缓冲区的巨大尺寸有点恼火 我需要它来定义我的三角形带 是否有可能告诉 O
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 在 OpenGL 中实例化数百万个对象:提高每秒帧数

    我的最终目标是以 60 fps 渲染 100 万个不同尺寸和颜色的球体 我也希望能够在屏幕上移动相机 我已经修改了代码我正在学习的教程的这一页 http learnopengl com Advanced OpenGL Instancing尝
  • 创建并使用我自己的纹理图集的 mipmap

    我目前正在使用自动 mipmap 生成 C OpenTK GL GenerateMipmap GenerateMipmapTarget Texture2D 我使用的纹理平铺为 16px 的块 所以我的问题是 是否可以使用不会缩小至 1x1
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 带有 std::vector 的 VBO

    我用 C 和 OpenGL 编写了一个模型加载器 我用过std vectors 来存储我的顶点数据 但现在我想将其传递给glBufferData 但是数据类型却截然不同 我想知道是否有办法可以相互转换std vector至已记录的const
  • 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

    几天前 由于一些硬件更改 我设置了计算机并安装了新的 Windows 8 副本 其中 我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660 再次设置 Visual Studio 11 后 我从 Github 下载了
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • sRGB 纹理。它是否正确?

    我最近阅读了一些有关 sRGB 格式以及它们如何允许硬件自动对典型显示器执行色彩校正的文章 作为我阅读的一部分 我发现您可以使用普通纹理和返回结果上的 pow 函数来模拟此步骤 无论如何 我想问两个问题 因为我以前从未使用过此功能 首先 有
  • Pygobject GTK3 中 Gtk.GLArea 的使用

    Gtk3 的 python 包装器的使用文档有些有限 我找到了几个常见的小部件示例 我正在尝试使用 Gtk GLArea 小部件 API 文档是针对 C 的 我没有太多运气猜测使用这个小部件的等效 python 调用 在示例中 小部件是使用
  • OpenGL旋转自定义实现

    我正在尝试编写 Opengl glRotatef angle x y z 函数的自定义实现 我写了旋转矩阵 但是当我尝试使用它时 效果与原始函数不一样 这是我的代码 void mglRotate float angle float x fl
  • 使用 OpenGL 进行子弹调试抽屉

    我已经摆弄了子弹一段时间 现在我想绘制调试 我有一个 opengl 世界 具有有效的子弹物理和一切 我尝试过的是这样的 我创建了一个像这样的 GLDebugDrawer 类 include LinearMath btIDebugDraw h
  • 使用 CentOS 在 AWS GPU 实例上运行 OpenGL

    我需要使用 CentOS 在 AWS EC2 GPU 实例上执行一些离屏渲染程序 然而 虽然我发现 Ubuntu 很容易安装 但我无法让 CentOS 正常工作 目标是在 EC2 GPU 实例上运行一些基本的实用程序 测试工具 没有屏幕或
  • 围绕 glutMainLoop 执行程序的其余部分?

    我目前正在开发一个项目 其中有一个 android 应用程序 我在 PC 上的 OpenGL 窗口中编写了控件和对象 我已经让 OpenGL 窗口执行我想要的操作 并且我从 Android 设备获取了数据以流式传输到终端 但是我需要将数据传
  • 推荐用于 Delphi 棋盘游戏的 2D Sprite 引擎? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于 Delphi 精灵引擎 我应该考虑哪些选择 我知道 GLScene 安道尔 2D 我还缺少什么吗 最好是依赖 OpenGL 仅 Di
  • matlab:使用 GPU 保存图形中的图像

    我使用 matlab 渲染复杂的网格 使用 trimesh 材质 camlight 视图 不需要将其显示给用户 只需获取渲染图像即可 这在另一个问题中讨论过 https stackoverflow com questions 4137628
  • 如何为镶嵌矩形构建数据

    我无法弄清楚为镶嵌矩形构建数据所需的函数 目前 这就是我对非镶嵌矩形所做的事情 GLuint Waveindices 0 1 3 1 2 3 std vector

随机推荐

  • Julia - 数组的绝对值

    我想获得以下数组的绝对值 x 1 1 22 3 3 01 1 即 我想要以下类型的输出 x2 1 1 22 3 3 01 1 但是当我输入 abs x 我收到错误 ERROR MethodError no method matching a
  • 当我的 javascript 呈现时,为什么我的
    标记显示为 [object Object]?

    我需要在句子之间添加中断标签 但是当我这样做时 我会得到 object Object 来代替换行符 有人可以告诉我如何解决这个问题吗 const openingText We re happy to hear your project is
  • C# 日期时间到 ODBC 日期时间转换错误

    我们正在尝试将 ODBC 与 SQL Server 2012 一起用于我们的新应用程序 因为 MS 正在逐步淘汰 OleDb 而我们希望尝试使其更容易 更容易 移植到其他数据库 问题是 当我尝试使用 ODBC 数据访问类时 在尝试保存日期时
  • Chrome开发者工具中不显示cookie

    i am using node express server and angularjs as frontend server sets the cookie and is shown correctly in the network re
  • 使用 va_list 获取 EXC_BAD_ACCESS

    按照文章中的示例进行操作http cocoawithlove com 2009 05 variable argument lists in cocoa html http cocoawithlove com 2009 05 variable
  • ng-href 中的 AngularJs if 语句

    我有一些动态创建的元素 每个元素都有不同的 ng href 我想根据某些元素给出不同的链接 当我尝试在 ng href 中编写函数时 它会将页面发送到 url 中的函数 因此它不起作用 我尝试做这样的事情 a a 我应该使用哪种方法来创建具
  • 使字符串“URL 安全”[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中的 URL 友好用户名 https stackoverflow com questions 2103797 url friendly username in php 有没有办法使字符串 UR
  • Postman:如何同时发出多个请求

    我想发布数据Postman谷歌浏览器扩展 我想用不同的数据发出 10 个请求 并且应该同时进行 在邮递员中可以这样做吗 如果是 有人可以向我解释如何实现这一目标吗 我想邮递员中没有这样的功能来运行并发测试 如果我是你 我会考虑Apache
  • Node.js:优雅重启和服务器正常运行时间,如何?

    我一直在使用实时应用程序Node js and Socket io 我想将其从本地测试阶段转移到与我们的一些用户一起进行测试 问题是 如果我关闭到服务器的 ssh 会话 它也会停止我开始使用的服务器node app js 我想过使用nohu
  • 如何计算圆圆周上点的(x或y)坐标?

    px and py是圆圆周上一点的 x 和 y 坐标 Given the center of the circle as cx cy the radius of the circle as r px 如何计算 的值py 谢谢 给定 px p
  • ProgressDialog 中没有进度旋转器

    我正在尝试创建一个 ProgressDialog 就像现在 Play 商店中几乎每个应用程序中看到的那样 我正在使用代码 getActivity runOnUiThread new Runnable Override public void
  • 如何计算函数被调用的次数,FP方式

    我目前正在通过SICP http mitpress mit edu sicp 与哈斯克尔 练习 1 15 询问一个函数被调用了多少次 这个想法可能是您应该使用替换方法 但我想知道如何在代码中执行此操作 在命令式语言中 我们可以保留一个全局变
  • 相互递归泛型枚举

    通用递归enum 我可以轻松地用 Swift 表达一个通用的递归枚举 indirect enum Tree
  • Ghostscript 转换 PDF 并输出为文本文件

    1 我需要将PDF文件转换为txt 文件 我的命令似乎有效 因为我在屏幕上看到了转换后的文本 但不知何故我无法将输出定向到文本文件中 public static string GetArgs string inputPath string
  • 如何告诉 PMD 忽略未使用代码的 @PostConstruct 方法

    我们有一个由 PMD 检查是否存在违规行为的项目 例如未使用的私有方法 我们的问题是我们不知道是否可以忽略带有注释的私有方法 PostConstruct 该规则定义如下
  • 使用自定义布局进行共享扩展

    我想开发带有自定义标注的 ios 共享扩展 在苹果文档中 要提供自定义撰写视图而不是标准视图 请取消选择 Xcode 目标添加中的 使用标准社交撰写界面 窗格 取消选中此复选框时 默认 ShareingViewController 类基于
  • 使用 Thread.sleep 线程休眠时的 CPU 消耗

    我有一个服务器程序 它会轮询数据库以获取新请求 我希望以 1 分钟的间隔进行轮询 因此 我在程序 while 循环中设置了 Thread sleep 问题是 只要该程序应该 睡眠 CPU 消耗就会急剧上升 即大约 25 30 矛盾的是 当程
  • git diff 文件与上次更改的比较

    是否可以让 git 生成当前存在的特定文件与上次更改它之前存在的文件之间的差异 也就是说 如果我们知道 git log oneline myfile 123abc Fix some stuff 456def Frobble the foos
  • 无法在 Linux 上运行 Pyinstaller 可执行文件

    我正在尝试pyinstaller首次 我创建了一个名为hello py只需一行代码 print hello 我使用以下命令来制作二进制文件 pyinstaller hello py 该过程成功完成 并在以下位置创建了一个二进制文件dist
  • 顶点着色器中的透视划分?

    当在顶点着色器中使用透视矩阵时 我应该编写代码来除以 w 还是在稍后阶段自动完成 我的问题的原因是我看到很多顶点着色器使用 gl Position matrix pos 如果后面有一个阶段将向量除以它的 w 分量 这就有意义了 然而 直到我