谁能告诉我什么问题?以上是运行结果,一下是代码。
#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();
}