返回1281的OpenGL glVertexPointer - 无法弄清楚原因

时间:2014-01-21 22:26:54

标签: c++ opengl terrain heightmap

我创建了一个从高度图文件中加载Terrain点的类;但绘制它们会导致崩溃。我已将错误缩小到glVertexPointer()函数,该函数返回1281(无效值导致我相信)。我已经通过了完整的65k-ish点,似乎无法找到它的问题。在渲染循环中之前发生的唯一其他事情是设置GL_PROJECTION和GL_MODELVIEW以及glClear()(显然是在这个绘制调用之后的交换缓冲区)。

class Terrain : public Model
{
public:
Terrain(char* pFile){
    if(!LoadTerrain(pFile))
    {
        OutputDebugString("Loading terain failed.\n");
    }
};

~Terrain(){};

void Draw()
{
    glPushMatrix();
    //glEnableClientState(GL_VERTEX_ARRAY); // Depreciated? Causes crash

    glBindBuffer(GL_ARRAY_BUFFER, mVBO);
    glVertexPointer(mNumberPoints, GL_FLOAT, 0, (GLvoid*)((char*)NULL));

    GLenum a = glGetError(); // 1281

    glPointSize(5.0f);
    glDrawArrays(GL_POINTS, 0, mNumberPoints);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

    //glDisableClientState(GL_VERTEX_ARRAY);

    glPopMatrix();
}

private:
GLuint mVBO;
int mWidth;
int mHeight;
int mNumberPoints;

bool LoadTerrain(char* pFile)
{
    FILE* filePtr;
    int error;
    unsigned int count;
    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;
    int imageSize, i, j, k, index;
    unsigned char* bitmapImage;
    unsigned char height;

    error = fopen_s(&filePtr, pFile, "rb");
    if(error)
        return false;
    count = fread(&bfh, sizeof(BITMAPFILEHEADER), 1, filePtr);
    if(count != 1)
        return false;
    count = fread(&bih, sizeof(BITMAPINFOHEADER), 1, filePtr);
    if(count != 1)
        return false;

    mWidth = bih.biWidth;
    mHeight = bih.biHeight;
    mNumberPoints = mWidth * mHeight;
    imageSize = mWidth * mHeight * 3; // 3 values * width * height = total data size

    bitmapImage = new unsigned char[imageSize];
    fseek(filePtr, bfh.bfOffBits, SEEK_SET);
    count = fread(bitmapImage, 1, imageSize, filePtr);
    if(count != imageSize)
        return false;
    error = fclose(filePtr);
    if(error)
        return false;

    float* mapArray = new float[imageSize];
    k = 0; 
    for(j = 0; j < mHeight; j++)
    {
        for(i = 0; i < mWidth; i++)
        {
            height = bitmapImage[k];

            index = (mHeight * j) + i;

            mapArray[k++] = (float)i;
            mapArray[k++] = (float)height;
            mapArray[k++] = (float)j;

            /*OutputDebugString(convertInt(i).c_str());
            OutputDebugString(",");
            OutputDebugString(convertInt(height).c_str());
            OutputDebugString(",");
            OutputDebugString(convertInt(j).c_str());
            OutputDebugString("\n");*/
        }
    }


    // COPY MAP ARRAY INTO BUFFERS
    glGenBuffers(1, &mVBO);
    glBindBuffer(GL_ARRAY_BUFFER, mVBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * imageSize, mapArray, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    delete [] bitmapImage;
    bitmapImage = 0;

    return true;
};

string convertInt(int number)
{
    if (number == 0)
        return "0";
    string temp="";
    string returnvalue="";
    while (number>0)
    {
        temp+=number%10+48;
        number/=10;
    }
    for (int i=0;i<temp.length();i++)
        returnvalue+=temp[temp.length()-i-1];
    return returnvalue;
}
};

1 个答案:

答案 0 :(得分:5)

以下代码段建议您错误地使用glVertexPointer的第一个参数:

glVertexPointer(mNumberPoints, GL_FLOAT, 0, (GLvoid*)
[...]
glDrawArrays(GL_POINTS, 0, mNumberPoints);

它应该是每个顶点的位置向量的组件数,而这里只有2,3或4个有效。您似乎使用3D位置,因此3将是正确的值。