我正在尝试使用opengl在C中绘制三角形,但没有用于绘制三角形和线条的标准opengl函数。 (我使用的是ubuntu。)
我使用了Bresenham线描算法。我想,这个算法本身的代码很好,因为它画出了tringle但看起来像下面的图片。
我需要让它看起来像这样
在线条绘制算法中,我使用以下函数逐个像素地绘制线条:
void setPixel(int x, int y) {
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
glFlush();
}
你能帮我解决以下问题吗? : 为什么线条不平滑? 为什么像素之间有空格? 为什么线条不薄?
答案 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 (...)
。
这两种解决方案都不是高性能的,但至少你不必担心点大小,深度测试等问题。