2

ここに私のコードがあります:

#include <stdlib.h>
#include <iostream>
#include <gl/glew.h>
#include <gl/freeglut.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <SDL.h>

using namespace std;

typedef unsigned short us;
typedef unsigned char uc;

bool *keystates = new bool[256];
bool *skeystates= new bool[256];
uc dir_m[8][2]={
    { 0, 1 },
    { 0,-1 },
    { -1,0 },
    { 1,0 },
    { 1,1},
    { 1,-1 },
    { -1,-1 },
    { -1,1 }
};

us totalbots=15;

float zoomlvl=-70.f;
float camx=0.f,camy=0.f;

struct bot_data{
    float x,y,z;
    float r,g,b;
    float size; //    "radius" of the square
    us coold;
    us age;
    us trans:5;
    us dir:3,fac:2;
    bot_data(void);
    void move(void);
    void deliver(us bot);
};
struct bool_data{
    bool ch:1,ch2:1;
};

bot_data::bot_data(void){
    size=0.25f;
    fac=rand()%4;
    switch(fac){
    case 0:x=10.f,y=10.f,z=0.f;
        r=1.0f,g=0.f,b=0.f;
        break;
    case 1:x=-10.f,y=-10.f,z=0.f;
        r=0.0f,g=0.f,b=1.f;
        break;
    case 2:x=-10.f,y=10.f,z=0.f;
        r=1.0f,g=1.f,b=0.f;
        break;
    case 3:x=10.f,y=-10.f,z=0.f;
        r=0.0f,g=1.f,b=0.f;
        break;
    }
    coold=0;
    trans=0;
    age=0;
    dir=rand()%8;
}

bot_data *cubers=new bot_data[65536];
bool_data *bools=new bool_data;

void bot_data::move(void){
    float move=size/10.f;
    switch(dir){
    case 0:y+=move;
        break;
    case 1:y-=move;
        break;
    case 2:x-=move;
        break;
    case 3:x+=move;
        break;
    case 4:x+=move;
        y+=move;
        break;
    case 5:x+=move;
        y-=move;
        break;
    case 6:y-=move;
        x-=move;
        break;
    case 7:y+=move;
        x-=move;
        break;
    }
}
void bot_data::deliver(us bot){
    age=-10;
    totalbots+=3;
    float tmp=size-(size/4.f);
    size=0.25f;
    x-=size;
    y+=size;
    for(uc i=1;i<=3;i++){
        cubers[totalbots-i].fac=fac;
        switch(fac){
        case 0:cubers[totalbots-i].r=1.0f,cubers[totalbots-i].g=0.f,cubers[totalbots-i].b=0.f;
            break;
        case 1:cubers[totalbots-i].r=0.0f,cubers[totalbots-i].g=0.f,cubers[totalbots-i].b=1.f;
            break;
        case 2:cubers[totalbots-i].r=1.0f,cubers[totalbots-i].g=1.f,cubers[totalbots-i].b=0.f;
            break;
        case 3:cubers[totalbots-i].r=0.0f,cubers[totalbots-i].g=1.f,cubers[totalbots-i].b=0.f;
            break;
        }
        cubers[totalbots-i].coold=coold;
        cubers[totalbots-i].size=size;
        switch(i){
        case 1:cubers[totalbots-i].x=x;
            cubers[totalbots-i].y=y-size*2;
            break;
        case 2:cubers[totalbots-i].x=x+size*2;
            cubers[totalbots-i].y=y;
            break;
        case 3:cubers[totalbots-i].x=x+size*2;
            cubers[totalbots-i].y=y-size*2;
            break;
        }
    }
}

