作为一个项目,我必须在现代opengl中生成一个随机的NxN粗糙地形。为此,我使用高度图,使用三角形条渲染每个2xN行。 着色器是基本的,指定与高度相对应的黄色阴影(因此我可以看到弯曲;我有一个自上而下的相机)。插值已开启,但由于某种原因,会呈现奇怪的尖锐三角形形状。 1)它们总是出现在屏幕的右侧。 2)它们比我渲染的单位三角形大。
例如:我没有发布图片的声誉,所以......
8x8 http://imgbox.com/flC187WW
128x128 http://i.imgbox.com/f1ebrk0V.png
这是代码:
void drawMeshRow(int rno, float oy) {
GLfloat meshVert[MESHSIZE * 2 * 3];
for(int i = 0; i < 2 * MESHSIZE; ++i) {
meshVert[3*i] = (i/2)*(2.0/(MESHSIZE-1)) - 1;
if(i & 1) {
meshVert[3*i + 1] = oy;
meshVert[3*i + 2] = heightMap[rno][i/2];
}
else {
meshVert[3*i + 1] = oy + (2.0/(MESHSIZE-1));
meshVert[3*i + 2] = heightMap[rno + 1][i/2];
}
}
glBufferData(GL_ARRAY_BUFFER, 2 * 3 * MESHSIZE * sizeof(GLfloat), meshVert, GL_STREAM_DRAW);
glDrawArrays(GL_TRIANGLE_STRIP, 0, MESHSIZE * 2 * 3);
}
void drawMesh() {
glUseProgram(shader);
glBindBuffer(GL_ARRAY_BUFFER, meshBuff);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
for(int i = 0; i < MESHSIZE - 1; ++i)
drawMeshRow(i, (2.0 / (MESHSIZE - 1)) * i - 1);
glDisableVertexAttribArray(0);
}
drawMesh被称为主循环的每次迭代。
着色器:
顶点着色器
#version 330 core
layout(location = 0) in vec3 pos;
smooth out float height;
void main() {
gl_Position.xyz = pos;
height = pos.z;
gl_Position.w = 1.0;
}
片段着色器
#version 330 core
out vec3 pcolor;
smooth in float height;
void main() {
pcolor = vec3(1.0, 1.0, height);
}
答案 0 :(得分:0)
您将错误的计数传递给glDrawArrays()
:
glDrawArrays(GL_TRIANGLE_STRIP, 0, MESHSIZE * 2 * 3);
最后一个参数是顶点计数,而传递的值是坐标总数。正确的电话是:
glDrawArrays(GL_TRIANGLE_STRIP, 0, MESHSIZE * 2);