- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 OpenGL 程序在运行,它显示几何图形,但它都是“平面的”,一种灰色调,没有漫反射阴影或镜面反射:
图中是三个圆环,每个都由四边形条制成。我们应该看到阴影,但我们没有。我做错了什么?
这是我设置顶点和法线的代码(调用draw_torus()
来构建显示列表):
/* WrapTorus, adapted from
http://www.math.ucsd.edu/~sbuss/MathCG/OpenGLsoft/WrapTorus/WrapTorus.html
by Sam Buss */
/*
* Issue vertex command for segment number j of wrap number i.
* Normal added by Lars Huttar.
* slices1 = numWraps; slices2 = numPerWrap.
*/
void putVert(float i, float j, float slices1, float slices2, float majR, float minR) {
float wrapFrac = j / slices2;
/* phi is rotation about the circle of revolution */
float phi = PI2 * wrapFrac;
/* theta is rotation about the origin, in the xz plane. */
float theta = PI2 * (i + wrapFrac) / slices1;
float y = minR * (float)sin(phi);
float r = majR + minR * (float)cos(phi);
float x = (float)sin(theta) * r;
float z = (float)cos(theta) * r;
/* normal vector points to (x,y,z) from: */
float xb = (float)sin(theta) * majR;
float zb = (float)cos(theta) * majR;
glNormal3f(x - xb, y, z - zb);
glVertex3f(x, y, z);
}
static void draw_torus(int numPerWrap, int numWraps, float majR, float minR) {
int i, j;
glBegin( GL_QUAD_STRIP );
for (i=0; i < numWraps; i++ ) {
for (j=0; j < numPerWrap; j++) {
putVert((float)i, (float)j, (float)numWraps, (float)numPerWrap, majR, minR);
putVert((float)(i + 1), (float)j, (float)numWraps, (float)numPerWrap, majR, minR);
}
}
putVert(0.0, 0.0, (float)numWraps, (float)numPerWrap, majR, minR);
putVert(1.0, 0.0, (float)numWraps, (float)numPerWrap, majR, minR);
glEnd();
}
顶点的顺序有问题吗?
这是构建显示列表的 init 函数的一部分:
GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat color[4] = { 0.5, 0.6, 0.7, 1.0 };
...
glShadeModel(GL_SMOOTH);
torusDL = glGenLists (1);
glNewList(torusDL, GL_COMPILE);
setMaterial(color, white, 100);
draw_torus(8, 45, 1.0, 0.05);
glEndList();
setMaterial() 的作用是:
static void setMaterial(const GLfloat color[3], const GLfloat hlite[3], int shininess) {
glColor3fv(color);
glMaterialfv(GL_FRONT, GL_SPECULAR, hlite);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
glMateriali(GL_FRONT, GL_SHININESS, shininess); /* [0,128] */
}
这是在初始化期间也完成的照明:
GLfloat pos[4] = {0.4, 0.2, 0.4, 0.0};
GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
GLfloat color[4] = {0.20, 0.20, 0.20, 1.00};
GLfloat spec[4] = {0.30, 0.30, 0.30, 1.00};
GLfloat shiny = 8.0;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, spec);
glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, shiny);
这里是调用显示列表的地方,在 draw 函数中:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glLoadIdentity();
glScalef(3.5, 3.5, 3.5);
for (i = 0; i < ac->nrings; i++) {
glScalef(0.8, 0.8, 0.8);
glRotatef(...);
glCallList(torusDL);
}
glFlush();
glPopMatrix();
glXSwapBuffers(dpy, window);
这个“glx hack”的完整.c 源文件是here .如果它有所作为,此代码位于 xscreensaver 的上下文中.
最佳答案
如您所见,glEnable(GL_NORMALIZE)
规范化用于照明计算的转换后的法线向量(在固定功能管道中) .这些计算依赖于单位长度法线以获得正确的结果。
值得指出的是,应用于法线向量的变换与应用于顶点几何的变换不同。 OpenGL 2.1 规范描述了这种转换,许多 other 也是如此。资源。作为向量,法线具有齐次表示:[nx, ny, nz, 0]
- “无穷大”处的一个点,以及在数学上统一矩阵和 4 向量运算的优雅方式GL 管道。
当然,您可以自己执行此归一化,这样做可能更有效,因为您的环面几何体只为预编译的显示列表生成一次:
nx = x - b, ny = y, nz = z - zb;
nl = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);
glNormal3f(nx * nl, ny * nl, nz * nl);
如果可能,请务必检查 (nl
) 是否被零除(或某个 epsilon)。
关于opengl - 为什么我的漫反射/镜面照明不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9644238/
我一直在阅读和试用 Peter Shirley 的“一个周末的光线追踪”。在漫反射 Material 部分之前,一切都进行得很顺利。基本上,我的算法似乎只是从特定角度转换阴影,而不是漫反射 Mater
我正在 Swift 中使用 RealityKit 加载 USDZ 模型。模型加载良好,具有纹理。 但是,我无法更改 Material 的漫反射属性, Material 总是返回 AnyMaterial
我正在尝试在 iOS 上的 SceneKit 中实现网格的透明度。我对文档感到困惑,因为似乎有多种方法可以使网格透明: 通过 SCNMaterial.(diffuse|emission|ambient
我是一名优秀的程序员,十分优秀!