qq_15560419 2017-03-31 05:11
浏览 897

反应扩散Gray-Scott模型问题(OpenGL纹理)

图片说明
谁能告诉我什么问题?以上是运行结果,一下是代码。
#include "GrayScott.h"
#include "math.h"

laplace GS_Grid[WIDTH][HEIGHT] = {};
GLubyte GS_Pix[WIDTH][HEIGHT][4]; //纹理数据
GLubyte GS_test[WIDTH][HEIGHT][4];
float GS_LAPLACIAN[3][3] = { { 0.05,0.2,0.05 },
{ 0.2, -1, 0.2 },
{ 0.05,0.2,0.05 } };

//初始化
void GS_Initialize()
{
glClearColor(0.0, 0.0, 0.0, 0.0);

for (int i = 0; i < WIDTH; i++)
{
    for (int j = 0; j < HEIGHT; j++)
    {
        GS_Grid[i][j].a = 1;//rand()/100000.0;
        GS_Grid[i][j].b = 0.5;// rand() / 100000.0;
        GS_test[i][j][0] = (GLubyte)100;
        GS_test[i][j][1] = (GLubyte)100;
        GS_test[i][j][2] = (GLubyte)100;
        GS_test[i][j][3] = (GLubyte)255;
    }
}

for (int i = 1; i < 30; i++)
{
    for (int j = 1; j < 30; j++) {
        //GS_Grid[i][j].b = 1.0;
    }
}

GS_PixelUpdate();

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);    //设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT,
    0, GL_RGBA, GL_UNSIGNED_BYTE, &GS_test);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);    //设置纹理环境
glEnable(GL_TEXTURE_2D);

}

//交换
void GS_Swap() {

}

//更新
void GS_PixelUpdate() {
int i, j, c;

GS_ReactionDiffusion();
//glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGR_EXT, GL_UNSIGNED_BYTE, &pix);

for (i = 0; i < HEIGHT; i++) {
    for (j = 0; j < WIDTH; j++) {
        //c = ((((i & 0x8) == 0) ^ ((j & 0x8)) == 0)) * 255;//黑白方块交替

        //int c = max(min(texNext[i][j].a - texNext[i][j].b, 1), 0);
        c = floor((GS_Grid[i][j].a - GS_Grid[i][j].b) * 255);

        GS_Pix[i][j][0] = (GLubyte)c;
        GS_Pix[i][j][1] = (GLubyte)GS_Grid[i][j].a*255;// floor(GS_Grid[i][j].a * 255);
        GS_Pix[i][j][2] = (GLubyte)GS_Grid[i][j].b * 255;// floor(GS_Grid[i][j].b * 255);
        GS_Pix[i][j][3] = (GLubyte)255;
    }
}

}

//反应扩散
void GS_ReactionDiffusion()
{
//反应扩散
for (int x = 0; x < WIDTH; x++)
{
for (int y = 0; y < HEIGHT; y++)
{
float a = GS_Grid[x][y].a;
float b = GS_Grid[x][y].b;
//更新
GS_Grid[x][y].a = a +
((GS_DA*GS_Laplacian(x, y, GS_U)) -
(a*b*b) +
(GS_FEED*(1 - a)))*GS_DT;
GS_Grid[x][y].b = b +
((GS_DB*GS_Laplacian(x, y, GS_V)) +
(a*b*b) -
((GS_KILL + GS_FEED)*b))*GS_DT;

    }
}

}

//显示纹理
void GS_Display()
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT,
0, GL_RGBA, GL_UNSIGNED_BYTE, &GS_test);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glPushMatrix();
glColor4f(0, 0, 1, 1);
glTranslatef(0.0, 0.0, -7.0);
//glRotatef(xRot, 1, 0, 0);

glBegin(GL_QUADS);                                        //指定纹理坐标
glTexCoord2f(0.0, 0.0); glVertex3f(-3.0, -3.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-3.0, 3.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(3.0, 3.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(3.0, -3.0, 0.0);
glEnd();

glPopMatrix();

glFlush();

}

//拉普拉斯算子
float GS_Laplacian(int x, int y, int target)
{
GLfloat sum = 0.0;

if (target == GS_U) {
    sum += GS_LAPLACIAN[1][1] * GS_Grid[x][y].a;

    sum += GS_LAPLACIAN[1][1 - 1] * GS_Grid[x][y - 1].a;
    sum += GS_LAPLACIAN[1][1 + 1] * GS_Grid[x][y + 1].a;
    sum += GS_LAPLACIAN[1 - 1][1] * GS_Grid[x - 1][y].a;
    sum += GS_LAPLACIAN[1 + 1][1] * GS_Grid[x + 1][y].a;

    sum += GS_LAPLACIAN[1 - 1][1 - 1] * GS_Grid[x - 1][y - 1].a;
    sum += GS_LAPLACIAN[1 + 1][1 - 1] * GS_Grid[x + 1][y - 1].a;
    sum += GS_LAPLACIAN[1 + 1][1 + 1] * GS_Grid[x + 1][y + 1].a;
    sum += GS_LAPLACIAN[1 - 1][1 + 1] * GS_Grid[x - 1][y + 1].a;
}
else if (GS_V == target) {
    sum += GS_LAPLACIAN[1][1] * GS_Grid[x][y].b;

    sum += GS_LAPLACIAN[1][1 - 1] * GS_Grid[x][y - 1].b;
    sum += GS_LAPLACIAN[1][1 + 1] * GS_Grid[x][y + 1].b;
    sum += GS_LAPLACIAN[1 - 1][1] * GS_Grid[x - 1][y].b;
    sum += GS_LAPLACIAN[1 + 1][1] * GS_Grid[x + 1][y].b;

    sum += GS_LAPLACIAN[1 - 1][1 - 1] * GS_Grid[x - 1][y - 1].b;
    sum += GS_LAPLACIAN[1 + 1][1 - 1] * GS_Grid[x + 1][y - 1].b;
    sum += GS_LAPLACIAN[1 + 1][1 + 1] * GS_Grid[x + 1][y + 1].b;
    sum += GS_LAPLACIAN[1 - 1][1 + 1] * GS_Grid[x - 1][y + 1].b;
}
return sum;

}

void GS_Reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

//计时器
void GS_OnTimer(int value)
{
GS_PixelUpdate();
glutPostRedisplay();
glutTimerFunc(500, GS_OnTimer, 1);
}

void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);

GS_Initialize();
glutDisplayFunc(GS_Display);
glutReshapeFunc(GS_Reshape);
glutTimerFunc(100, GS_OnTimer, 1);
glutMainLoop();

}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 有卷积神经网络识别害虫的项目吗
    • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
    • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
    • ¥15 彩灯控制电路,会的加我QQ1482956179
    • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
    • ¥15 (关键词-电路设计)
    • ¥15 如何解决MIPS计算是否溢出
    • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
    • ¥15 操作系统相关算法中while();的含义
    • ¥15 CNVcaller安装后无法找到文件