Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL和Glut中的空白屏幕_C++_Opengl_Glut - Fatal编程技术网

C++ OpenGL和Glut中的空白屏幕

C++ OpenGL和Glut中的空白屏幕,c++,opengl,glut,C++,Opengl,Glut,当我试图画一个立方体时,我得到的是一个空白屏幕。这是一个背景为myglClearColor的屏幕 我的代码存在于太多的文件中,所以我无法将其全部发布在这里,所以我将其放在了这里。你会想看看的。这是一个VisualStudio2012文件,但所有的源代码都在那里,用于任何IDE。虽然非常不完整,但以下是一些片段: 编辑:我现在可以看到我的形状,但它们完全没有光线。即使我在glutSolidTeapot中使用已经制作好的法线,它看起来也是平面的。此外,即使我将“远切割平面”指定为1000,我的形状也

当我试图画一个立方体时,我得到的是一个空白屏幕。这是一个背景为my
glClearColor
的屏幕

我的代码存在于太多的文件中,所以我无法将其全部发布在这里,所以我将其放在了这里。你会想看看的。这是一个VisualStudio2012文件,但所有的源代码都在那里,用于任何IDE。虽然非常不完整,但以下是一些片段:

编辑:我现在可以看到我的形状,但它们完全没有光线。即使我在
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);
}
靛蓝:重塑

// 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;
}
void世界::渲染(void)常量
{
//渲染世界上的每个对象
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
靛蓝::重塑();
glMatrixMode(GLU模型视图);
照相机;
lighting.Position_Lights();
// 
浮点全_数组[]={1.0,1.0,1.0,1.0};
GLMATERIALV(GL_前_和后,GL_环境_和漫反射,全_阵列);
GLMATERIALV(GLU前、后、GLU镜面反射、全阵列);
GLMATERALF(GL_前部和后部,GL_反光度,60.0);
茶壶(0.3);
// 

对于(int Object_ID=0;Object_ID我同意pwny。太多未测试的代码。常见原因:

  • 相机/物体位置不正确
  • 错误的透视图/透视图(错误的
    znear
    zfar
  • 启用纹理而不使用它们
  • 照明/材质参数不当
  • 忘记设置
    glColor
  • 检查有什么问题

  • 禁用
    GL\u消隐面、GL\u深度测试、GL\u纹理1D、2D
    ,…照明、材质、混合

  • 将投影(
    GL\u投影
    )、相机和模型(
    GL\u模型视图
    )设置为定义状态(例如单位矩阵)

  • 尝试渲染
    GL_QUAD
    ,但不渲染
    GL_CULL_FACE
    ,渲染位置和大小正确且可见

  • 成功后,将投影矩阵设置为透视

    调整znear、zfar和quad位置以匹配场景

  • 将四边形替换为立方体

  • 成功后,以增量方式重新启用所有需要的功能


  • PS.另一个好主意是检查是否存在错误(可能是错误的,完全是其他原因)

    主要问题是我没有正确启用
    GL_LIGHTING

    12mb的附加文件?这是不可能的。你试着把与绘图相关的代码放在这里怎么样?一个文件就足够了,只需进行简单的操作,比如绘制一个立方体。这里的问题是,我创建了一个非常OOP的框架,而立方体只是一个简单的图形测试。我刚刚替换了下载,不包括我不知道会有这么大的可执行文件和解决方案文件。现在是13 KB。为了方便起见,我还编辑了一些问题,包括一些片段。感谢关于文件大小的提示。你已经编写了太多的代码,你甚至没有尝试渲染一个小程序e与。通常最好以渐进的方式处理这类问题。如果你真的需要帮助,请分享a。顺便说一句,在创建short/etc示例时,你很可能会发现问题的根源。谢谢你的回答。我不确定这是否有助于我的照明,因为这是我面临的主要问题e、 我已经检查了错误日志,没有得到任何结果。是的,我真的应该在以后的类中放置东西。问题是,如果缺少任何代码,就无法测试任何东西。你有什么建议可以帮助照明吗?显然是要检查你是否有良好的法线(有时它们可以反转…这通常会导致黑色)
    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;
    }