Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
将OpenGL SuperBible(6E)示例中的代码应用到GLFW窗口时出现的问题_Opengl_Glfw - Fatal编程技术网

将OpenGL SuperBible(6E)示例中的代码应用到GLFW窗口时出现的问题

将OpenGL SuperBible(6E)示例中的代码应用到GLFW窗口时出现的问题,opengl,glfw,Opengl,Glfw,我目前正试图通过OpenGL超级圣经(6E)学习OpenGL。但是,我没有使用作者编写的windowing类,而是尝试将示例应用到我自己的GLFW windowing环境中 到目前为止,我已经能够自己重新创建许多示例,但我遇到了一个无法使用的示例 下面是问题SuperBible示例“movingtri”的.cpp文件: 然后三角形出现,但当然不会移动 下面是movingtri.cpp示例的gif图像: 下面是我在实现movingtri.cpp时失败的尝试的图像: 您需要从GLFW请求核心上下文

我目前正试图通过OpenGL超级圣经(6E)学习OpenGL。但是,我没有使用作者编写的windowing类,而是尝试将示例应用到我自己的GLFW windowing环境中

到目前为止,我已经能够自己重新创建许多示例,但我遇到了一个无法使用的示例

下面是问题SuperBible示例“movingtri”的.cpp文件: 然后三角形出现,但当然不会移动

下面是movingtri.cpp示例的gif图像:

下面是我在实现movingtri.cpp时失败的尝试的图像:

您需要从GLFW请求核心上下文。检查着色器编译和链接状态/日志也是一个好主意

试着这样做:

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

void CheckStatus( GLuint obj )
{
    GLint status = GL_FALSE;
    if( glIsShader(obj) )   glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
    if( glIsProgram(obj) )  glGetProgramiv( obj, GL_LINK_STATUS, &status );
    if( status == GL_TRUE ) return;
    char log[ 1 << 15 ] = { 0 };
    if( glIsShader(obj) )   glGetShaderInfoLog( obj, sizeof(log), NULL, log );
    if( glIsProgram(obj) )  glGetProgramInfoLog( obj, sizeof(log), NULL, log );
    std::cerr << log << std::endl;
    exit( -1 );
}

void AttachShader( GLuint program, GLenum type, const char* src )
{
    GLuint shader = glCreateShader( type );
    glShaderSource( shader, 1, &src, NULL );
    glCompileShader( shader );
    CheckStatus( shader );
    glAttachShader( program, shader );
    glDeleteShader( shader );
}

GLuint LoadProgram( const char* vert, const char* geom, const char* frag )
{
    GLuint prog = glCreateProgram();
    if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
    if( geom ) AttachShader( prog, GL_GEOMETRY_SHADER, geom );
    if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
    glLinkProgram( prog );
    CheckStatus( prog );
    return prog;
}

#define GLSL(version, shader) "#version " #version "\n" #shader


int main( int argc, char** argv )
{
    if( !glfwInit() )
    {
        exit(EXIT_FAILURE);
    }

    glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 4 );
    glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 1 );
    glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL - movingtri", NULL, NULL);

    if( !window )
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);

    GLenum err = glewInit();
    if( GLEW_OK != err )
    {
        cerr << "glewInit() failed: " << glewGetErrorString(err) << endl;
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    const char* vert = GLSL
    (
        410 core,
        layout (location = 0) in vec4 offset;
        void main()
        {
            const vec4 vertices[] = vec4[]
            (
                vec4( 0.25, -0.25, 0.5, 1.0),
                vec4(-0.25, -0.25, 0.5, 1.0),
                vec4( 0.25,  0.25, 0.5, 1.0)
            );

            // Add 'offset' to our hard-coded vertex position
            gl_Position = vertices[ gl_VertexID ] + offset;
        }
    );

    const char* frag = GLSL
    (
        410 core,
        out vec4 color;
        void main()
        {
            color = vec4(0.0, 0.8, 1.0, 1.0);
        }
    );

    GLuint program = LoadProgram( vert, NULL, frag );

    GLuint vao = 0;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    while( !glfwWindowShouldClose(window) )
    {
        double currentTime = glfwGetTime();
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        glViewport(0, 0, width, height);

        // begin rendering code from movingtri

        static const GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };
        glClearBufferfv(GL_COLOR, 0, green);

        glUseProgram(program);

        GLfloat attrib[] =
        {
            (float)sin(currentTime) * 0.5f,
            (float)cos(currentTime) * 0.6f,
            0.0f, 
            0.0f
        };

        glVertexAttrib4fv(0, attrib);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        //end rendering code

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效检查状态(GLuint obj)
{
闪烁状态=GLU FALSE;
if(glishader(obj))glGetShaderiv(obj、GL\u编译状态和状态);
if(glIsProgram(obj))glGetProgramiv(obj、GL链接状态和状态);
if(status==GL_TRUE)返回;

char log[1这里有同样的问题,但我让它工作了

顶点着色器:

layout (location = 1) in vec4 offset;
节目:

glVertexAttrib4fv(1, attrib);
所以我所做的就是将位置改为1而不是0。其他大于0的数字也可以。 我不知道为什么location=0对于顶点位置以外的任何数据都是禁止的


有人有想法吗?

哇,谢谢你的代码。它工作得非常好。奇怪的是,我已经尝试添加了3行glfwWindowHint,还测试了着色器编译结果。所以我不确定这里到底发生了什么,但我将彻底研究你的示例。再次感谢。@okxef:没问题。我很高兴它能为你工作r您,因为我似乎无法让它在我的系统上旋转:)
#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

void CheckStatus( GLuint obj )
{
    GLint status = GL_FALSE;
    if( glIsShader(obj) )   glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
    if( glIsProgram(obj) )  glGetProgramiv( obj, GL_LINK_STATUS, &status );
    if( status == GL_TRUE ) return;
    char log[ 1 << 15 ] = { 0 };
    if( glIsShader(obj) )   glGetShaderInfoLog( obj, sizeof(log), NULL, log );
    if( glIsProgram(obj) )  glGetProgramInfoLog( obj, sizeof(log), NULL, log );
    std::cerr << log << std::endl;
    exit( -1 );
}

void AttachShader( GLuint program, GLenum type, const char* src )
{
    GLuint shader = glCreateShader( type );
    glShaderSource( shader, 1, &src, NULL );
    glCompileShader( shader );
    CheckStatus( shader );
    glAttachShader( program, shader );
    glDeleteShader( shader );
}

GLuint LoadProgram( const char* vert, const char* geom, const char* frag )
{
    GLuint prog = glCreateProgram();
    if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
    if( geom ) AttachShader( prog, GL_GEOMETRY_SHADER, geom );
    if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
    glLinkProgram( prog );
    CheckStatus( prog );
    return prog;
}

#define GLSL(version, shader) "#version " #version "\n" #shader


int main( int argc, char** argv )
{
    if( !glfwInit() )
    {
        exit(EXIT_FAILURE);
    }

    glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 4 );
    glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 1 );
    glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL - movingtri", NULL, NULL);

    if( !window )
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);

    GLenum err = glewInit();
    if( GLEW_OK != err )
    {
        cerr << "glewInit() failed: " << glewGetErrorString(err) << endl;
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    const char* vert = GLSL
    (
        410 core,
        layout (location = 0) in vec4 offset;
        void main()
        {
            const vec4 vertices[] = vec4[]
            (
                vec4( 0.25, -0.25, 0.5, 1.0),
                vec4(-0.25, -0.25, 0.5, 1.0),
                vec4( 0.25,  0.25, 0.5, 1.0)
            );

            // Add 'offset' to our hard-coded vertex position
            gl_Position = vertices[ gl_VertexID ] + offset;
        }
    );

    const char* frag = GLSL
    (
        410 core,
        out vec4 color;
        void main()
        {
            color = vec4(0.0, 0.8, 1.0, 1.0);
        }
    );

    GLuint program = LoadProgram( vert, NULL, frag );

    GLuint vao = 0;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    while( !glfwWindowShouldClose(window) )
    {
        double currentTime = glfwGetTime();
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        glViewport(0, 0, width, height);

        // begin rendering code from movingtri

        static const GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };
        glClearBufferfv(GL_COLOR, 0, green);

        glUseProgram(program);

        GLfloat attrib[] =
        {
            (float)sin(currentTime) * 0.5f,
            (float)cos(currentTime) * 0.6f,
            0.0f, 
            0.0f
        };

        glVertexAttrib4fv(0, attrib);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        //end rendering code

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}
layout (location = 1) in vec4 offset;
glVertexAttrib4fv(1, attrib);