将glColorPointer与glDrawElements一起使用会导致无法绘制任何内容

时间:2012-12-04 03:08:39

标签: opengl

我正在努力为项目制作统一的颜色领域,我遇到了一个问题。球体运行良好,但当我尝试用glColorPointer对它们着色时,它们就会停止出现。当我调用glGetError时,OpenGL没有显示任何错误,所以我不知道为什么会这样。

生成顶点,颜色等的代码:

void SphereObject::setupVertices()
{
    //determine the array sizes
    //vertices per row (+1 for the repeated one at the end) * three for each coordinate
    //times the number of rows
    int arraySize = myNumVertices * 3;
    myNumIndices = (myVerticesPerRow + 1) * myRows * 2;
    myVertices = new GLdouble[arraySize];
    myIndices = new GLuint[myNumIndices];
    myNormals = new GLdouble[arraySize];
    myColors = new GLint[myNumVertices * 4];

    //use spherical coordinates to calculate the vertices
    double phiIncrement = 360 / myVerticesPerRow;
    double thetaIncrement = 180 / (double)myRows;
    int arrayIndex = 0;
    int colorArrayIndex = 0;
    int indicesIndex = 0;
    double x, y, z = 0;

    for(double theta = 0; theta <= 180; theta += thetaIncrement)
    {
        //loop including the repeat for the last vertex
        for(double phi = 0; phi <= 360; phi += phiIncrement)
        {
            //make sure that the last vertex is repeated
            if(360 - phi < phiIncrement)
            {
                x = myRadius * sin(radians(theta)) * cos(radians(0));
                y = myRadius * sin(radians(theta)) * sin(radians(0));
                z = myRadius * cos(radians(theta));
            }
            else
            {
                x = myRadius * sin(radians(theta)) * cos(radians(phi));
                y = myRadius * sin(radians(theta)) * sin(radians(phi));
                z = myRadius * cos(radians(theta));
            }

            myColors[colorArrayIndex] = myColor.getX();
            myColors[colorArrayIndex + 1] = myColor.getY();
            myColors[colorArrayIndex + 2] = myColor.getZ();
            myColors[colorArrayIndex + 3] = 1;

            myVertices[arrayIndex] = x;
            myVertices[arrayIndex + 1] = y;
            myVertices[arrayIndex + 2] = z;

            if(theta <= 180 - thetaIncrement)
            {
                myIndices[indicesIndex] = arrayIndex / 3; 

                myIndices[indicesIndex + 1] = (arrayIndex / 3) + myVerticesPerRow + 1;

                indicesIndex += 2;
            }

            arrayIndex += 3;
            colorArrayIndex += 4;
        }
    }
}

实际渲染事物的代码

void SphereObject::render()
{
    glPushMatrix();
    glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(4, GL_INT, 0, myColors);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_DOUBLE, 0, myVertices);
    glDrawElements(GL_QUAD_STRIP, myNumIndices, GL_UNSIGNED_INT, myIndices);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glPopClientAttrib();
    glPopMatrix();
}

任何和所有帮助将不胜感激。我出于某种原因真的很难过。

1 个答案:

答案 0 :(得分:1)

当您使用GL_INT(或任何整数类型)作为颜色指针时,它会将最大可能的整数值线性映射到1.0f(最大颜色),0到0.0f(最小颜色)。

因此,除非您的RGB和A值在数十亿之间,否则它们可能会显示为完全黑色(如果已启用则显示为透明)。我看到你有alpha = 1,转换为float后基本上为零。