在OpengGL中多次重复图像

时间:2017-03-05 02:32:09

标签: c++ opengl graphics 2d

我在OpenGL中画了一个圆圈。我想做的是反复展示它的一部分。 例如,不是仅显示一个圆圈,而是连续显示4个半圆。 我认为通过两个for循环并在里面使用glViewport(参数)是可能的。但我没有这样做。

我的代码在这里,for循环在circle()函数的开头。 如果有人能帮助我,我将不胜感激。

#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <fstream>


using namespace std;

int pntX1, pntY1, r;

void myInit()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    glPointSize(4.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 101.0, 0.0, 101.0);
}

void drawPolyLineFile(char * fileName)
{
    fstream inStream;
    inStream.open(fileName, ios::in);
    if (inStream.fail())
        return;
    glClear(GL_COLOR_BUFFER_BIT);
    GLint numpolys, numlines, x, y;
    inStream >> numpolys;

    for (int j = 0; j < numpolys; j++)
    {
        inStream >> numlines;
        glBegin(GL_LINE_STRIP);
        for (int i = 0; i < numlines; i++)
        {
            inStream >> x >> y;
            glVertex2i(x, y);
        }
        glEnd();
    }
    glFlush();
    inStream.close();
}

void writePixel(GLint x, GLint y)
{
    glBegin(GL_POINTS);
    glVertex2i(x + pntX1, y + pntY1);
    glEnd();
}

void circlePoints(int x, int y) {
    writePixel(x, y);
    writePixel(y, x);
    writePixel(y, -x);
    writePixel(x, -y);
    writePixel(-x, -y);
    writePixel(-y, -x);
    writePixel(-y, x);
    writePixel(-x, y);
}

void setWindow(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(left, right, bottom, top);
}

void setViewPort(GLint left, GLint right, GLint bottom, GLint top)
{
    glViewport(left, bottom, right - left, top - bottom);
}
void Circle() {
    //int x1=100,y1=100,r=50;
    //int x=0,y=r;
    //int d = 3/2 - r;

    //glViewport(50, 50, 50, 50);
    /*
    setWindow(0.0, 101.0, 0.0, 101.0);
    for (int i = 0; i<1; i++)
        for (int j = 0; j < 1; j++)
        {
            //glViewport(i * 50 +, j * 50, 50, 50);
            glViewport(50, 50, 50, 50);
            drawPolyLineFile("dino.dat");
        }
    */

    //glViewport(0, 0, 0, 0);

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1, 0, 0);

    int x = 0;
    int r = 50;
    int y = r;
    int h = (1 - r);
    int deltaE = 3;
    int deltaSE = (-2)*r + 5;

    circlePoints(x, y);

    while (y > x) {

        if (h<0) {
            h += deltaE;
            deltaE += 2;
            deltaSE += 2;
        }
        else {
            h += deltaSE;
            deltaE += 2;
            deltaSE += 4;
            y--;
        }
        x++;
        circlePoints(x, y);
    }

}

void Display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 0.0);
    glPointSize(1.0);

    Circle();

    glFlush();
}


int main(int argc, char *argv[])
{
    pntX1 = 50; pntY1 = 50; r = 50;

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(101, 101.0);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("My circles");


    //glViewport(0, 0, 100, 100);

    /*
    setWindow(0, 500.0, 0, 500.0);
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
        {
        glViewport(i*250, j*250, 250, 250);
        //drawPolylineFile("circles.dat");
        }
        */


    glutDisplayFunc(Display);
    myInit();

    glutMainLoop();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

更改Viewport不是您需要的使用矩阵

for (i=0;i<N;i++) // N is number of objects you want to render
 {
 glMatrixMode(GL_MODELVIEW);
 glPushMatrix();
 glTranslate3(dx[i],dy[i],dz[i]); // dx,dy,dz is offset of object i where you want to draw it
 // render i-th object occurrence
 glPopMatrix();
 }

也希望你知道你可以更快地绘制GL_LINE_LOOPGL_TRIANGLE_FAN原语的圆圈。

请勿更改glViewPort,因为它不是您认为的那样!它会映射您的屏幕空间,如果您在渲染过程中更改它,那么您将使深度和任何辅助缓冲区无效所以你不能再使用任何先进的东西了。

有关详细信息,请参阅: