固定功能与固定功能着色器 - 帮助理解概念差异

2024-03-10

我的背景:几个月前,我第一次开始尝试 OpenGL,没有什么特殊目的,只是为了好玩。我开始阅读 OpenGL 红皮书,并最终了解了如何制作一个具有多种不同光照的行星系统。这种情况持续了一个月,我对 openGL 的兴趣就消失了。大约一周前它再次醒来,正如我从一些 SO 帖子中收集到的那样,红皮书已经过时了,OpenGL Superbible 是更好的学习资源。所以我开始阅读它。我喜欢着色器的概念,但由于我对固定管道的旧记忆和着色器的新概念的转变,我的大脑中出现了真正的混乱。

问题:我想写一些我认为正确的陈述,并请OpenGL专家验证它们(即我的理解是否正确、不完全正确或完全错误)。所以...

1)如果我们不这样做use任何着色器程序都不会发生任何变化。我们有当前的颜色,当前的法线,当前的变换矩阵,当前的一切,只要我们调用glVertex**(...)获取这些当前值并将顶点馈送到...我不知道什么。事实上,它是用当前矩阵进行转换的,当前颜色和法线应用于它等等。

2)一旦我们use着色器程序,以上所有都停止工作。那是,glColor, glRotate等等没有任何意义(是吗?)。我是说,glColor仍然设置当前颜色,glRotate仍然将当前矩阵乘以旋转矩阵,但根本不使用它们。相反,我们通过以下方式提供顶点属性glVertexAttrib。哪个属性意味着什么完全取决于我们的顶点着色器和in变量绑定。我们还找到并设置制服的值,然后调用glVertex并且着色器被执行(我不知道立即或调用 glEnd() 之后)。实际的顶点和片段处理完全在着色器程序中手动完成。

3) 着色器不会为深度测试添加任何内容。也就是说,我不需要在着色器中处理它。我只是打电话glEnable(GL_DEPTH_TEST)。面部剔除也不受影响。

4) 着色器中不需要考虑 Alpha 混合和抗锯齿。glEnable打电话就足够了。

5) 使用 gluPerspective、glRotate、glPushMatrix 和其他矩阵函数,然后检索当前矩阵并将其作为统一的着色器提供给着色器,这是一个好主意吗?因此不需要使用第三方矩阵库。


  1. 这取决于您所讨论的 OpenGL 版本。在 OpenGL 3.0 之前,所有固定功能仍然存在,所以是的,如果您决定仅使用固定功能,它会继续像往常一样工作。从 3.0 开始,相当多的固定管道被弃用,从 3.1 开始它完全消失了。使用这些,您不再真正可以选择仅使用固定管道。

  2. 同样,这取决于。例如,直到 OpenGL 3.0,即使您使用着色器,仍然支持 glColor。不同之处在于,它不是自动应用于绘制的内容,而是提供给着色器,着色器可以不加修改地使用它,根据需要修改它,或者完全忽略它。因此,片段着色器接收 gl_FrontColor 和 gl_BackColor,并将实际片段颜色写入 gl_FragColor。然而,如果您使用的是 OpenGL 3.1 或更新版本,glColor(例如)将不再存在——颜色将只是您提供给着色器的另一个值,就像您可以/愿意提供的任何其他值一样。

  3. 这是正确的,至少到 OpenGL 3.1 为止都是如此。从 4.0 开始,有一个新的计算着色器(我相信)可以参与深度测试之类的事情(但我没有使用过它,所以我对此有点不确定)。

  4. 是的,您仍然可以使用内置的 Alpha 混合。根据您的硬件,您可能还需要考虑使用 gl_ARB_draw_buffers_blend 扩展(如果我没记错的话,从 OpenGL 4 开始这是强制性的)。

  5. 同样,这取决于您所讨论的 OpenGL 版本。当前的 OpenGL 完全消除了对矩阵的所有支持,因此您别无选择,只能使用其他矩阵库。旧版本向您的着色器提供像 gl_ModelViewMatrix 和 gl_NormalMatrix 这样的东西作为统一,因此您可以选择这条路线。

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

