使用 OpenGL 绘制谢尔宾斯基时遇到问题
Posted
技术标签:
【中文标题】使用 OpenGL 绘制谢尔宾斯基时遇到问题【英文标题】:Trouble drawing Sierpinski with OpenGL 【发布时间】:2017-12-15 13:30:04 【问题描述】:我正在尝试使用绘制点图案并将生成垫片的函数生成谢尔宾斯基垫片。
但是当我编译并运行程序时,它只显示黑屏。是什么导致了问题?
这是我的代码:
#include <Windows.h>
#include <gl/GL.h>
#include <glut.h>
void myInit(void)
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);
class GLintPoint
public:
GLint x, y;
;
int random(int m)
return rand() % m;
void drawDot(GLint x, GLint y)
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
void Sierpinski(void)
GLintPoint T[3] = 10, 10 , 300, 30, 200, 300;
int index = random(3);
GLintPoint point = T[index];
for (int i = 0; i < 1000; i++)
index = random(3);
point.x = (point.x + T[index].x) / 2;
point.y = (point.y + T[index].y) / 2;
drawDot(point.x, point.y);
glFlush();
void main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition(100, 150);
glutCreateWindow("Sierpinski Gasket");
glutDisplayFunc(drawDot);
myInit();
glutMainLoop();
【问题讨论】:
你有没有画过一些简单的东西,比如一个白点和一个黑点? 是的,他们画得很完美,但这不会画任何东西。 请同时显示成功绘制的最小代码,以供参考。问题很可能在于工作相似代码和非工作代码的差异。 FYI 如果您开始使用 OpenGL,我建议您从现代(核心配置文件)开始,而不是传统 API。glBegin
、glEnd
等函数调用在 2008 年被遗留:khronos.org/opengl/wiki/Legacy_OpenGL 将被(或已经)弃用。
这里有一段代码成功绘制了3个点: void myDisplay(void) glClearColor(GL_COLOR_BUFFER_BIT); glBegin(GL_POINTS); glVertex2i(100, 50); glVertex2i(100, 130); glVertex2i(150, 130); glEnd(); glFlush();
【参考方案1】:
如果要在白色背景上绘制黑点,则必须清除glClear
背景:
glClear( GL_COLOR_BUFFER_BIT );
注意,glClearColor
设置用于清除视口的颜色,但它本身不会清除任何内容。
你的代码应该是这样的:
void drawDot(GLint x, GLint y)
glVertex2i(x, y);
void Sierpinski(void)
GLintPoint T[3] = 10, 10 , 300, 30, 200, 300;
int index = random(3);
GLintPoint point = T[index];
glClearColor(1.0, 1.0, 1.0, 1.0); // set up white clear color
glClear( GL_COLOR_BUFFER_BIT ); // clear the back ground (white)
glMatrixMode( GL_MODELVIEW );
glPushMatrix(); // setup model matrix
glScalef( 1.5f, 1.5f, 1.0f ); // scale the point distribution
glColor3f( 0.0f, 0.0f, 0.0f ); // set black draw color
glPointSize( 5.0f ); // set the size of the points
glBegin(GL_POINTS);
for (int i = 0; i < 1000; i++)
index = random(3);
point.x = (point.x + T[index].x) / 2;
point.y = (point.y + T[index].y) / 2;
drawDot(point.x, point.y);
glEnd();
glPopMatrix(); // reset model matrix
glFlush();
【讨论】:
这个解决了,我忘了设置绘图功能的颜色。谢谢。 @AbdulBasitMehtab 查看答案的更改。你必须打电话给glClear
好的,知道了。但是产量很小,怎么做大一点呢?
@AbdulBasitMehtab 使用glPointSize
@AbdulBasitMehtab 点的分布可以通过glScalef
进行缩放。查看答案的变化。以上是关于使用 OpenGL 绘制谢尔宾斯基时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章