2015-11-24 39 views
0

我正在嘗試使用VAO的SFML的內部,不知道這是否是SFML當出現錯誤或者是我自己的OpenGL代碼SFML - 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()中提出的size()問題,但仍然出現問題。爲glGetAttribLocation

+1

歡迎來到SO!裝配這些代碼段成[MVCE(http://stackoverflow.com/help/mcve),請,否則我們會猜測中沒有顯示的代碼會發生什麼。 –

+0

這是在opengGl代碼中使用的所有代碼。由於我不知道哪裏出了問題,是關於我只包括了所有的OpenGL代碼 – user5600884

+3

這是相當明確定義什麼是這裏考慮的MVCE,不說的,你的問題只是沒有發生。我不會花時間編寫測試應用程序來使您的代碼片段可運行,並且我會懷疑其他人會這樣做。 –

回答

1

可能的錯誤代碼是:

GL_INVALID_OPERATION 

不具有固定值。嘗試使用gluErrorString()獲取錯誤字符串,或者查看標題中的1282個地圖。

•檢查你的着色器編譯沒有錯誤?

•檢查着色器鏈接沒有錯誤?

什麼類型有positionId?所有對象ID必須是GLuint類型。

而且順便說一句八方通使着色器編譯,鏈接錯誤檢查和調試會更加豐富。

我這樣做,這樣(的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,拳頭必須通過調用

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