c - 如何显示这些小三角形或快速识别它们?

标签 c opengl graphics 3d glsl

我正在做的是一个选择程序。有很多三角形,我想通过矩形区域选择前面和可见的三角形。下面介绍主要方法。

  1. 有很多三角形,每个三角形都有自己的颜色。
  2. 将所有三角形绘制到帧缓冲区。
  3. 读取帧缓冲区中像素的颜色,并根据颜色,我们知道选择了哪些三角形。

enter image description here

问题是有一些小三角形无法在最终的帧缓冲区中显示。就像图中的绿色三角形一样。我认为三角形太小而被显卡忽略。

我的问题是如何在最终帧缓冲区中显示小三角形?或者如何知道显卡忽略了哪些三角形?

最佳答案

三角形不会根据其大小而被跳过,但如果像素中心没有落在内部或位于顶部或左侧边缘(这称为覆盖测试),则它们在光栅化期间不会生成任何片段。

这确实意味着某些非常小的三角形永远不会被光栅化,但这并不完全是因为它们的大小,只是因为它们的位置不满足像素覆盖。

花点时间检查 DirectX API 文档中的下图。由于我用红色圈出的三角形的大小位置,该三角形不满足任何像素的覆盖范围(我已在绿色),因此尽管具有有形的表面积,但永远不会显示在屏幕上。

   enter image description here

如果突出显示的三角形在任何方向上移动半个像素,它将覆盖至少一个像素。您仍然不知道它是一个三角形,因为它会显示为单个像素,但它至少是可以选取的。


解决这个问题需要您完全放弃颜色选择。多重采样光栅化可以解决小三角形的覆盖问题,但它会将像素颜色计算为所有样本的平均值,这会破坏颜色拾取。

您唯一可行的解​​决方案是进行三角形内的点测试,而不是依赖光栅化。事实上,颜色选取的典型替代方法是从您的眼睛位置转换光线穿过远剪裁平面,并测试与场景中所有对象的相交。

关于c - 如何显示这些小三角形或快速识别它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27794538/

相关文章:

java - java 中的比例尺不适用于 (-1,1) 或 (1,-1)

C OpenMP - 缩减可扩展性

结合两个 16 位 RGB 颜色与 alpha 混合

c++ - for 循环中的动态数组分配会引发错误

OpenGL 的 glBlendFunc

r - 如何在 R 中的 ggplot2 中的瓷砖上放置标签?

c - 以 OOP 风格处理图形

C - 将变量与 sizeof(int) 进行比较

c - 用c写一个push和pop

c++ - OpenGL 2d 纹理渲染问题