使用 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。 glBeginglEnd 等函数调用在 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 绘制谢尔宾斯基时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

谢尔宾斯基三角 Pygame 递归

谢尔宾斯基地毯三角形,周长,面积的变化规律

瓦茨瓦夫·谢尔宾斯基的生平

在 vertexShader 中使用 OpenGl 未声明的标识符,我在顶点着色器中绘制三角形时遇到问题

通过循环向量链表使用opengl1绘制线条

OPENgl入门过程中遇到的问题