Partage
  • Partager sur Facebook
  • Partager sur Twitter

OpenGL impossible de charger une texture

    8 septembre 2018 à 18:32:34

    Salut les zeros,

    Je vous contacts, car je n'arrive pas a charger une texture à l'aide des VBO, j'essai d’afficher un simple cube, mais au lieu d'obtenir un cube avec ma texture, j'obtient un cube opaque avec une couleur de ma texture (en changeant l'image par une couleur le cube prend cette couleur).

    voila une partie de mon code: 

    void Grass::load() {
    	sf::Image texture;
    
    	if (!texture.loadFromFile(path_m))
    		std::cerr << "Error while loading texture : " << path_m << std::endl;
    	else {
    		glGenTextures(1, &id_m);
    
    		glBindTexture(GL_TEXTURE_2D, id_m);
    		{
    			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.getSize().x,
    					texture.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    					texture.getPixelsPtr());
    
    			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    		}
    		glBindTexture(GL_TEXTURE_2D, 0);
    	}
    }
    void Chunck::generate() {
    
    	{
    		std::vector vec = { -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, // Face 1
    				-1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0,     // Face 1
    
    				1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0,       // Face 2
    				1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,         // Face 2
    
    				-1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0,      // Face 3
    				-1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0,    // Face 3
    
    				-1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0,        // Face 4
    				-1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0,        // Face 4
    
    				-1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0,     // Face 5
    				-1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0,     // Face 5
    
    				-1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,         // Face 6
    				-1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0 };     // Face 6
    		vertices_m.insert(vertices_m.begin(), vec.begin(), vec.end());
    	}
    
    	{
    		std::vector vec = {0, 0,   1, 0,   1, 1,     // Face 1
                    0, 0,   0, 1,   1, 1,     // Face 1
    
                    0, 0,   1, 0,   1, 1,     // Face 2
                    0, 0,   0, 1,   1, 1,     // Face 2
    
                    0, 0,   1, 0,   1, 1,     // Face 3
                    0, 0,   0, 1,   1, 1,     // Face 3
    
                    0, 0,   1, 0,   1, 1,     // Face 4
                    0, 0,   0, 1,   1, 1,     // Face 4
    
                    0, 0,   1, 0,   1, 1,     // Face 5
                    0, 0,   0, 1,   1, 1,     // Face 5
    
                    0, 0,   1, 0,   1, 1,     // Face 6
                    0, 0,   0, 1,   1, 1};    // Face 6
    		texture_m.insert(texture_m.begin(), vec.begin(), vec.end());
    	}
    }
    
    void Chunck::draw() const {
    
    	glBindBuffer(GL_ARRAY_BUFFER, vboID_m);
    
    
    	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
        glEnableVertexAttribArray(0);
    
    	glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(vertices_m.size() * sizeof(double)));
        glEnableVertexAttribArray(2);
    
        glBindTexture(GL_TEXTURE_2D, grassTexture_m.getID());
        glDrawArrays(GL_TRIANGLES, 0, vertices_m.size());
        glBindTexture(GL_TEXTURE_2D, 0);
    
        glDisableVertexAttribArray(2);
        glDisableVertexAttribArray(0);
    
    
    	glBindBuffer(GL_ARRAY_BUFFER, 0);
    }
    
    void Chunck::load() {
    	grassTexture_m.load();
    
    	if (glIsBuffer(vboID_m) == GL_TRUE)
    		glDeleteBuffers(1, &vboID_m);
    
        glGenBuffers(1, &vboID_m);
        glBindBuffer(GL_ARRAY_BUFFER, vboID_m);
        {
    		glBufferData(GL_ARRAY_BUFFER, (vertices_m.size() + texture_m.size()) * sizeof(float), 0,
    		GL_STATIC_DRAW);
    		glBufferSubData(GL_ARRAY_BUFFER, 0, vertices_m.size() * sizeof(float), vertices_m.data());
    		glBufferSubData(GL_ARRAY_BUFFER, vertices_m.size() * sizeof(float),
    				texture_m.size() * sizeof(float), texture_m.data());
        }
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    
    }
    int main(int argc, char* argv[]) {
    	sf::ContextSettings settings;
    	settings.depthBits = 24;
    	settings.stencilBits = 8;
    	settings.antialiasingLevel = 2;
    	sf::Window window(sf::VideoMode(2048, 1024), "GAME", sf::Style::Fullscreen,
    			settings);
    	glEnable(GL_TEXTURE_2D);
    	glewInit();
    	window.setVerticalSyncEnabled(true);
    
    	glMatrixMode( GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(70, 2048. / 1024., 1., 1000);
    	glEnable(GL_DEPTH_TEST);
    
    	Chunck chunck;
    	chunck.generate();
    	chunck.load();
    	Perso perso;
    	double lastX = 0;
    	double lastY = 0;
    
    	while (window.isOpen()) {
    		sf::Event event;
    		while (window.pollEvent(event))
    			if (event.type == sf::Event::KeyReleased) {
    				if (event.key.code == sf::Keyboard::Escape)
    					window.close();
    			} else if (event.type == sf::Event::MouseMoved) {
    				perso.rotateX(lastY - event.mouseMove.y);
    				perso.rotateY(lastX - event.mouseMove.x);
    				lastX = event.mouseMove.x;
    				lastY = event.mouseMove.y;
    			}
    
    		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    		glMatrixMode( GL_MODELVIEW);
    		glLoadIdentity();
    
    		constexpr double degToRad = 3.14159265359 / 180.;
    		double xCos = std::cos(perso.getXAngle() * degToRad);
    		double xSin = std::sin(perso.getXAngle() * degToRad);
    		double yCos = std::cos(perso.getYAngle() * degToRad);
    		double ySin = std::sin(perso.getYAngle() * degToRad);
    		auto lookDir = utils::Vector<double>::create(
    				{ xCos * yCos, xSin, -xCos * ySin });
    		auto velocity = utils::Vector<double>::create(3);
    
    		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    			velocity += (utils::yd ^ lookDir) ^ utils::yd;
    
    		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    			velocity -= (utils::yd ^ lookDir) ^ utils::yd;
    
    		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    			velocity += utils::yd ^ lookDir;
    
    		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    			velocity -= utils::yd ^ lookDir;
    
    		perso.setXVel(velocity[0]);
    		perso.setYVel(velocity[1]);
    		perso.setZVel(velocity[2]);
    
    		gluLookAt(perso.getXPos(), perso.getYPos(), perso.getZPos(),
    				perso.getXPos() + lookDir[0], perso.getYPos() + lookDir[1],
    				perso.getZPos() + lookDir[2], 0, 1, 0);
    
    		chunck.draw();
    
    		glFlush();
    		window.display();
    
    		perso.update();
    		std::this_thread::sleep_for(std::chrono::milliseconds(10));
    
    	}
    
    	return EXIT_SUCCESS;
    }




    -
    Edité par theotsiv 8 septembre 2018 à 18:33:30

    • Partager sur Facebook
    • Partager sur Twitter
      11 septembre 2018 à 14:43:59

      Salut

      Mmmhh, VBO avec la pipeline fixe d'openGL, donc j'imagine que tu fais de l'openGL <= 3.0 (c'est voulu ? une contrainte?).

      Bon je ne suis réellement familié que de l'openGL moderne, mais je crois que dans ton cas il faut utiliser glTexCoordPointer pour spécifier les coordonnées uv.

      • Partager sur Facebook
      • Partager sur Twitter

      OpenGL impossible de charger une texture

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown