SFML - Opengl VAO问题给我一个(1282)错误

时间:2015-11-24 17:58:28

标签: c++ opengl sfml opengl-3 opengl-4

我在尝试在SFML中使用VAO时遇到错误,并且不确定它是SFML还是我自己的opengl代码

GLenum err = glewInit();
if (err != GLEW_OK)
{
    std::cout << "NOT WORKING" << std::endl;
}
    std::vector<sf::Vector3f> g_vertext_buffer_data;
g_vertex_buffer_data.push_back({ -1.0f, -1.0f, 0.0f });
g_vertex_buffer_data.push_back({1.0f, -1.0f, 0.0f});
g_vertex_buffer_data.push_back({ 0.0f, 1.0f, 0.0f });

const char* vertexShaderSource =
    "#version 330\n\
                             in vec4 position;\
                                                  void main(void){\                                                                                     gl_Position = position;\
                                                                                                         }";
// compile fragment shader source
const GLchar* fragmentShaderSource = 
    "#version 330\n\
                                    void main(void) {\
                out vec4 fragcolor;                                         fragcolor= vec4(1.0,1.0,1.0,1.0);\
                                                                                                     }";

/* Creating Shader */
this->programId = glCreateProgram();
this->vId = glCreateShader(GL_VERTEX_SHADER);
this->fId = glCreateShader(GL_FRAGMENT_SHADER);
/* Get Shader Size */
int vertexShaderLength = strlen(vertexShaderSource);
int fragmentShaderLength = strlen(fragmentShaderSource);

/* Loading and binding shader */
glShaderSource(this->vId, 1, &vertexShaderSource, NULL);
glShaderSource(this->fId, 1, &fragmentShaderSource, NULL);

/* Compile Shaders */
glCompileShader(vId);
glCompileShader(fId);
/* Attach Shaders */
glAttachShader(this->programId, this->vId);
glAttachShader(this->programId, this->fId);

/* Linkg program */
glLinkProgram(this->programId);
/* Use and bind attribute */
glUseProgram(this->programId);
this->positionId = glGetAttribLocation(this->programId, "position");
glUseProgram(0);
/* VAO Time */
glGenVertexArrays(1, &this->vaoId);
glBindVertexArray(this->vaoId);

/* VBO Time assigning to VAO */
glGenBuffers(1, &this->vboId);
glBindBuffer(GL_ARRAY_BUFFER, this->vboId);
glBufferData(GL_ARRAY_BUFFER, g_vertex_buffer_data.size() * sizeof(sf::Vector3f), &g_vertex_buffer_data[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(this->positionId);
glVertexAttribPointer(this->positionId, 2, GL_FLOAT, GL_FALSE, sizeof(sf::Vector3f), 0);

/* Close out bindings */
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
  while(1)
  {
glUseProgram(this->programId);
glBindVertexArray(this->vaoId);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glUseProgram(0);    
 gameWindow.glPushStates();
  }

我得到的错误代码是:用户代码中的opengl错误(1282)

我已经改变了blBufferData()中提出的size()问题,但仍然遇到了问题。

2 个答案:

答案 0 :(得分:2)

传递给glBufferData的尺寸至少存在问题:

glBufferData(GL_ARRAY_BUFFER,
             sizeof(g_vertex_buffer_data) * sizeof(sf::Vector3f), 
             g_vertex_buffer_data[0], GL_STATIC_DRAW);

sizeof(g_vertex_buffer_data)等于sizeof(std::vector<?>),它是矢量对象的大小,而不是所包含数据的大小。尝试使用

    glBufferData(GL_ARRAY_BUFFER,
             g_vertex_buffer_data.size() * sizeof(sf::Vector3f), 
             g_vertex_buffer_data[0], GL_STATIC_DRAW);

另一件事:在OpenGL 3.3 Core Profile中没有gl_FragColor变量。您必须定义一个输出变量。

下一步:你的顶点着色器似乎是空的。您必须写信至gl_Position,否则不会显示任何内容。

答案 1 :(得分:1)

glGetAttribLocation的可能错误代码为:

GL_INVALID_OPERATION

哪个没有固定价值。尝试使用gluErrorString()获取错误字符串,或者查看这些1282映射中的标题。

•检查您的着色器是否编译没有错误?

•检查着色器是否链接没有错误?

哪种类型有positionId?所有对象ID必须为GLuint类型。

并且btw总是启用着色器编译 - 链接错误检查,并且调试将提供更多信息。

我这样做(OpenGL-ES 2.0):

    m_nVertexShader = glCreateShader(GL_VERTEX_SHADER);
    m_nPixelShader = glCreateShader(GL_FRAGMENT_SHADER);


    glShaderSource(m_nVertexShader, 1, &lpszVertexBuffer, NULL);
    glShaderSource(m_nPixelShader, 1, &lpszFragmentBuffer, NULL);

    glCompileShader(m_nVertexShader);

    int iIsOk = 0;

    glGetShaderiv(m_nVertexShader, GL_COMPILE_STATUS, &iIsOk);

    if(!iIsOk)
    {
        GLint infoLen = 0;

        glGetShaderiv(m_nVertexShader, GL_INFO_LOG_LENGTH, &infoLen);

        if(infoLen > 1)
        {
            char* infoLog = (char*)malloc(sizeof(char) * infoLen);

            glGetShaderInfoLog(m_nVertexShader, infoLen, NULL, infoLog);


            QMessageBox::warning(this, QString("Error"),
                                 QString(infoLog), QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes);

            free(infoLog);
        }

        glDeleteShader(m_nVertexShader);

        return;
    }

    glCompileShader(m_nPixelShader);

    glGetShaderiv(m_nPixelShader, GL_COMPILE_STATUS, &iIsOk);

    if(!iIsOk)
    {
        GLint infoLen = 0;

        glGetShaderiv(m_nPixelShader, GL_INFO_LOG_LENGTH, &infoLen);

        if(infoLen > 1)
        {
            char* infoLog = (char*)malloc(sizeof(char) * infoLen);

            glGetShaderInfoLog(m_nPixelShader, infoLen, NULL, infoLog);


            QMessageBox::warning(this, QString("Error"),
                                 QString(infoLog), QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes);

            free(infoLog);
        }

        glDeleteShader(m_nPixelShader);

        return;
    }

    m_nProgram = glCreateProgram();

    glAttachShader(m_nProgram, m_nVertexShader);
    glAttachShader(m_nProgram, m_nPixelShader);

    glBindAttribLocation(m_nProgram, 0, "rm_Vertex");

    glLinkProgram(m_nProgram);

    glGetProgramiv(m_nProgram, GL_LINK_STATUS, &iIsOk);

    // Fail to pass status validation
    if(!iIsOk)
    {
        GLint infoLen = 0;

        glGetProgramiv(m_nProgram, GL_INFO_LOG_LENGTH, &infoLen);

        if(infoLen > 1)
        {
            char* infoLog = (char*)malloc(sizeof(char) * infoLen);

            glGetProgramInfoLog(m_nProgram, infoLen, NULL, infoLog);


            QMessageBox::warning(this, QString("Error"),
                                 QString(infoLog), QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes);

            free(infoLog);
        }

        glDeleteProgram(m_nProgram);

        return;
    }

    glUseProgram(m_nProgram);

当您使用GLSL 3.3时,首先必须通过调用

指定fragment rendertarget输出
glBindFragDataLocation(this->programId, 0, "fragcolor");

其次,您的片段着色器必须像

"#version 330
out vec4 fragcolor;

void main(void) {
     fragcolor= vec4(1.0,1.0,1.0,1.0); 
}

使用此类着色器的示例位于OpenGL 3.3 + GLSL 1.5 Sample