Ich habe eine Reihe von Scheitelpunkte im Punkte-Array angegeben, um ein Dreieck zu zeichnen, das von der oberen Mitte des Fensters aus beginnt - (+ 0.0f, + 1.0f, + 0.0f) - durch die untere linke Ecke gehen - (-1.0f, -1.0f, + 0.0f) - und schließlich in der unteren rechten Ecke des Fensters endet - + 1.0f, -1.0f, + 0.0f. Das Dreieck wird jedoch nicht wie oben erwartet gerendert, da es so aussieht, als ob es von der oberen Mitte des Fensters beginnt, dann in die obere linke Ecke geht und schließlich in der Mitte des Fensters endet. Ich habe zwei Screenshots hinzugefügt, um meine Problembeschreibung unten zu unterstützen.OpenGL: Unexpected Scheitelpunkte eines bestimmten Dreiecks
Expected triangle hinted in red
#include <cstdio>
#include <cstdlib>
#include <GL/glew.h>
#include <GLFW\glfw3.h>
int main() {
// GLFW
if (!glfwInit()) {
fprintf(stderr, "ERROR: could not start GLFW3\n");
return EXIT_FAILURE;
}
// Create window
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Test", NULL, NULL);
if (!window) {
fprintf(stderr, "ERROR: could not open window with GLFW3\n");
glfwTerminate();
return EXIT_FAILURE;
}
glfwMakeContextCurrent(window);
// GLEW
glewExperimental = GL_TRUE;
glewInit();
// Get version info
const GLubyte* renderer = glGetString(GL_RENDERER);
const GLubyte* version = glGetString(GL_VERSION);
printf("Renderer: %s\n", renderer);
printf("Supported OpenGL version: %s\n", version);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
/* Put code here */
// Vertices to be rendered
float points[] = {
+0.0f, +1.0f, +0.0f
-1.0f, -1.0f, +0.0f
+1.0f, -1.0f, +0.0f
};
// Vertex buffer object
GLuint bufferId = 0;
glGenBuffers(1, &bufferId);
glBindBuffer(GL_ARRAY_BUFFER, bufferId);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
// Vertex attribute object
GLuint attributeId = 0;
glGenVertexArrays(1, &attributeId);
glBindVertexArray(attributeId);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, bufferId);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
// Shaders
const char* vertexShaderSource =
"#version 400\n"
"in vec3 position;"
"void main() {"
" gl_Position = vec4(position.x, position.y, position.z, 1.0);"
"}";
const char* fragmentShaderSource =
"#version 400\n"
"out vec4 outColor;"
"void main() {"
" outColor = vec4 (0.0, 0.0, 1.0, 1.0);"
"}";
// Compile shaders
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// Link shaders
GLuint shaderPorgram = glCreateProgram();
glAttachShader(shaderPorgram, fragmentShader);
glAttachShader(shaderPorgram, vertexShader);
glLinkProgram(shaderPorgram);
// Render loop
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shaderPorgram);
glBindVertexArray(attributeId);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwPollEvents();
glfwSwapBuffers(window);
}
glfwTerminate();
return EXIT_SUCCESS;
}
Wow, ein komplettes, aber kurzes Stück Code? Eine kurze Beschreibung des Problems mit Beispielbildern? Könnte uns auch geben Kuchen frei! –