Opengl 环面网格顶点法线的获取

Opengl 环面网格顶点法线的获取,opengl,vertex,differentiation,Opengl,Vertex,Differentiation,我正在尝试用平滑的着色创建我自己的圆环。然而,正常情况似乎是错误的。这是我的密码 GLfloat NoMat[] = { 0.0f, 0.0f, 0.0f, 1.0f }; GLfloat MatAmbient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; GLfloat MatAmbientColor[] = { 0.21f, 0.13f, 0.05f, 1.0f

我正在尝试用平滑的着色创建我自己的圆环。然而,正常情况似乎是错误的。这是我的密码

GLfloat NoMat[]             =   {   0.0f,   0.0f,   0.0f,   1.0f    };
GLfloat MatAmbient[]        =   {   0.7f,   0.7f,   0.7f,   1.0f    };
GLfloat MatAmbientColor[]   =   {   0.21f,  0.13f,  0.05f,  1.0f    };
GLfloat MatDiffuse[]        =   {   0.71f,  0.43f,  0.18f,  1.0f    };
GLfloat Shine               =   100.0f; 
GLfloat NoShine             =   0.0f;

glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmbientColor);
glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDiffuse);
glEnable(GL_NORMALIZE);

glMaterialfv(GL_FRONT, GL_SPECULAR, MatAmbient);
glMaterialf(GL_FRONT, GL_SHININESS, Shine);

int i, j, k;
double s, t, x, y, z;

for (i = 0; i < nsides; i++) {
    glBegin(GL_QUAD_STRIP);
    for (j = 0; j <= rings + 1; j++) {
        for (k = 1; k >= 0; k--) { //for both negative and positive
            s = (i + k) % nsides + 0.5;
            t = j % rings;

            x = (totalRadius + centerRadius * cos(s*2*M_PI/nsides)) * cos(t*2*M_PI/rings);
            z = (totalRadius + centerRadius * cos(s*2*M_PI/nsides)) * sin(t*2*M_PI/rings);
            y = centerRadius * sin(s*2*M_PI/nsides);
            glVertex3f(x, y, z);
            glNormal3f(x, y, z);
        }
    }
    glEnd();
}
GLfloat NoMat[]={0.0f,0.0f,0.0f,1.0f};
GLfloat matamatambient[]={0.7f,0.7f,0.7f,1.0f};
GLfloat MatAmbientColor[]={0.21f,0.13f,0.05f,1.0f};
GLfloat MatDiffuse[]={0.71f,0.43f,0.18f,1.0f};
GLfloat Shine=100.0f;
GLfloat NoShine=0.0f;
GLMATERIALV(GL_前部、GL_环境光、MatAmbientColor);
GLMATERIALV(GL_前部、GL_漫反射、MATDIFFER);
glEnable(GL_正常化);
GLMATERIALV(GL_前部、GL_镜面反射、MATAMBINT);
GLMATERALF(GL_正面、GL_光泽、光泽);
int i,j,k;
双s,t,x,y,z;
对于(i=0;i

但是,照明不能正常工作,因为它的行为类似于平面着色,而不是平滑着色。我在谷歌上搜索过,但显然我需要使用差异化。然而,我不太确定如何做到这一点。有人知道吗?

您正在使用法线的顶点位置?这将仅适用于(且仅适用于)单位半径球体

你需要计算法线。就是


圆环的好处是,你可以在纸上很容易地计算它,给你一个精确的公式,而不是使用数值近似。

你使用法线的顶点位置?这将仅适用于(且仅适用于)单位半径球体

你需要计算法线。就是

圆环的好处是,你可以在纸上很容易地计算它,给你一个精确的公式,而不是使用数值近似