void initkeys(void){
    for(uc i=0;i<255;i++){
        keystates[i]=false;
        skeystates[i]=false;
    }
}
void p_keys(unsigned char key, int x, int y){
    keystates[key]=true;
}
void keyup(unsigned char key, int x, int y){
    keystates[key]=false;
}
void sp_keys(int key, int x, int y){
    skeystates[key]=true;
}
void skeyup(int key, int x, int y){
    skeystates[key]=false;
}
void key_func(void){
    if (keystates['z']){
        if(skeystates[GLUT_KEY_UP])zoomlvl+=1.f;
        else if (skeystates[GLUT_KEY_DOWN])zoomlvl-=1.f;
        if(zoomlvl<-100.0f)zoomlvl=-100.f;
        else if(zoomlvl>-5.f)zoomlvl=-5.f;
    }
    else{
        if(skeystates[GLUT_KEY_UP])camy-=1.f;
        else if(skeystates[GLUT_KEY_DOWN])camy+=1.f;
    }
    if(skeystates[GLUT_KEY_LEFT])camx+=1.f;
    else if(skeystates[GLUT_KEY_RIGHT])camx-=1.f;
}
void render_p(us bot){
    glColor3f(cubers[bot].r,cubers[bot].g,cubers[bot].b);
    glBegin(GL_QUADS);
    glVertex2f(cubers[bot].size,cubers[bot].size);
    glVertex2f(cubers[bot].size,-cubers[bot].size);
    glVertex2f(-cubers[bot].size,-cubers[bot].size);
    glVertex2f(-cubers[bot].size,cubers[bot].size);
    glEnd();
}
void process_cubers(void){
    for(us i=0;i<totalbots;i++){
        //glPushMatrix();
        glLoadIdentity();
        glTranslatef(cubers[i].x,cubers[i].y,cubers[i].z);
        if(cubers[i].coold==0){
            cubers[i].move();
            cubers[i].trans++;
            if(cubers[i].trans==20){
                cubers[i].trans=0;
                cubers[i].coold=50;
                if(cubers[i].age<100){
                    cubers[i].size+=0.025f;
                }
                else if(cubers[i].age==150){
                    cubers[i].deliver(i);
                }
                cubers[i].dir=rand()%8;
                cubers[i].age+=10;
            }
        }
        else cubers[i].coold--;
        render_p(i);
        //glPopMatrix();
    }
}
void display(void){
    key_func();
    glClearColor(0.6f,0.6f,0.6f,1.f);
    glClear (GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(camx,camy,zoomlvl);
    process_cubers();
    glutSwapBuffers();
    SDL_Delay(1000/30);
    glutPostRedisplay();
}
void resize(int width,int height){
    glViewport(0,0,(GLsizei)width,(GLsizei)height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,(GLfloat)width/(GLfloat)height,1.f,100.f);
    glMatrixMode(GL_MODELVIEW);
}
int main (int argc, char **argv) {
    initkeys();
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE);
    glutInitWindowSize (640, 480);
    glutInitWindowPosition (0, 0); 
    glutCreateWindow ("opengl 1");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutReshapeFunc(resize);
    glutKeyboardFunc(p_keys);
    glutKeyboardUpFunc(keyup);
    glutSpecialFunc(sp_keys);
    glutSpecialUpFunc(skeyup);
    glutMainLoop();
    return 0;
}

一定の間隔ごとに移動する一定量の正方形をレンダリングします。移動距離はサイズです。移動するたびに、一定量 (この場合は 15) 移動した後、サイズ制限 (この場合は半径 1.f) に達するまでサイズが大きくなり、正方形は 4 つの小さな正方形に分割され、正確なスペースが埋められます。その前駆体は占有されています。つまり、完全にシームレスに見えるはずです..問題は、代わりに、正方形の分割後にこの一瞬の裂け目とグリッチのようなレンダリングが発生することですが、それ以外の問題は見つかりませんでした.

私が疑っているのは、新しい 3 つの正方形をレンダリングしているときに呼び出すはずだった gl 関数を見逃した可能性があります (分割は、3 つの新しい正方形を追加し、現在の正方形をそのサイズの 4 分の 1 に縮小してから、すべてを調整することによって行われます)。正方形。)

4

2 に答える 2

0

これを試して:

#include <GL/glew.h>
#include <GL/glut.h>

typedef unsigned short us;
typedef unsigned char uc;

