【问题标题】:Draw pixel in C在C中绘制像素
【发布时间】:2013-12-06 00:58:49
【问题描述】:

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

我使用了 Bresenham 线描算法。我想,这个算法本身的代码很好,因为它画了三角形,但它看起来像下图。

我需要让它看起来像这样

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

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

您能帮我解决以下问题吗? : 为什么线条不流畅? 为什么像素之间有空格? 为什么线条不细?

【问题讨论】:

  • 你设置了多少像素?您是否使用了任何形式的抗锯齿功能?
  • @rhughes - Bresenhams 没有抗锯齿功能。您可以以更高的分辨率运行它然后下采样,但使用内置抗锯齿的画线算法可能会更好。但是,在这种情况下,“想要的”插图似乎不是也抗锯齿(RHS 上有楼梯),所以也许是“为什么线条不平滑?” OP 只是指巨大的“像素”。
  • 值得注意的是,由于这是在 3D 空间中,因此您实际上并没有 2D 图像意义上的“像素”。如果您正在寻找对像素的更多控制,请尝试渲染到图像或查看 2D API。
  • 正如@Steve314 所说,我的意思是巨大的像素。我应该更具体。实际上,我不能使用 2D API,所以我将尝试渲染。谢谢大家。

标签: c opengl


【解决方案1】:

您可能想用

更改点大小
glPointSize(1.0f); // or similar value

glBegin 通话之前。

【讨论】:

    【解决方案2】:
    • 正如@Nemanja Boric 所说,点不是简单的像素。 人们通常使用glBegin(GL_QUADS) 绘制这样的正方形,因为点的大小是有限的。

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

      • glEnable(GL_LINE_SMOOTH); 用于平滑线条

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

    【讨论】:

    • 其实是一个画线练习。我尝试了@NemanjaBoric 的建议,但它只是让正方形变小了,所以中间的黑色空间更大了。
    • OpenGL 中的像素完美绘制相当棘手。如果性能根本不重要,您可以尝试使用 glDrawPixels(): opengl.org/sdk/docs/man2/xhtml/glDrawPixels.xml 。您可以单独绘制每个像素,这会变得非常慢,或者在本机 C 中绘制位图(离屏)并使用对该函数的一次调用来绘制它。
    • 谢谢@Sam,我会试试的。
    【解决方案3】:

    首先,不要使用点图元来表示像素。如果您启用了抗锯齿(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 (...)

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

    【讨论】:

    • 感谢您的建议。我试过了,但出现“分段错误(核心转储)”可能是由 glWindowPos2i (x, y) 引起的。但是当我把它放在评论中时,我没有收到任何错误。有什么建议吗?提前致谢。
    • @quida:就像我说的,如果不支持glWindowPos2i,那么使用与您的窗口和单位模型视图矩阵具有相同尺寸的正交投影矩阵。如果您这样做,那么glRasterPos2i 的行为将与glWindowPos2i 相同。如果glVertex2i 在窗口坐标中绘制点,我相信您已经通过这种方式设置了应用程序。
    • 对不起,我没有意识到,你之前在那里写过。我会这样尝试。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多