在C中绘制像素

时间:2013-11-21 14:00:52

标签: c opengl

我正在尝试使用opengl在C中绘制三角形,但没有用于绘制三角形和线条的标准opengl函数。 (我使用的是ubuntu。)

我使用了Bresenham线描算法。我想,这个算法本身的代码很好,因为它画出了tringle但看起来像下面的图片。 enter image description here

我需要让它看起来像这样

enter image description here

在线条绘制算法中,我使用以下函数逐个像素地绘制线条:

void setPixel(int x, int y) {
    glBegin(GL_POINTS);
    glVertex2i(x,y);
    glEnd();
    glFlush();
}

你能帮我解决以下问题吗? : 为什么线条不平滑? 为什么像素之间有空格? 为什么线条不薄?

3 个答案:

答案 0 :(得分:2)

您可能希望使用

更改磅值
glPointSize(1.0f); // or similar value
glBegin致电之前

答案 1 :(得分:1)

  • 如@Nemanja Boric所述,积分不是简单的像素。 人们通常使用glBegin(GL_QUADS)绘制这样的正方形,因为点大小是有限的。

  • 如果这不是线条绘制练习,请使用glBegin(GL_LINE_LOOP);

    • glEnable(GL_LINE_SMOOTH);用于平滑线

    • glLineWidth();调整线宽。但是,启用GL_LINE_SMOOTH后,由于抗锯齿,该行看起来更薄。

答案 2 :(得分:0)

首先,不要使用点基元来表示像素。如果您启用了抗锯齿功能(GL_MULTISAMPLE或旧版GL_POINT_SMOOTH),那么它们实际上并不是矩形。

由于您在此处使用较旧版本的OpenGL,因此您仍然可以直接访问栅格功能。也就是说,您可以跳过原始程序集并相对于glRasterPos2i (...)进行绘制。 glWindowPos2i (...)甚至可以跳过坐标转换,让您直接在窗口坐标中绘制,而不会弄乱投影/模型视图矩阵(假设您有OpenGL 1.4+实现)。

以下是如何完成示例代码中的相同操作:

void setPixel(int x, int y) {
  const GLubyte color [] = { 255, 255, 255, 255 };

  glWindowPos2i (x, y);
  glDrawPixels  (1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color);

  glFlush();
}

如果您无法访问glWindowPos2i,请使用等于窗口尺寸的正投影矩阵和身份模型视图矩阵,并将glWindowPos2i (...)替换为glRasterPos2i (...)

这两种解决方案都不是高性能的,但至少你不必担心点大小,深度测试等问题。