2016-08-23 3 views
-1

Когда я пытаюсь сделать куб PERFECT, одна вершина отображает в середине куба - (.5, .5, -.5) вместо (1, 1 , 1) - и один из них делает одну единицу слишком высокой - (1, 1, 1) вместо (1, 0, 0). У меня действительно нет ни малейшего понятия, как это может произойти. Я сначала проверил, было ли это связано с загрузкой obj, и определил массивы отдельно, это не так. Это результат работы program. Это с другой точки зрения для лучшего понимания problem.Вертикальные изображения отображаются в неправильном положении (OpenGl)

Сначала я инициализировать glfw, создать окно, сделать контекст и установить различные переменные:

if (!glfwInit()) 
    { 
     std::cout << "Failed to initialize GLFW, press enter to close the application..." << std::endl; 
     std::cin.get(); 
     return false; 
    } 
    GLFWWindow *window= glfwCreateWindow(m_Width, m_Height, m_Title, NULL, NULL); 

    if (!window) 
    { 
     glfwTerminate(); 
     std::cout << "Failed to creat GLFW window, press enter to close the application..." << std::endl; 
     std::cin.get(); 
     return false; 
    } 
    glfwMakeContextCurrent(m_GLFWWindow); 

Тогда я инициализировать некоторые включить некоторые варианты Gl и задать различные другие переменные:

glClearColor(0, 0, 0, 0); 

    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    glFrontFace(GL_CW); 
    glEnable(GL_DEPTH_TEST); 
    glDepthRange(0, 1); 
    glEnable(GL_FRAMEBUFFER_SRGB); 

После что я объявляю массив вершин и массив индексов и передаю их в OpenGL: (Вершина - это всего лишь структура, содержащая три поплавка)

Vertex verticies[] = { Vertex(Vector3( 1, -1, -1)), 
          Vertex(Vector3( 1, -1, 1)), 
          Vertex(Vector3(-1, -1, 1)), 
          Vertex(Vector3(-1, -1, -1)), 
          Vertex(Vector3( 1, 1, -1)), 
          Vertex(Vector3( 1, 1, 1)), 
          Vertex(Vector3(-1, 1, 1)), 
          Vertex(Vector3(-1, 1, -1)) }; 

    unsigned int indicies[] = { 2, 4, 1, 
           8, 6, 5, 
           5, 2, 1, 
           6, 3, 2, 
           3, 8, 4, 
           1, 8, 5, 
           2, 3, 4, 
           8, 7, 6, 
           5, 6, 2, 
           6, 7, 3, 
           3, 7, 8, 
           1, 4, 8}; 

GLu vbo; 
Glu ibo; 
glGenBuffers(1, &vbi); 
glGenBuffers(1, &ino); 
glBindBuffer(GL_ARRAY_BUFFER, m_Vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(verticies[0]) * 8, &verticies, GL_STATIC_DRAW); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_Ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicies[0]) * 36, &indicies, GL_STATIC_DRAW); 

Затем я создаю программу, компилировать шейдеры и связать их с программой:

GLuint program = glCreateProgram(); 
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
GLchar vertexCode = "vertexShader code"; 
GLchar fragmentCode = "fragmenShader code"; 
glShaderSource(vertexShader , 1, &vertexCode, NULL); 
glCompileShader(vertexShader); 
glShaderSource(fragmentShader, 1, &fragmentCode, NULL); 
glCompileShader(fragmentShader); 
glAttachShader(program , vertexShader); 
glAttachShader(program , fragmentShader); 
glLinkProgram(m_Program); 
glValidateProgram(m_Program); 

Теперь мы находимся в цикле игры:

while(1) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glUseProgram(program); 
    glEnableVertexAttribArray(0); 

    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
    glDisableVertexAttribArray(0); 
} 

ответ

1

Ваши показатели выключены на один, они основаны на 0 в OpenGL, поэтому для вашего массива допустимы только значения от 0 до 7, а с помощью 8 будет доступ к некоторой внеочередной памяти с неопределенным содержимым.

+0

это неправильная информация. glBufferData хочет размер в байтах. поэтому 3 * 8. –

+1

@ SeanO'Hanlon Это не то, что они говорят. Они говорят то же самое, что и в моем ответе, но формулируются по-разному. – Xirema

+1

@ SeanO'Hanlon: Я (и @Xirema) никогда не говорил о 'glBufferData'. Мы говорили о фактических значениях в вашем массиве 'indicies'. – derhass

1

Ваш индексный массив выглядит неправильно. Он должен быть проиндексирован в диапазоне [0...7] вместо [1...8].