2015-11-24 3 views
0

Я получаю сообщение об ошибке при попытке использовать внутри Вао по SFML и не уверен, если это SFML или это мой собственный код OpenGLSFML - OPENGL VAO вопрос дает мне (1282) ошибка

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(), но все еще возникает проблема.

+1

Добро пожаловать в SO! Соберите эти фрагменты кода в [MVCE] (http://stackoverflow.com/help/mcve), в противном случае нам нужно было бы угадать, что происходит в коде, который не показан. –

+0

Это код, который используется в коде opengGl. Поскольку я не уверен, где проблема, я только что включил весь код OpenGl. – user5600884

+3

. Это довольно хорошо определено, что считается MVCE здесь, без этого ваш вопрос просто не произошел. Я не буду тратить время на создание тестового приложения, чтобы сделать ваши фрагменты кода работоспособными, и я бы сомневался в других. –

ответ

1

Возможные коды ошибок для glGetAttribLocation являются:

GL_INVALID_OPERATION 

, которые не имеют фиксированного значения. Попробуйте получить строку с ошибкой gluErrorString() или загляните в заголовок, какой из этих 1282 карт.

• проверить, что ваш шейдер был скомпилирован без ошибок?

• проверить, что ваш шейдер связан без ошибок?

Какой тип имеют positionId? Все идентификаторы объекта должны быть GLuint.

И btw allways включает проверку ошибок компоновки шейдеров, а отладка будет более информативной.

Я делаю это таким образом (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, Кулак необходимо указать выходной фрагмент 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.

+0

Итак, я пошел вперед и поставил перед gLinkProgram: glBindAttribLocation (this-> programId, 0, "position") ... но я все равно получаю ту же ошибку. – user5600884

+0

@ user5600884: Какой тип имеет 'positionId'? – Mykola

+0

1282 является GL_INVALID_OPERATION – BDL

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 основного профиля нет gl_FragColor переменной. Вам нужно будет определить переменную out.

Next: Ваш вершинный шейдер кажется пустым. Вам нужно написать gl_Position, иначе ничего не будет показано.

+0

Я отредактировал код и все еще имею проблемы и получаю ошибку 1282. Любые другие идеи? – user5600884

+0

Узнайте, в какой строке происходит ошибка. Попробуйте переместить glGetError, пока не узнаете, какая команда OpenGL вызывает ошибку. – BDL

+0

хорошо, поэтому я получаю ошибку компиляции шейдера в моем шейдере фрагмента, но мой вершинный шейдер в порядке. Но glError() возвращает 0 – user5600884