Opengl es OpenGL es-DONS';t看起来像3D,看起来更像2D

Opengl es OpenGL es-DONS';t看起来像3D,看起来更像2D,opengl-es,3d,2d,Opengl Es,3d,2d,试图制造一个球体。但它看起来不像3D,事实上它看起来像一张平面2D图片。我错过了什么 谢谢 首先,您需要使用glGetIntegerv(GL\u lighting,&i)检查当前是否启用了照明,并可能启用glEnable(GL\u lighting) 然后设置glMaterial(…),glLightModel(…),glLight(…),这里有教程 或者您可以使用自己的GLSL着色器应用一些高级照明,这里有一些教程 在一些简单的情况下,您可以通过glColor3f(…)传递顶点颜色,而不是使

试图制造一个球体。但它看起来不像3D,事实上它看起来像一张平面2D图片。我错过了什么

谢谢


首先,您需要使用
glGetIntegerv(GL\u lighting,&i)
检查当前是否启用了照明,并可能启用
glEnable(GL\u lighting)

然后设置
glMaterial(…)
glLightModel(…)
glLight(…)
,这里有教程

或者您可以使用自己的GLSL着色器应用一些高级照明,这里有一些教程

在一些简单的情况下,您可以通过glColor3f(…)传递顶点颜色,而不是使用GL照明


此外,法线应为单位向量或启用归一化
glEnable(GL\u NORMALIZE)

首先,您需要使用
glGetIntegerv(GL\u lighting,&i)
检查当前是否启用了照明,并可能将其启用
glEnable(GL\u lighting)

然后设置
glMaterial(…)
glLightModel(…)
glLight(…)
,这里有教程

或者您可以使用自己的GLSL着色器应用一些高级照明,这里有一些教程

在一些简单的情况下,您可以通过glColor3f(…)传递顶点颜色,而不是使用GL照明


此外,法线应该是单位向量,或者启用归一化
glEnable(GL\u NORMALIZE)

使它现在看起来更好,如果不是最好的话。谢谢你的帮助:)使它看起来更好了,如果不是最好的。谢谢你的帮助:)
std::vector<GLfloat> ballVerts;

for(int i = 0; i <= 40; i++)
{
    double lat0 = M_PI * (-0.5 + (double) (i - 1) / 40);
    double z0  = sin(lat0);
    double zr0 =  cos(lat0);

    double lat1 = M_PI * (-0.5 + (double) i / 40);
    double z1 = sin(lat1);
    double zr1 = cos(lat1);

    for(int j = 0; j <= 40; j++)
    {
        double lng = 2 * M_PI * (double) (j - 1) / 40;
        double x = cos(lng);
        double y = sin(lng);

        //  normals
        glNormal3f(x * zr0, y * zr0, z0);

        ballVerts.push_back(x * zr0); //X
        ballVerts.push_back(y * zr0); //Y
        ballVerts.push_back(z0);      //Z

        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); 
        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); //R,G,B,A

        //  normals
        glNormal3f(x * zr1, y * zr1, z1);

        ballVerts.push_back(x * zr1); //X
        ballVerts.push_back(y * zr1); //Y
        ballVerts.push_back(z1);      //Z

        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); 
        ballVerts.push_back(0.0f); 
        ballVerts.push_back(1.0f); //R,G,B,A
glRotatef(Angle, 1.0f, 0.5f, 0.3f);

glBindBuffer(GL_ARRAY_BUFFER, VertexBufferObject[2]);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 7*4, 0);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 3200);

glBindBuffer(GL_ARRAY_BUFFER, 0);