OpenGL: Kann durch Dreiecke durch sehen



  • Hallo Leute,

    Ich habe angefangen, ein bisschen OpenGL zu lernen und wollte einen Wuerfel zeichnen. Dazu habe ich ein Array aus Vertizes und ein Array aus Indizes und versuche mittels glDrawElements zu zeichnen. Aus irgendeinem Grund kann ich jedoch durch manche Seiten durchsehen und ich weiss nicht wieso. Hier ein Screenshot: http://www.fotos-hochladen.net/uploads/screenshot201p6oqkhiwgv.png

    Was ich schon versuche habe: Diverse Optionen (GL_CULL_FACE/GL_DEPTH_BUFFER/etc) mit glEnable/glDisable aktivieren/deaktivieren sowie deren Optionen rumgespielt (GL_CW/GL_CCW, GL_FRONT_FACE, ...)

    Hier mein Code:

    #include <cmath>
    #include <iostream>
    
    #include <glm/glm.hpp>
    
    #include "error.hpp"
    #include "gl.hpp"
    #include "shader.hpp"
    #include "shader_list.hpp"
    #include "shader_program.hpp"
    #include "types.hpp"
    
    #include "buffer.hpp"
    #include "camera.hpp"
    #include "position.hpp"
    #include "stopwatch.hpp"
    
    glfloat const cube_vertices[]
    {
    	0.5f, 0.5f, 0.5f, 1.0f,
    	1.0f, 0.0f, 0.0f, 1.0f,
    
    	0.5f, -0.5f, 0.5f, 1.0f,
    	1.0f, 1.0f, 1.0f, 1.0f,
    
    	-0.5f, -0.5f, 0.5f, 1.0f,
    	0.0f, 0.0f, 1.0f, 1.0f,
    
    	-0.5f, 0.5f, 0.5f, 1.0f,
    	1.0f, 1.0f, 0.0f, 1.0f,
    
    	0.5f, 0.5f, -0.5f, 1.0f,
    	0.0f, 1.0f, 0.0f, 1.0f,
    
    	0.5f, -0.5f, -0.5f, 1.0f,
    	1.0f, 0.0f, 1.0f, 1.0f,
    
    	-0.5f, -0.5f, -0.5f, 1.0f,
    	0.0f, 0.0f, 0.0f, 1.0f,
    
    	-0.5f, 0.5f, -0.5f, 1.0f,
    	0.0f, 1.0f, 1.0f, 1.0f,
    };
    
    glubyte const cube_indices[]
    {
    	0, 1, 2,
    	0, 2, 3,
    
    	0, 4, 5,
    	0, 5, 1,
    
    	0, 7, 4,
    	0, 3, 7,
    
    	6, 7, 3,
    	6, 3, 2,
    
    	6, 1, 5,
    	6, 2, 1,
    
    	6, 4, 7,
    	6, 5, 4,
    };
    
    // 45 degrees
    glfloat const quater_pi = std::atan(1);
    
    int main()
    {
    	create_context(1024, 768, "OpenGL");
    
    	shader_list l;
    	l += shader("test.vs", shader_type::vertex);
    	l += shader("test.fs", shader_type::fragment);
    	shader_program sp(l);
    
    	gluint vao;
    	glGenVertexArrays(1, &vao);
    	glBindVertexArray(vao);
    
    	buffer cube_vertex_buffer(cube_vertices, sizeof cube_vertices, GL_ARRAY_BUFFER);
    	buffer cube_index_buffer(cube_indices, sizeof cube_indices, GL_ELEMENT_ARRAY_BUFFER);
    
    	glEnableVertexAttribArray(0);
    	glEnableVertexAttribArray(1);
    	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(glfloat), nullptr);
    	glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(glfloat), reinterpret_cast<void*>(4 * sizeof(glfloat)));
    
    	glClearColor(0.5f, 0.5f, 0.5f, 1.f);
    
    	auto uf_proj_cam_mat = sp.uniform("proj_cam_mat");
    	auto uf_obj_transf_mat = sp.uniform("obj_transf_mat");
    
    	auto projection_matrix = view_frustum(quater_pi, 4.f / 3.f, 0.f, 1000.f);
    
    	camera cam;
    	position cube_position{ glm::vec3{ -0.5f, 0.0f, 1.0f, } };
    
    	stopwatch<> sw;
    
    	check_errors();
    
    	while(!glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED))
    	{
    		glClear(GL_COLOR_BUFFER_BIT);
    
    		auto proj_cam_mat = projection_matrix * cam.pos.as_matrix();
    		glUniformMatrix4fv(uf_proj_cam_mat, 1, GL_FALSE, &proj_cam_mat[0][0]);
    
    		auto cube_mat = cube_position.as_matrix();
    		glUniformMatrix4fv(uf_obj_transf_mat, 1, GL_FALSE, &cube_mat[0][0]);
    		glDrawElements(GL_TRIANGLES, sizeof cube_indices / sizeof *cube_indices, GL_UNSIGNED_BYTE, nullptr);
    
    		auto elapsed = duration_cast<float>(sw.tick());
    
    		cube_position.rotate(elapsed);
    		cam.move(elapsed);
    
    		glfwSwapBuffers();
    	}
    
    	destroy_context();
    }
    

    Gruesse,
    Der Kellerautomat



  • Probier einmal:
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    und bei glClear: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    vielleicht ist der Depth-Test das Problem



  • Was bei derartigen Problemen immer am meisten Hilft, ist ein Screenshot. Hast du überhaupt einen Depth Buffer?



  • Hallo ihr beiden,

    Vielen Dank, da hats bei mir gerade geklingelt. Einerseits hatte ich keinen Depth-Buffer, andererseits habe ich vergessen, diesen bei jedem Frame zu clearen, wodurch Tests damit zu Artefakten gefuehrt haben. Ich habe jetzt 24 Depth-Bits gesetzt, bei glClear zusaetzlich den Depth Buffer angegeben, sowie GL_CULL_FACE aktiviert, nun funktioniert alles wie gedacht. Einen Screenshot habe ich uebrigens gepostet @dot 😉

    Vielen Dank nochmal,
    Der Kellerautomat



  • Kellerautomat schrieb:

    Einen Screenshot habe ich uebrigens gepostet @dot 😉

    Sry, das hab ich irgendwie übersehen. 🤡


Anmelden zum Antworten