显示垂直于屏幕的四边形
Posted
技术标签:
【中文标题】显示垂直于屏幕的四边形【英文标题】:Display a quad perpendicular to the screen 【发布时间】:2015-03-18 12:27:24 【问题描述】:当绘制一个四边形时,当旋转到一个垂直于屏幕的位置时它就会消失。理想情况下,我希望看到的是 (b) 但我什么也得不到
我的代码有问题吗? (警告旧的 openGL 代码如下)
void draw_rect(double vector[4][3], int rgb[3], double transp)
GLint is_depth, is_blend, blend_src, blend_dst;
glGetIntegerv(GL_DEPTH_WRITEMASK, &is_depth);
glGetIntegerv(GL_BLEND, &is_blend);
glGetIntegerv(GL_BLEND_SRC, &blend_src);
glGetIntegerv(GL_BLEND_DST, &blend_dst);
glEnable(GL_BLEND);
glDepthMask(0);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// code to set the color ...
glBegin(GL_POLYGON);
glVertex3v(&vector[0][0]);
glVertex3v(&vector[1][0]);
glVertex3v(&vector[2][0]);
glVertex3v(&vector[3][0]);
glEnd();
if (!is_blend) glDisable(GL_BLEND);
glDepthMask(is_depth);
glBlendFunc(blend_src, blend_dst);
【问题讨论】:
我会说这种行为是正确的。由于你在一层中有一个四边形,它没有深度,所以如果你垂直看它,它的大小为 0。按预期工作。你可以把它做成一个很浅的立方体。 @SinisterMJ 够公平的;我从标题中删除了“正确地”这个词,所以也许我们可以专注于你刚刚给出的提示 如果填充的图元(例如四边形)垂直于图像平面,则它没有光栅化表面区域。您是否考虑过使用GL_LINES
来绘制这些垂直四边形?线和点基元总是有保证的宽度。
【参考方案1】:
四边形(假设它由共面定义,如本例所示)根据定义是无限薄的。垂直于相机时不可见是正确的行为。
“正确”的解决方案是制作一个盒子而不是一个四边形。
有关使用多维数据集的示例,请参阅 Drawing cube 3D using Opengl。您需要调整顶点位置以使立方体沿一维(可能是 Z)更小,但它会给您带来您正在寻找的效果。
另外,停止使用固定函数 stuff(glVertex
等)。它已被弃用多年。着色器并不难,通过您最喜欢的搜索引擎很容易找到示例。
【讨论】:
立即模式(glVertex
等)与着色器正交。您可以在即时模式下使用着色器,也可以将固定功能管道与数组,甚至缓冲区对象一起使用。【参考方案2】:
当四边形垂直于屏幕时,尝试使其成为一条具有一定宽度的线
【讨论】:
以上是关于显示垂直于屏幕的四边形的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 如何使用 ListView 水平和 GridView 垂直滚动屏幕