gpt4 book ai didi

c++ - 照明不适用于 OpenGL - 纯色

转载 作者:行者123 更新时间:2023-11-30 04:18:19 31 4
gpt4 key购买 nike

照明不工作,对象显示为纯色。颜色本身随 Material 或照明参数而变化,但没有阴影或任何纯灰色。

部分代码如下:

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glFrontFace(GL_CCW);
glShadeModel(GL_FLAT);
glEnable(GL_LIGHTING);

GLfloat amb[] = {0.6, 0.6, 0.6, 1.0};
GLfloat dif[] = {0.8, 0.8, 0.8, 1.0};
GLfloat spec[] = {0.5, 0.5, 0.5, 1.0};
GLfloat pos[] = {0.0, 0.0, 30.0};

glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec);
glLightfv(GL_LIGHT0, GL_POSITION, pos);


GLfloat co[4]={0.5, 0.5, 0.5, 0.5};
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, co);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);

for(int i=0; i < numofTr; i++)
{
glBegin(GL_TRIANGLES);
glNormal3f(tr[i].v1->n.x, tr[i].v1->n.y, tr[i].v1->n.z);
glVertex3f(tr[i].v1->x, tr[i].v1->y, tr[i].v1->z);
glNormal3f(tr[i].v2->n.x, tr[i].v2->n.y, tr[i].v2->n.z);
glVertex3f(tr[i].v2->x, tr[i].v2->y, tr[i].v2->z);
glNormal3f(tr[i].v3->n.x, tr[i].v3->n.y, tr[i].v3->n.z);
glVertex3f(tr[i].v3->x, tr[i].v3->y, tr[i].v3->z);
glEnd();
}

我不知道我错过了什么,法线与对象一起显示时看起来不错。

最佳答案

您在灰色物体上使用昏暗的灯光。显然结果是灰色的。

如果您的意思是面部是平坦的阴影,那是因为 glShadeModel(GL_FLAT);。将其更改为 GL_SMOOTH 以启用插值。

如果对象是 3D 的,我认为你只传递 3 个 float 作为位置这一事实可能是相关的;默认值为 [0,0,1,0],函数需要四个 float (第 4 个是 W 坐标,在大多数情况下应该等于 1,或者对于无限远的灯光为 0 ).

还要仔细检查您提供给 glVertexglNormal 的数据是否正确。当在 0,0,0 处渲染球体时,每个顶点的法线是该顶点的归一化位置(显然仅适用于球体)。


附带说明一下,这段代码显然已经过时了,作为免责声明,如果您只是在学习,我会完全放弃它,并切换到相对现代并使用可编程管道的东西。

关于c++ - 照明不适用于 OpenGL - 纯色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16486490/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com