OpenGL ES轻质问题
-
22-09-2019 - |
题
我是OpenGL ES的新手,并且正在为iPhone开发Objective-C。
我试图理解的是光线如何放在我的frustum中。这就是我的方式:
我创建了一个正方形,并将其作为“地板”在我的frustum中。我将光线放在地板的中间,并将光向向下指向。现在,我希望地板上的光圈位于中间。但事实并非如此,它更多地向后(远离)。怎么来的?
near = 8.0
far = 28
light position = {0.0, 0.0, -10.0}
light direction = {0.0, -1.0, 0.0}
Floor coordinates = {-0.3153, -0.473, -20.0},
{-0.3153, -0.473, 0.0},
{0.3153, -0.473, -20.0},
{0.3153, -0.473, 0.0},
这不应该一起使光圈圆在地板中间而不倒的位置吗?
这是我的重要代码:
设置视图:
-(void)setupView:(TDRoomView*)view
{
const GLfloat zNear = 8, zFar = 28, fieldOfView = 5;
GLfloat size;
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
NSLog(@"tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0); %f ", tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0));
CGRect rect = view.bounds;
glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size /
(rect.size.width / rect.size.height), zNear, zFar);
glViewport(-size, size, rect.size.width, rect.size.height);
glMatrixMode(GL_MODELVIEW);
glShadeModel(GL_SMOOTH);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
static const Color3D light0Ambient[] = {{1.0, 1.0, 1.0, 1.0}};
glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat *)light0Ambient);
static const Color3D light0Diffuse[] = {{0.5, 0.5, 0.5, 1.0}};
glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat *)light0Diffuse);
static const Color3D light0Specular[] = {{0.5, 0.5, 0.5, 1.0}};
glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat *)light0Specular);
static const Vertex3D light0Position[] = {{0.0, 0.473, -10.0}};
glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position);
static const Vertex3D lightVector= {0.0, -1.0, 0.0};
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat *)&lightVector);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 85);
glLoadIdentity();
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
和绘图:
-(void)drawView:(TDRoomView*)view
{
static const Vertex3D vertices[]= {
{-0.3153, -0.473, -20.0},
{-0.3153, -0.473, 0.0},
{0.3153, -0.473, -20.0},
{0.3153, -0.473, 0.0},
{-0.1, -0.25, -3.0},
{0.0, 0.0, -10.0},
{0.1, -0.25, -3.0}
};
static const Color3D colors[] = {
{0.7, 0.7, 0.7, 1.0},
{0.7, 0.7, 0.7, 1.0},
{0.7, 0.7, 0.7, 1.0},
{0.7, 0.7, 0.7, 1.0},
{1.0, 0.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0},
{0.0, 0.0, 1.0, 1.0}
};
static const GLubyte roomFaces[] = {
0, 1, 2,
1, 2, 3};
static const Vector3D normals[] = {
{0.000000, 1.000000, 0.000000},
{0.000000, 1.000000, 0.000000},
{0.000000, 1.000000, 0.000000},
{0.000000, 1.000000, 0.000000},
{0.000000, 1.000000, 0.000000},
{0.000000, 1.000000, 0.000000},
{0.000000, 1.000000, 0.000000}
};
glLoadIdentity();
glClearColor(0.7, 0.7, 0.7, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(4, GL_FLOAT, 0, colors);
glNormalPointer(GL_FLOAT, 0, normals);
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_BYTE, roomFaces);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY); }
另外,我重新改变了
static const Vertex3D light0Position[] = {{0.0, 0.473, -10.0}};
至
static const Vertex3D light0Position[] = {{0.0, 0.473, -8.0}};
束黑暗,没有光线闪闪发光。为什么,我只将灯移开了两个步骤...?如果我将其移动两个步骤,也会发生同样的事情:
static const Vertex3D light0Position[] = {{0.0, 0.473, -12.0}};
为了“散发出我的问题”的任何帮助,都非常感谢! (忍不住...;))
提前致谢!
解决方案
我建议您使用更大的网格,其中包括更多的顶点,最好是n个正方形。尽量不要长长的三角形。这将使您更容易查看光似乎在哪里,因为每个顶点都计算了光,而不是每个像素的表面。
http://www.opengl.org/resources/features/kilgardtechniques/oglpitfall/
2.不良的镶嵌伤害了照明
OpenGL的照明计算是每个Vertex进行的。这意味着仅在对象的顶点上计算出与3D对象的表面材料相互作用的光源引起的阴影计算。通常,OpenGL仅在顶点颜色之间插值或光滑阴影。 OpenGL的每位vertex照明效果很好,除非在镜面亮点或聚光灯之类的照明效果被丢失或模糊,因为该效果无法被对象的顶点进行充分采样。当对物体使用最少数量的顶点进行粗略建模时,就会发生这种照明效应的不足采样。
:
新手OpenGL程序员通常很容易启用OpenGL的聚光功能,并在以单个巨大多边形为模型的墙上引起了人们的关注。不幸的是,新手的意图不会出现尖锐的聚光灯。您可能根本不会看到任何聚光灯的影响。问题在于,聚光灯的切断意味着指定顶点的墙壁的极端拐角没有从聚光灯下得到任何贡献,并且由于这些是墙壁的唯一顶点,因此墙壁上不会有聚光灯图案。
其他提示
GL_POSITION
在均匀坐标中指定,这意味着它需要四个值,而不是三个值。您需要指定 w = 1.0用于您的光源,但是您 w 相反,组件来自旁边发生的任何事情 light0Position
在记忆中。
(部分原因 GL_POSITION
在均匀的坐标中是允许您通过与 w = 0.0.)