OpenGL GL_LINES端点没有加入

old*_*ool 12 opengl

替代文字我遇到了GL_LINES块的问题......下面示例中的行不会在末端连接(尽管有时会随机决定连接一个或两个角).相反,端点在彼此的1个像素内(留下一个未完全平方的角;如果这是有意义的话).这是一个绘制实心1像素矩形的简单方块.

 glBegin(GL_LINES);

  glColor3b(cr, cg, cb);

  glVertex3i(pRect->left, pRect->top, 0);
  glVertex3i(pRect->right, pRect->top, 0);

  glVertex3i(pRect->right, pRect->top, 0);
  glVertex3i(pRect->right, pRect->bottom, 0);

  glVertex3i(pRect->right, pRect->bottom, 0);
  glVertex3i(pRect->left, pRect->bottom, 0);

  glVertex3i(pRect->left, pRect->bottom, 0);
  glVertex3i(pRect->left, pRect->top, 0);

 glEnd();
Run Code Online (Sandbox Code Playgroud)

下面的示例似乎可以解决问题,给我一个锋利的方角; 但是我不能接受它,因为我不知道它为什么这样做......

 glBegin(GL_LINES);

  glColor3b(cr, cg, cb);

  glVertex3i(pRect->left, pRect->top, 0);
  glVertex3i(pRect->right + 1, pRect->top, 0);

  glVertex3i(pRect->right, pRect->top, 0);
  glVertex3i(pRect->right, pRect->bottom + 1, 0);

  glVertex3i(pRect->right, pRect->bottom, 0);
  glVertex3i(pRect->left - 1, pRect->bottom, 0);

  glVertex3i(pRect->left, pRect->bottom, 0);
  glVertex3i(pRect->left, pRect->top - 1, 0);

 glEnd();
Run Code Online (Sandbox Code Playgroud)

任何可以帮助的OpenGL程序员,我会很感激:)

图片是屏幕截图的放大视图.如您所见,左上角未连接.右上角是.看不到左下角和右下角,没有连接.

视口设置为每个坐标1到1个像素.

glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, __nRendererWidth, __nRendererHeight, 0, -1, 100);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glEnable (GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 13

问题14.090的OpenGL常见问题解答:

14.090如何获得线条的精确像素化?

OpenGL规范允许使用各种线性渲染硬件,因此可能根本无法进行精确的像素化.

您可能希望阅读OpenGL规范并熟悉钻石退出规则.熟悉此规则将为您提供获得精确像素化的最佳机会.简而言之,钻石退出规则指定每个像素内存在菱形区域.仅当该线的数学定义退出该像素内刻的菱形时,才通过线栅格化像素.

然后从OpenGL核心配置文件规范的第3.5节:

由于钻石退出规则的初始条件和最终条件可能难以实现,因此允许使用其他线段栅格化算法,但须遵守以下规则:

  1. 由算法产生的片段的坐标在x或y窗口坐标中不会偏离由钻石退出规则产生的相应片段的多于一个单位.
  2. 算法产生的碎片总数可能与钻石退出规则产生的碎片总数不同,不超过一个.
  3. 对于x-major线,不会产生位于同一窗口坐标列中的两个片段(对于y-主线,在同一行中不会出现两个片段).
  4. 如果两个线段共享一个公共端点,并且两个线段都是x-major(从左到右或从右到左)或y-major(从下到上或从上到下)然后,光栅化两个段可能不会产生重复的片段,也不能省略任何片段以中断连接段的连续性.

因此,答案是规范不需要像您期望的那样加入行.如果你的线都是x-major或者所有y-major,那么上面的规则#4会给你预期的输出,但是在你的矩形中,你在x-major和y-major线之间交替.

如果要保证连接的线条没有间隙或重叠,则应使用GL_LINE_LOOP(或GL_LINE_STRIP对于未在其开始的位置连接的连接系列)进行渲染,而不是GL_LINES.

  • `GL_LINE_LOOP` 和 `GL_LINE_STRIP` 相当于一个 `GL_LINES` 序列。这并不能“保证连接线没有间隙或重叠”。 (2认同)

Ben*_*igt 5

由于您正在绘制闭合多边形,因此您可能希望使用它GL_LINE_LOOP.

  • 我尝试使用GL_LINE_LOOP,遗憾的是它提供了相同的结果 (5认同)