在 OpengL 中多次重复图像

Posted

技术标签:

【中文标题】在 OpengL 中多次重复图像【英文标题】:Repeating an image many times in OpengGL 【发布时间】: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;

【问题讨论】:

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

更多信息见:

Understanding 4x4 homogenous transform matrices

【讨论】:

以上是关于在 OpengL 中多次重复图像的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL-载入纹理

OpenGL-纹理(下)

openGL中glOrtho和glViewPort之间的区别[重复]

为啥这个在opengl中绘制三角形的着色器不会多次运行

Opengl 纹理映射和图像分辨率

OpenGL在多个地方多次绘制同一个多边形