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);
}
das ist falsch. glBufferData möchte die Größe in Bytes. Also 3 * 8. –
@ SeanO'Hanlon Das ist nicht, was sie sagen. Sie sagen dasselbe wie in meiner Antwort, aber anders formuliert. – Xirema
@ SeanO'Hanlon: Ich (und @Xirema) habe nie über 'glBufferData' gesprochen. Wir haben über die tatsächlichen Werte in Ihrem "Indicies" -Array gesprochen. – derhass