Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - thecheeselover

Pages: [1]
1
Graphique / window.clear() unbinds ma seule texture
« le: Mai 30, 2015, 07:44:09 pm »
Le titre dit tout: je me demande pourquoi la méthode window.clear() unbinds ma seule et unique texture. Ce que je voudrais faire c'est loader un texture atlas et ne plus avoir à utiliser la bande passante entre le CPU et le GPU pour les textures pour le reste de l'application. Si je bind ma texture juste avant le window.clear(), la texture reste noire. Pourtant, si je la bind tout de suite après le window.clear(), alors ma texture apparaît comme il se doit.

J'ai fait des tests et si je bind ma texture seulement la première fois que la fonction Draw() de mon engine est appelée, alors mes textures apparaissent une seule fois. Il y a donc quelque chose qui unbind ma texture. Serait-ce possible qu'en utilisant un programme shader que cela unbind ma texture?

Init:
void Core::Init()
{
    window = new sf::RenderWindow(sf::VideoMode(800, 600), "SFML works!");
    window->setVerticalSyncEnabled(true);
    window->setMouseCursorVisible(false);
    glewInit(); // Doit être appelé quand il y a un contexte OpenGL, donc après l'instanciation de la fenêtre.

    clock = new sf::Clock();
    camera = new CameraFreeRoaming (window, glm::vec3(0.0f, 5.0f, 5.0f), VecConst::ZERO_VEC3);

    glEnable(GL_TEXTURE_2D);

    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0f, 1.0f);
    glClearDepth(1.0f);
}
 

Load:
void Core::Load()
{
    std::vector<ShaderSource> shaderSources =
        {ShaderSource("Resources/Test/Test_Tex_Shader.frag", ShaderType::FRAGMENT),
         ShaderSource("Resources/Test/Test_Tex_Shader.vert", ShaderType::VERTEX)};
    colorShader = new Shader(shaderSources);

    sf::Image img;

    if (img.loadFromFile("Resources/Test/cage.png"))
        std::cout << "Texture loaded" << std::endl;

    glGenTextures(1, &texture);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // GL_LINEAR_MIPMAP_LINEAR
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, img.getSize().x, img.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, img.getPixelsPtr());
    glGenerateMipmap(GL_TEXTURE_2D);

    colorShader->useProgram();

    glUniform1i(glGetUniformLocation(colorShader->program, "textureSampler"), 0); // 0 pour GL_TEXTURE0
    std::cout << gluErrorString(glGetError()) << std::endl;

    projectionMat = glm::perspective(glm::radians(60.0f), (float)window->getSize().x / (float)window->getSize().y, 0.001f, 1000.0f);

    glUniformMatrix4fv(glGetUniformLocation(colorShader->program, "ProjectionMatrix"), 1, GL_FALSE, &projectionMat[0][0]);
    glUniformMatrix4fv(glGetUniformLocation(colorShader->program, "ModelMatrix"), 1, GL_FALSE, &worldMatrix[0][0]); // Si location = -1 = aucune erreur; autre que -1, mais n'existe pas = erreur

    cube1 = new DrawBuffers(CubeDataGenerator::GenCube(DataGeneratorUsage::Position3 | DataGeneratorUsage::ColorRGBA | DataGeneratorUsage::TexCoord), BufferUsage::STATIC_DRAW, true);
    cube2 = new DrawBuffers(CubeDataGenerator::GenCube(DataGeneratorUsage::Position3 | DataGeneratorUsage::ColorRGBA | DataGeneratorUsage::TexCoord, 2.0f), BufferUsage::STATIC_DRAW, true);
    cube3 = new DrawBuffers(CubeDataGenerator::GenCube(DataGeneratorUsage::Position3 | DataGeneratorUsage::ColorRGBA | DataGeneratorUsage::TexCoord, 1.0f, 3.0f, 0.1f), BufferUsage::STATIC_DRAW, true);

    clock->restart();
}
 

Draw:
void Core::Draw()
{
    window->clear();
    glClear(GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, texture); // à cause de window.clear()

    colorShader->useProgram();
    glUniformMatrix4fv(glGetUniformLocation(colorShader->program, "ViewMatrix"), 1, GL_FALSE, &camera->getView()[0][0]);

    glm::vec3 v1 (0.0f, 0.0f, 0.0f);
    glm::vec3 v2 (3.0f, 0.0f, 0.0f);
    glm::vec3 v3 (6.0f, 0.0f, 0.0f);

    glUniformMatrix4fv(glGetUniformLocation(colorShader->program, "ModelMatrix"), 1, GL_FALSE, &glm::translate(worldMatrix, v1)[0][0]);
    cube1->draw();

    glUniformMatrix4fv(glGetUniformLocation(colorShader->program, "ModelMatrix"), 1, GL_FALSE, &glm::translate(worldMatrix, v2)[0][0]);
    cube2->draw();

    glUniformMatrix4fv(glGetUniformLocation(colorShader->program, "ModelMatrix"), 1, GL_FALSE, &glm::translate(worldMatrix, v3)[0][0]);
    cube3->draw();

    window->display();
}
 

2
Le rapport avec SFML c'est que ce bug a commencé après que j'ai suivi le tutoriel pour inclure SFML statiquement au lieu de dynamiquement. J'ai aucune erreur en effet.

EDIT: J'ai remarqué que certaines libraries que j'ai créées ne se construisent pas, ce qui empêche l'application de se construire.

EDIT2: J'ai réussi finalement en ajoutant un fichier .cpp pas rapport dans mon projet.

3
Général / Code::Blocks compile et build, mais sans créer d'exécutable
« le: Novembre 18, 2012, 06:18:46 pm »
Bonjour,

     Tout comme mon titre l'indique, Code::Blocks compile et build, mais sans créer d'exécutable. Tout cela a commencé lorsque j'ai remarqué que, peut importe ce que je marquais dans mon code, Code::Blocks semblait compiler du vieux code. Par exemple, si avec OpenGL mon vieux code dessinait un triangle, eh bien même si j'enlève la partie du code qui dessine ce triangle, il restera affiché sur l'écran quand j'exécuterai le programme. Je me suis alors dit que peut-être si je delete l'exécutable dans ''bin/debug/'', cela forcera Code::Blocks à reconstruire l'application. C'était une erreur de ma part. Maintenant, quand je ''run'' le programme, Code::Blocks me dit que le projet n'a pas été construit. Je lui permets par la suite de construire le programme. Code::Blocks fait comme s'il construisait l'application, sauf qu'aucun exécutable n'a été créé en réalité. Je fait ''run'' encore une fois et CB me demande toujours de construire le programme. Quelle est mon erreur?

Merci,
thecheeselover :)

Pages: [1]