bool *keystates = new bool[256];
bool *skeystates= new bool[256];
uc dir_m[8][2]=
{
    { 0, 1 },
    { 0,-1 },
    { -1,0 },
    { 1,0 },
    { 1,1},
    { 1,-1 },
    { -1,-1 },
    { -1,1 }
};

us totalbots=15;

float zoomlvl=-70.f;
float camx=0.f,camy=0.f;

struct bot_data
{
    float x,y,z;
    float r,g,b;
    float size; //    "radius" of the square
    us coold;
    us age;
    us trans:5;
    us dir:3,fac:2;
    bot_data(void);
    void move(void);
    void deliver(us bot);
};

struct bool_data
{
    bool ch:1,ch2:1;
};

bot_data::bot_data(void)
{
    size=0.25f;
    fac=rand()%4;
    switch(fac){
    case 0:x=10.f,y=10.f,z=0.f;
        r=1.0f,g=0.f,b=0.f;
        break;
    case 1:x=-10.f,y=-10.f,z=0.f;
        r=0.0f,g=0.f,b=1.f;
        break;
    case 2:x=-10.f,y=10.f,z=0.f;
        r=1.0f,g=1.f,b=0.f;
        break;
    case 3:x=10.f,y=-10.f,z=0.f;
        r=0.0f,g=1.f,b=0.f;
        break;
    }
    coold=0;
    trans=0;
    age=0;
    dir=rand()%8;
}

bot_data *cubers=new bot_data[65536];
bool_data *bools=new bool_data;

void bot_data::move(void)
{
    float move=size/10.f;
    switch(dir){
    case 0:y+=move;
        break;
    case 1:y-=move;
        break;
    case 2:x-=move;
        break;
    case 3:x+=move;
        break;
    case 4:x+=move;
        y+=move;
        break;
    case 5:x+=move;
        y-=move;
        break;
    case 6:y-=move;
        x-=move;
        break;
    case 7:y+=move;
        x-=move;
        break;
    }
}

void bot_data::deliver(us bot)
{
    age=-10;
    totalbots+=3;
    float tmp=size-(size/4.f);
    size=0.25f;
    x-=size;
    y+=size;
    for(uc i=1;i<=3;i++){
        cubers[totalbots-i].fac=fac;
        switch(fac){
        case 0:cubers[totalbots-i].r=1.0f,cubers[totalbots-i].g=0.f,cubers[totalbots-i].b=0.f;
            break;
        case 1:cubers[totalbots-i].r=0.0f,cubers[totalbots-i].g=0.f,cubers[totalbots-i].b=1.f;
            break;
        case 2:cubers[totalbots-i].r=1.0f,cubers[totalbots-i].g=1.f,cubers[totalbots-i].b=0.f;
            break;
        case 3:cubers[totalbots-i].r=0.0f,cubers[totalbots-i].g=1.f,cubers[totalbots-i].b=0.f;
            break;
        }
        cubers[totalbots-i].coold=coold;
        cubers[totalbots-i].size=size;
        switch(i){
        case 1:cubers[totalbots-i].x=x;
            cubers[totalbots-i].y=y-size*2;
            break;
        case 2:cubers[totalbots-i].x=x+size*2;
            cubers[totalbots-i].y=y;
            break;
        case 3:cubers[totalbots-i].x=x+size*2;
            cubers[totalbots-i].y=y-size*2;
            break;
        }
    }
}

void initkeys(void)
{
    for(uc i=0;i<255;i++){
        keystates[i]=false;
        skeystates[i]=false;
    }
}

void p_keys(unsigned char key, int x, int y)
{
    keystates[key]=true;
}

void keyup(unsigned char key, int x, int y)
{
    keystates[key]=false;
}

void sp_keys(int key, int x, int y)
{
    skeystates[key]=true;
}

void skeyup(int key, int x, int y)
{
    skeystates[key]=false;
}

