【问题标题】:Repeating an image many times in OpengGL在 OpengL 中多次重复图像
【发布时间】:2017-03-05 02:32:09
【问题描述】:

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

我的代码在这里,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;
}

【问题讨论】:

    标签: c++ opengl graphics 2d


    【解决方案1】:

    改变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,因为它不是您认为的那样!它会映射您的屏幕空间,如果您在渲染过程中更改它,那么您会使深度和任何辅助缓冲区无效,因此您不能再使用任何高级的东西了。

    更多信息见:

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多