gpt4 book ai didi

c++ - 在 OpengL 中多次重复图像

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:32 25 4
gpt4 key购买 nike

我在 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;
}

最佳答案

更改 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,因为它不是您想象的那样!它映射您的屏幕空间,如果您在渲染期间更改它,那么您会使深度和任何辅助缓冲区,因此您不能再使用任何高级内容。

有关详细信息,请参阅:

关于c++ - 在 OpengL 中多次重复图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42603808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com