opengl - 为什么片段不一定与像素一一对应?

标签 opengl

这里很好地解释了什么是片段:

https://gamedev.stackexchange.com/questions/8977/what-is-a-fragment/8981#8981

但是here (不仅在这里)我读到“我想强调一个事实,一个像素不一定是一个片段,多个片段可以组合成一个像素......”。但是我不太清楚什么是碎片,为什么它们不一定与像素一一对应?

编辑:当多个片段形成一个像素时,只有在投影后它们重叠的情况下,或者是因为像素大于片段,因此您需要将多个相同的片段并排放在一起颜色形成一个像素?

最佳答案

片段有一个位置,可以通过其内置的 gl_FragCoord 变量查询,其中 xy 组件直接对应于像素在你的屏幕上。所以你可以说一个片段确实对应于一个像素。

但是,片段会输出一种颜色并将该颜色存储在其坐标处的颜色缓冲区中。这并不意味着这种颜色是显示给观众的实际像素颜色。

因为为每个对象运行一个片段着色器,所以可能会在您的第一个对象之后绘制其他对象,该对象也在同一屏幕坐标处输出片段。在考虑深度测试、模板测试和混合时,颜色缓冲区中生成的颜色值可能会被新颜色覆盖和/或合并。

可以这样想:

Object 1 gets drawn and draws the color purple at screen coordinate (200, 300);
Object 2 gets drawn and draws the color red at same coordinate, overwriting it.
Object 3 (is blue) has transparency of 50% at same coordinate, and merges colors.
Final fragment color output is then combination of red and blue (50%).

最终生成的像素可能是来自单个片段着色器运行的颜色、被许多其他片段着色器运行覆盖的颜色,或者通过混合的颜色组合。

关于opengl - 为什么片段不一定与像素一一对应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463536/

相关文章:

GL_QUAD_STRIP 上的 OpenGL 照明和着色

python - 使用 pyglet 时的纹理边框

c++ - 内部库类型是否应该通过我的库界面可见?

cocoa - 多显示器上的 OpenGL

c++ - 使用 openGL 在 SDL2 中全屏显示一个窗口

c# - "Emulating"Application.Run 使用 Application.DoEvents

c++ - 立方体是在什么时候绘制的?

c++ - 通过 OpenGL Assimp 加载的对象有时会反转法线

c++ - OpenFrameworks 中的透明背景窗口

opengl - 顶点数组对象和缓冲区对象的区别?