在 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_LOOP
和GL_TRIANGLE_FAN
原语更快地画圆。
不要更改 glViewPort
,因为它不是您认为的那样!它会映射您的屏幕空间,如果您在渲染过程中更改它,那么您会使深度和任何辅助缓冲区无效,因此您不能再使用任何高级的东西了。
更多信息见:
Understanding 4x4 homogenous transform matrices【讨论】:
以上是关于在 OpengL 中多次重复图像的主要内容,如果未能解决你的问题,请参考以下文章