0

我正在为一个项目制作均匀的颜色球体,但遇到了一个问题。球体运行良好,但是当我尝试使用 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();
}

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

4

1 回答 1

1

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

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

于 2012-12-05T06:03:49.387 回答