2016-08-23 11 views
-1

Wenn ich versuche, einen PERFECT Würfel zu rendern, rendert ein Vertex in der Mitte des Würfels - (.5, .5, -.5) statt (1, 1 , 1) - und man macht eine Einheit zu hoch - (1, 1, 1) statt (1, 0, 0). Ich habe wirklich keine Ahnung, wie das passieren könnte. Ich habe zuerst überprüft, ob es mit der Obj-Ladung zu tun hat, und die Arrays getrennt definiert, was nicht der Fall war. Dies ist die Ausgabe des program. Dies ist aus einem anderen Blickwinkel zum besseren Verständnis der problem.Vertices gerendert an der falschen Position (OpenGl)

Zuerst habe ich glfw initialisieren, erstellen Sie ein Fenster, einen Kontext machen und verschiedene Variablen gesetzt:

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); 

Dann habe ich initialisieren einige einige gl Optionen aktivieren und verschiedene andere Variablen:

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); 

Nach Dazu deklariere ich ein Vertex-Array und ein Index-Array und übergebe sie an OpenGL: (Vertex ist nur eine Struktur mit drei Floats)

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); 

Dann erstelle ich ein Programm, Shadern zusammenstellen und auf das Programm verweisen:

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); 

Jetzt sind wir an der Spielschleife:

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); 
} 

Antwort

1

Ihre Indizes weg von einem sind sie sind in OpenGL 0-basiert, daher sind nur die Werte 0 bis 7 für Ihr Array gültig, und die Verwendung von 8 wird auf einen außerhalb des zulässigen Bereichs liegenden Speicher mit nicht definierten Inhalten zugreifen.

+0

das ist falsch. glBufferData möchte die Größe in Bytes. Also 3 * 8. –

+1

@ SeanO'Hanlon Das ist nicht, was sie sagen. Sie sagen dasselbe wie in meiner Antwort, aber anders formuliert. – Xirema

+1

@ SeanO'Hanlon: Ich (und @Xirema) habe nie über 'glBufferData' gesprochen. Wir haben über die tatsächlichen Werte in Ihrem "Indicies" -Array gesprochen. – derhass

1

Ihr Index-Array sieht nicht korrekt aus. Es sollte im Bereich [0...7] anstelle von [1...8] indiziert werden.

Verwandte Themen