出现在插值高度图中的锐利三角形

时间:2015-02-13 20:55:51

标签: c++ opengl

作为一个项目,我必须在现代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);
    } 

1 个答案:

答案 0 :(得分:0)

您将错误的计数传递给glDrawArrays()

glDrawArrays(GL_TRIANGLE_STRIP, 0, MESHSIZE * 2 * 3);

最后一个参数是顶点计数,而传递的值是坐标总数。正确的电话是:

glDrawArrays(GL_TRIANGLE_STRIP, 0, MESHSIZE * 2);