OpenGL相机问题,它可以渲染多远?

时间:2011-05-03 14:54:54

标签: opengl sdl

我正在研究一个绘制2架飞机的非常简单的程序。地平面和背景平面。

我正在尝试使用以X,Y,Z坐标排序的这些点来绘制两个平面。

背景平面

  • 第1点100.000002 100.000002 100.000002
  • 第2点-100.000002 100.000002 100.000002
  • 第3点-50.000001 -23.000001 100.000002
  • 第4点50.000001 -23.000001 100.000002

地平面

  • 第1点-50.000001 -23.000001 100.000002
  • 第2点50.000001 -23.000001 100.000002
  • 第3点0.352941 -0.352941 0.352941
  • 第4点-0.352941 -0.352941 0.352941

我的GL设置:

  • OpenGL照明已关闭。
  • 我按照列出点的顺序使用GL_QUAD绘图。
  • 我没有为四边形分配曲面法线。
  • 相机以(0,0,0)为中心,Y +为“向上”,Z轴为深度。

地平面渲染完美(只是一张灰色),但背景平面根本不渲染。所以我不得不问:

  • 我应该开启照明并计算表面法线吗?
  • 我是否需要摆弄相机和/或观看截头以观察背板(OpenGL在Z = 100 +的距离处“掉落”)?

感谢任何帮助。我正在使用libSDL和OpenGL。

我的OpenGL初始化代码如下所示:

if(SDL_Init(SDL_INIT_VIDEO) < 0) {
    return false;
}

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);   

screenptr = SDL_SetVideoMode(swidth, sheight, sbpp, VIDEO_MODE_OPTIONS);

if( screenptr == NULL) {
    return false;
}

glEnable(GL_TEXTURE_2D);

glClearColor(0,0,0,0);
glClearDepth(1.0f);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//gluPerspective(45.0f, SCREEN_WIDTH/SCREEN_HEIGHT, 0.1f, 500.0f);
//gluPerspective( 45.0f, 1.0, 0.1f, 100.0f );
//glFrustum(-500.0f, 500.0f, -500.0f, 500.f, 0.1f, 500.f);
//glFrustum(-1.0, 1.0, -1.0, 1.0, 5, 400);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

if(glGetError() != GL_NO_ERROR) {
    return false;
}

2 个答案:

答案 0 :(得分:4)

你需要看看你在哪里创建你的相机矩阵(调用glPerspective或类似的东西,我还没有使用过SDL)并将近距离和远距离平面设置为一个值,这样你就可以了希望用户看到距离近平面更远,但距离远平面更近。不在近平面和远平面之间的所有东西都被剪掉了。

编辑我查了一下,在SDL中你创建了这样的视图矩阵:

/* Create our projection matrix with a 45 degree field of view
 * a width to height ratio of 1.0 and view from .1 to 100 infront of us */
perspective(projectionmatrix, 45.0, 1.0, 0.1, 100.0);

不要将近平面设置为0(将导致零偏差)或远程平面设置为Float.Max(可能会导致奇怪的问题)

另请看一下透视投影的视图截图: view frustum

答案 1 :(得分:2)

您如何设置投影矩阵?它应该包含一些关于知道事物可以渲染多远的信息(通常称为远平面距离),在你需要的情况下你需要超过100个。

它可能存在的第二个问题是,如果你只渲染前向四边形,那么如果你的四边形是朝后的,它将不会被渲染。