void key_func(void)
{
    if (keystates['z'])
    {
        if(skeystates[GLUT_KEY_UP])zoomlvl+=1.f;
        if(skeystates[GLUT_KEY_DOWN])zoomlvl-=1.f;
        if(zoomlvl<-100.0f)zoomlvl=-100.f;
        if(zoomlvl>-5.f)zoomlvl=-5.f;
    }
    else
    {
        if(skeystates[GLUT_KEY_UP])camy-=1.f;
        if(skeystates[GLUT_KEY_DOWN])camy+=1.f;
        if(skeystates[GLUT_KEY_LEFT])camx+=1.f;
        if(skeystates[GLUT_KEY_RIGHT])camx-=1.f;
    }
}

void render_p(us bot)
{
    glColor3f(cubers[bot].r,cubers[bot].g,cubers[bot].b);
    glBegin(GL_QUADS);
    glVertex2f(cubers[bot].size,cubers[bot].size);
    glVertex2f(cubers[bot].size,-cubers[bot].size);
    glVertex2f(-cubers[bot].size,-cubers[bot].size);
    glVertex2f(-cubers[bot].size,cubers[bot].size);
    glEnd();
}

void process_cubers(void)
{
    for(us i=0;i<totalbots;i++){
        if(cubers[i].coold==0){
            cubers[i].move();
            cubers[i].trans++;
            if(cubers[i].trans==20){
                cubers[i].trans=0;
                cubers[i].coold=50;
                if(cubers[i].age<100){
                    cubers[i].size+=0.025f;
                }
                else if(cubers[i].age==150){
                    cubers[i].deliver(i);
                }
                cubers[i].dir=rand()%8;
                cubers[i].age+=10;
            }
        }
        else cubers[i].coold--;
    }

    for(us i=0;i<totalbots;i++)
    {
        glPushMatrix();
        glTranslatef(cubers[i].x,cubers[i].y,cubers[i].z);
        render_p(i);
        glPopMatrix();
    }
}

void display(void)
{
    key_func();
    glClearColor(0.6f,0.6f,0.6f,1.f);
    glClear (GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective(60, w / h,1.f,100.f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(camx,camy,zoomlvl);

    process_cubers();
    glutSwapBuffers();
}

void timer(int extra)
{
    glutPostRedisplay();
    glutTimerFunc(33, timer, 0);
}

int main (int argc, char **argv) 
{
    initkeys();
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize (640, 480);
    glutInitWindowPosition (0, 0); 
    glutCreateWindow ("opengl 1");
    glutDisplayFunc(display);
    glutKeyboardFunc(p_keys);
    glutKeyboardUpFunc(keyup);
    glutSpecialFunc(sp_keys);
    glutSpecialUpFunc(skeyup);
    glutTimerFunc(0, timer, 0);
    glutMainLoop();
    return 0;
}

シミュレーション ループで描画していました。これにより、それが 2 つのループに分割され、sim が描画されます。

于 2013-05-17T16:28:11.867 に答える
0

グラフィックス レンダリングの仕組み (OpenGL またはその他) は、2 つの三角形を同じ三角形ストリップ、同じ (頂点バッファー、インデックス バッファ) モデル ペア、または三角形を単一のレンダリング ユニットにグループ化するその他の構造。

「クワッド」をレンダリングすると、実際には 2 つの三角形の三角形ストリップがレンダリングされるため、2 つの三角形の間の継ぎ目がきれいに見えます。

いくつかのエッジに沿って配置された 2 つの別々の四角形をレンダリングすると、エッジの見栄えが悪くなります。アンチエイリアシングは問題を少し解決するのに役立ちますが、継ぎ目に沿った引き裂きを取り除きたい場合は、最終的に単一のレンダリング ユニットを使用する必要があります。

この図は、グリッドにレンダリングされている 4 つの四角形 (8 つの三角形) を示しています。対角線はクワッド内にあるため、ティアリングはありませんが、クワッドはすべて個別にレンダリングされるため、継ぎ目に沿ってティアリングがあります。

4 つのクワッドをレンダリングする

于 2013-05-17T16:01:11.303 に答える