OpenGL 和 Glut 中的黑屏
Posted
技术标签:
【中文标题】OpenGL 和 Glut 中的黑屏【英文标题】:Blank Screen in OpenGL and Glut 【发布时间】:2013-08-12 18:49:54 【问题描述】:尝试绘制立方体时,我得到一个空白屏幕。这是一个以我的glClearColor
为背景的屏幕。
我的代码包含在很多文件中,我无法将其全部发布在这里,所以我将其放在了on Github。你会想看看它。它是一个 Visual Studio 2012 文件,但所有源代码都适用于任何 IDE。虽然非常不完整,但这里有一些 sn-ps:
编辑:我现在可以看到我的形状,但它们完全没有光线。即使我在glutSolidTeapot
中使用已经制作好的法线,它看起来也很平坦。此外,即使我将远切割平面指定为 1000,但我的形状在此之前就消失了。我已经更新了我的代码以更新。
CodeIndigo.cpp
// Entry point!
// Code indigo is a 3d mystery game. Readme for more information.
#include "CodeIndigo.h"
#include <iostream>
void box_update (const int& frame, const Object& self)
return;
void update (int frame)
if (Indigo::keys ['w'])
Indigo::Current_World.camera.Move (0.05);
if (Indigo::keys ['s'])
Indigo::Current_World.camera.Move (-0.05);
if (Indigo::keys ['a'])
Indigo::Current_World.camera.Move (0.0, -0.05);
if (Indigo::keys ['d'])
Indigo::Current_World.camera.Move (0.0, 0.05);
if (GL_NO_ERROR != glGetError ())
std::cout << "Error: " << glGetError () << std::endl;
if (Indigo::keys ['3'])
Camera camera = Indigo::Current_World.camera;
std::cout << camera.X << ", " << camera.Y << ", " << camera.Z << " looking at "
<< camera.eye.Get_X () << ", " << camera.eye.Get_Y () << ", " << camera.eye.Get_Z () << std::endl;
void mouse_moved (int x, int y)
static const float sensitivity = 0.5;
Indigo::Current_World.camera.eye.Add_Direction (0.0, x * sensitivity,
y * -1 * sensitivity);
std::cout << x << ", " << y << std::endl;
int main(int argc, char ** argv)
Indigo::Initialize (argc, argv, " ~ Code Indigo",
800, 600, true, 60, Indigo::Sky_Color, 60);
Mesh box = Mesh::Sphere (0.5);
Object add = Object(0.0, 0.0, -1.0, box, Indigo::White_Color, 40.0f, box_update);
int object = Indigo::Current_World.Add_Object (add);
Indigo::Update_Function = update;
Indigo::Relative_Mouse_Moved_Function = mouse_moved;
Indigo::Current_World.lighting.Add_Light (0.0, 2.0, 0.0);
Indigo::Current_World.camera.Place (0.0, 0.0, 0.0);
Indigo::Current_World.camera.eye.Set_Direction (1.0, 90.0, -2.8);
Indigo::Run ();
return (0);
Indigo::初始化
// Initializes window and rendering matrices.
void Initialize (int argc, char ** argv, const char * window_name,
const int& window_width, const int& window_height, const bool& fullscreen,
int field_of_view, float * background, int max_framerate)
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize (window_width, window_height);
glutCreateWindow (window_name);
if (fullscreen)
glutFullScreen ();
if (background)
glClearColor (background [0], background [1], background [2], 1.0);
else
glClearColor (Sky_Color [0], Sky_Color [1], Sky_Color [2], 1.0);
Frame_Length_Minimum = 1000 / max_framerate;
glutSetKeyRepeat (GLUT_KEY_REPEAT_OFF);
glutDisplayFunc (Render);
glutTimerFunc (10, Update, 0);
glutReshapeFunc (Reshape);
glutPassiveMotionFunc (Mouse_Moved);
glutMouseFunc (Mouse_Button);
glutKeyboardFunc (Key_Pressed);
glutKeyboardUpFunc (Key_Released);
glMatrixMode (GL_PROJECTION);
Reshape ();
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glShadeModel (GL_SMOOTH);
glEnable (GL_DEPTH_TEST);
return;
靛蓝::重塑
// Acts for when the window reshapes
void Reshape (int width, int height)
bool viewport = true;
if (0 == width)
width = glutGet (GLUT_WINDOW_WIDTH);
viewport = false;
if (0 == height)
height = glutGet (GLUT_WINDOW_HEIGHT);
viewport = false;
if (viewport)
glViewport (0, 0, width, height);
glLoadIdentity ();
gluPerspective (Field_Of_View,
(float) width / (float) height,
0.5, 1000.0);
世界::渲染
void World::Render (void) const
// Renders every object in the world
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_PROJECTION);
Indigo::Reshape ();
glMatrixMode (GL_MODELVIEW);
camera.Look ();
lighting.Position_Lights ();
// <DELETE>
float full_array [] = 1.0, 1.0, 1.0, 1.0;
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, full_array);
glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, full_array);
glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 60.0);
glutSolidTeapot (0.3);
// </DELETE>
for (int Object_ID=0; Object_ID<objects.size (); ++Object_ID)
const_cast <Object&> (objects [Object_ID]).Render ();
glutSwapBuffers ();
return;
对象::渲染
// Renders the object
void Object::Render (void) const
float full_array [] = 1.0, 1.0, 1.0, 1.0;
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, object_color ? object_color : full_array);
glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, full_array);
glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, object_shine);
glPushMatrix ();
glTranslatef (X, Y, Z);
std::vector <Vertex> points = Data.Get_Vertices ();
glBegin (Render_Types [Data.Group_Size]);
for (int Point=0; Point<points.size (); Point++)
// When each polygon is finished, calculate a light normal
if ((Point + 1) % (Data.Group_Size == 0 ? 3 : Data.Group_Size) == 0)
Vertex two = points [Point - 1] - points [Point - 2];
Vertex three = points [Point] - points [Point - 2];
glNormal3f (two.Z * three.Y - two.Y * three.Z,
two.X * three.Z - two.Z * three.X,
two.Y * three.X - two.X * three.Y);
Vertex Cursor = points [Point];
glVertex3f (Cursor.X, Cursor.Y, Cursor.Z);
glEnd ();
glPopMatrix ();
return;
抱歉代码太多了!
困难在于不知道问题是否出在我的:
使用gluPerspective
设置投影矩阵
一些我不知道的 Glut 事情
绘制形状
其他的
【问题讨论】:
12mb 附件?那是不行的。你试试把你的绘图相关代码放在这里怎么样?对于绘制立方体等简单操作,单个文件绰绰有余。 这里的麻烦是我创建了一个非常面向对象的框架,而立方体只是一个测试。我刚刚替换了下载,不包括我不知道会这么大的可执行文件和解决方案文件。现在是 13 KB。为了方便起见,我还编辑了问题以包含一些 sn-ps。感谢您提供有关文件大小的提示。 你已经为你甚至没有尝试渲染立方体的东西编写了太多代码。通常最好渐进地处理这类事情。 如果您真的需要帮助,请分享Short, Self Contained, Correct (Compilable), Example。 顺便说一下,在创建短/等。例如,您很可能会发现问题的根源。 【参考方案1】:我同意 pwny。太多未经测试的代码。常见原因:
-
错误的相机/对象位置
错误的截锥体/视角(错误的
znear
或zfar
)
启用纹理而不使用它们
光照/材质参数不正确
忘记设置glColor
检查有什么问题
禁用GL_CULL_FACE,GL_DEPTH_TEST,GL_TEXTURE_1D,2D
,...光照、材质、混合
将投影 (GL_PROJECTION
)、相机和模型 (GL_MODELVIEW
) 设置为定义的状态(例如单位矩阵)
尝试在没有GL_CULL_FACE
的情况下以正确的位置和大小呈现GL_QUAD
以使其可见
成功后将投影矩阵设置为透视图
调整 znear,zfar
和四边形位置以匹配您的场景
用你的立方体替换四边形
成功后逐步重新启用您需要的所有功能
PS。还有一个好主意是检查 glerrors(可能完全是其他错误)
【讨论】:
感谢您的回答。我不确定这是否应该有助于我的照明,因为这是我遇到的主要问题。我检查了错误日志并没有得到任何东西。是的,我真的应该稍后把东西放在课堂上。问题是,如果缺少任何代码,就无法测试任何内容。您对照明有什么建议吗? 很明显是检查你是否有良好的法线(有时它们可以倒置......这通常会导致黑色)【参考方案2】:主要问题是我没有正确启用GL_LIGHTING
。
【讨论】:
以上是关于OpenGL 和 Glut 中的黑屏的主要内容,如果未能解决你的问题,请参考以下文章