作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 z=0
处绘制了 2 个三角形,漫射照明从上方居中。如果我在 z
轴上缩放其中一个,它会改变它的光照。由于 z=0
,我原以为在 z 轴上缩放不会有任何效果。
我错过了什么?
// Set up the a light centered horizontally.
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
float light1Position[] = { 0.0f, 2.0f, 0.0f, 1.0f };
float light1Diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, light1Position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light1Diffuse);
// Set up the material.
float material1Diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glMaterialfv(GL_FRONT, GL_DIFFUSE, material1Diffuse);
// Transform such that we can draw in (-1, -1) to (1, 1) at z = 0.
glTranslated(0, 0, -1);
glScaled(2, 2, 1);
// Draw two triangles, symmetric w.r.t. to the light and camera.
glBegin(GL_TRIANGLES);
glVertex3d(-1, -1, 0);
glVertex3d( 0, 1, 0);
glVertex3d(-1, 1, 0);
glEnd();
glScaled(1, 1, 5.0); // This should be a no-op since 5 * 0 = 0.
// However, the following triangle is darker.
glBegin(GL_TRIANGLES);
glVertex3d( 1, -1, 0);
glVertex3d( 1, 1, 0);
glVertex3d( 0, 1, 0);
glEnd();
我已经上传了一个复制这个 on github 的 Cocoa 项目.我在 Objective-C 和 C++ 中都试过了。
最佳答案
即使您的顶点坐标在 Z 方向上为 0,您的法线也不一定。事实上,默认法线是 (0, 0, 1),这是有效的,因为您没有在示例代码中明确指定任何法线。
因此,您的问题是您的 glScale
矩阵将法线缩放为非标准化长度。
关于c++ - 为什么 glScaled(1, 1, 5) 会改变 glVertex3d(1, 1, 0) 的光照?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14088841/
所以我最近开始学习 JOGL,因为我对 Vanillla Java 感到无聊,因为我没有想到任何想法。我已经学会了如何画三角形、线条和一切简单的东西,但还有一些我不明白的地方。什么是 opengl 测
Imagen 我有一个 2D 点 (x,y) 列表,它们在我的简单游戏中描述了 2D 地形。 然后我让 glVertex() 在 GL_POINTS 模式下绘制所有这些点。 然后我有一个球,它也有它的
我已经在简单的即时模式下使用 OpenGL 一段时间了,并且正在尝试转到带有显示列表的保留模式(遗憾的是我得知它已经被弃用了一段时间)。我想知道的是,我何时输入: glNewList(list, GL
我是一名优秀的程序员,十分优秀!