因为,先前没有思考完善,所以导致需要修改一些代码从而更加方便的存储顶点位置数据、顶点法线数据、顶点纹理坐标数据
struct DATAS{ GLfloat vertex_data[3]; GLfloat normal_data[3]; GLfloat texcoord_data[2];}VBOdata[DATA_LENGTH];//先前,我是直接用两个数组来存储位置和法线数据,现在为了在传递数据时便于计算,我用一个结构体来存储一个顶点的所有信息int pt; for (int c = 0; c<(STRip_COUNT - 1); c++) { for (int l = 0; l<2 * STRIP_LENGTH; l++) { if (l % 2 == 1) { pt = c*STRIP_LENGTH + l / 2; } else { pt = c*STRIP_LENGTH + l / 2 + STRIP_LENGTH; } index = STRIP_LENGTH * 2 * c + l; for (int i = 0; i<3; i++) { VBOdata[index].vertex_data[i] = pt_strip[pt * 3 + i]; VBOdata[index].normal_data[i] = pt_normal[pt * 3 + i]; if (i < 2) VBOdata[index].texcoord_data[i] = (pt_strip[pt * 3 + i] + 1)/2; } } } //上述是修改后的对顶点进行排序的代码 //因为我的顶点位置坐标的值在[-1,1]范围内,且我偷懒直接对整个海面用一张纹理贴图,又因为纹理坐标的值在[0,1]的范围内,所以我直接将位置坐标中的x轴坐标和y轴坐标通过+1再除以2的方式将其改变为[0,1]的区间范围中。//接下来更改一下传递数据的代码void RenderWater(){ glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(VBOdata), VBOdata, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); glBindVertexArray(VAO); for (int c = 0; c<(STRIP_COUNT - 1); c++) glDrawArrays(GL_TRIANGLE_STRIP, STRIP_LENGTH * 2 * c, STRIP_LENGTH * 2); glBindVertexArray(0);}完成以上步骤后会得到如下效果:
现在,模拟海平面已经初见其效果,还需要更多的代码进行完善 ps:纹理贴图可以随便找一张海面效果图
新闻热点
疑难解答