固定功能与固定功能着色器 - 帮助理解概念差异 的相关文章

  • OpenGL:VAO 和 VBO 对于大型多边形渲染任务是否实用?

    如果您想渲染一次在视锥体中包含数千个多边形的大型景观 并且用户的视点不断变化 那么使用 VAO 或 VBO 是否实用 我的意思是 每次玩家的位置或摄像机旋转发生变化时 您都必须重新计算顶点数据 以便正确剔除不再可见的任何顶点或场景 以保持良
  • glm 中矩阵值的顺序不正确?

    我开始使用GLM http glm g truc net通过 OpenGL 3 和 GLSL 进行数学运算的库 我需要正交投影来绘制 2D 图形 所以我编写了这个简单的代码 glm mat4 projection 1 0 projectio
  • GL_COLOR_ATTACHMENT 有什么作用?

    我现在正在学习帧缓冲区 但我只是不明白颜色附件的作用 我了解帧缓冲区 第二个参数的意义是什么 glFramebufferTexture2D GL FRAMEBUFFER GL COLOR ATTACHMENT0 GL TEXTURE 2D
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 如何在多采样纹理上渲染帧缓冲区对象?

    我目前有一个使用多个通道的渲染引擎 其中图像的各个部分在纹理上渲染 然后使用着色器进行组合 它有效 现在我想激活多重采样 我在这里读到 http www opengl org wiki Framebuffer Object Examples
  • 带有 std::vector 的 VBO

    我用 C 和 OpenGL 编写了一个模型加载器 我用过std vectors 来存储我的顶点数据 但现在我想将其传递给glBufferData 但是数据类型却截然不同 我想知道是否有办法可以相互转换std vector至已记录的const
  • OpenSceneGraph 将相机设置在初始位置

    我是第一次使用 OpenSceneGraph 我有点迷失 因为文档确实不太清楚 所以 我有这段代码加载一个带有房子的 obj 文件 并且我在我想要的 人 所在的地方淹没了一个小盒子 所以现在 我不想把那个盒子放在那里 而是想把相机放在那里
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将
  • Shader的功能参数表现

    我试图了解如何在着色器语言中实现传递参数 我读过几篇文章和文档 但仍然有一些疑问 特别是我试图理解与C 函数调用 特别强调性能 之间略有差异HLSL Cg and GLSL但我猜下划线的实现非常相似 到目前为止我所理解的 除非另有说明 函数
  • 如何创建自己的 openGL 上下文并将其绑定到 GLCanvas?

    所以当我开始掌握java时 paint Graphics g 我继续创建自己的渲染方法 但我必须了解缓冲区策略以及如何 获取 图形 所以现在我在学习openGL 我必须掌握方法 Override public void display GL
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 在 OpenGL 中设置 MVP 矩阵

    我正在尝试学习 OpenGL 的基础知识 但我在设置变换矩阵时遇到问题 我制作了模型 视图和投影矩阵 但将它们发送到我的顶点着色器时遇到问题 这是代码 Set up MVP glm mat4 model glm mat4 GLint uni
  • sRGB 纹理。它是否正确?

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

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • 计算着色器中的 Image2D

    我想使用 image2D 作为顶点的 2D 存储 该顶点将由计算着色器修改 但不起作用 创建纹理 glGenTextures 1 HeightMap glBindTexture GL TEXTURE 2D HeightMap glTexIm
  • 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
  • 纹理映射和光照顶点着色器错误 Java OpenGL

    我正在尝试将纹理映射到 3D 立方体并尝试编写着色器以使其具有照明和纹理 我尝试过只编写纹理着色器并且它有效 我还尝试过仅将 3D 值设置为红色的照明着色器 并且该照明着色器也可以工作 但当我尝试将两者结合起来时 我遇到了问题 我在下面提供
  • Opengl 简单片段着色器在纹理上覆盖半透明三角形条

    我有一个带纹理的三角形条 形成一个四边形 当您单击它时 我希望周围的区域用半透明的四边形标记 这样您仍然可以看到下面的纹理 我的四边形显示正确 但它们根本不透明 并且完全覆盖了下面的任何内容 我有一个非常简单的片段着色器 我认为可以使用它g

随机推荐

  • 如何将额外的自定义 ./configure autotools 选项传递给 Buildroot 包?

    例如 我想添加选项 enable foo enable bar to a configure命令 Many configure选项可以通过间接设置BR2 配置 但许多软件有如此多的选项 以至于不可能只有一个BR2 为每一个可能的配置 con
  • Blazor 服务器应用程序组件突然抛出空引用异常

    今天 当我在 Visual Studio 2022 中以调试模式启动 Blazor 服务器应用程序时 我几周来每天开发的 Blazor 服务器应用程序突然开始在 Host cshtml 中引发异常 错误如附图所示 Host cshtml 的
  • 如何从一堆变量中选择最小值?

    假设我有变量 a b c and d全部都有数字 我想获得最小 最大 值 我的典型 XSLT 1 0 方法是
  • 在浏览器关闭选项卡或浏览器退出时运行方法

    是否有一个可以在 Javascript Angular JQuery 中使用的操作处理程序 可以安排在 Web 浏览器中关闭选项卡之前执行的方法 关闭我的意思是退出浏览器或关闭选项卡或崩溃或其他什么 是的 你只需绑定beforeunload
  • 如何在java中从周数、年份和星期几获取日期?

    我有周数 相应的年份和周数 即 1 表示星期一 2 表示星期二 依此类推 有没有办法在java中找到带有这些信息的日期 以下是我在网上找到的一个方法 int week 51 LocalDate wkstart LocalDate now w
  • 如何避免 VBA 中的默认属性陷阱?

    我只是偶尔使用 VBA 每次我回到 VBA 时 我都会遇到以下一些变化 我有一个Range目的 currentCell 我用它来跟踪我在电子表格中使用的单元格 当我更新它以指向不同的单元格时 我写道 currentCell currentC
  • Django - 网站主页

    我一直在研究 Django 从我所看到的来看 它真是太棒了 然而 我有点困惑 如何为我的网站实现 主页 它是一个单独的应用程序 还是只是项目中的一个视图 还是什么 对此没有真正的规则 但我喜欢做的一件事实际上是安排索引访问重定向到另一个位置
  • html 元素上的 title 属性有什么用?

    html 元素上的 title 属性有什么用 div class myDiv title This is the title Stuff div 它的目的是用作工具提示吗 它还有什么进一步的用处吗 差不多了 HTML 规范称之为咨询文本 h
  • 如何在Cron上动态设置变量?

    我正在尝试将 cron 文件放置在 etc croon 中 d 我的问题是我不想保持此文件更新 所以我正在寻找一种从文件动态获取软件版本的方法 我几乎没有其他变量 但现在我认为问题在于 cat software VERSION 它在 she
  • 在 jQuery 中取消延迟的 Promise

    如何在不从 DOM 中删除元素的情况下取消 Promise fiddle http jsfiddle net ripper234 LG9eZ 4 我运行了这段代码 box delay 2000 show slow delay 2000 pr
  • MonadFix 用严格的语言

    我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展 并试图弄清楚 GHC 如何编译递归 do 绑定 使用 XDoRec 启用 我想知道一元定点组合器是否可能以严格的语言存在 如 Ocaml F SML 如
  • Codeigniter 中的“gd-jpeg、libjpeg:可恢复错误:JPEG 文件过早结束”

    我正在使用 CodeIgniter 并尝试创建图像的拇指 我在某些情况下取得了成功 但在某些情况下失败了 我收到以下错误 lt lt A PHP Error was encountered Severity Notice Message i
  • 如何在没有 br 的情况下在 html 中进行换行 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有很多内容 我将把它上传到我的网站 在网站中它看起来没有换行符 添加内容需要花费很多时间 br 还有其他方法可以断线吗
  • 索引 API 403 权限被拒绝。无法验证 URL 所有权

    我想执行示例中的代码 require once google api php client vendor autoload php client new Google Client service account file json is
  • Jquery Mobile页面的Loading()方法是如何工作的?

    我是 Jquery Mobile 的新手 并在重新开发此移动网站时尝试学习它 因此 我使用 data role page 使用不同的 div 进行所有导航 并使用 pagename 进行导航 我的问题是以这种方式进行导航 如何使用加载消息并
  • ParseImageView 是否缓存 ParseFile

    ParseImageView 是否缓存 Android 中的 ParseFile 如果它缓存了 parseFile 我如何在我的 Android 设备中找到这些文件的路径 ParseImageView imageView ParseImag
  • Laravel:如何对忽略某种语言文章的雄辩集合进行排序?

    在 Laravel 中 有没有什么方法可以对集合进行排序而忽略某种语言中的文章 例如英语中的 a an the 西班牙语中的 el la 等 我想要类似的东西jQuery 表排序器 https mottie github io tables
  • 订阅后进行条带收费,从订阅中获取元数据

    当我创建订阅时 我设置了一些元数据来标识我在数据库上的订单 当我收到 webhook 时charge succeeded订阅中的元数据未在此事件中传递 我无法识别与此付款相关的订单 如何发送与订阅相关的每个 Webhook 上的元数据 订阅
  • 如何设置 checkbox.isChecked 而不引发事件

    有没有办法检查CheckBox而不运行与检查相关的代码 只是为了视觉外观 Edit private void normalCheck Checked object sender RoutedEventArgs e normal 想象一下我想
  • 固定功能与固定功能着色器 - 帮助理解概念差异

    我的背景 几个月前 我第一次开始尝试 OpenGL 没有什么特殊目的 只是为了好玩 我开始阅读 OpenGL 红皮书 并最终了解了如何制作一个具有多种不同光照的行星系统 这种情况持续了一个月 我对 openGL 的兴趣就消失了 大约一周前它