OpenGL текстурирование квадроцикла

Я застрял в этой проблеме текстурирования. У меня есть четырехугольник в качестве земли, и я хочу заполнить его текстуру изображением травы. Но когда я пытаюсь установить значения MultiTexCoord2f, я получаю ошибку Segmentation Fault. Я не мог найти причину. Что я здесь делаю неправильно?

SetupRC(){
    floorBatch.Begin(GL_QUADS, 4);
    floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
    floorBatch.Vertex3f(-50.0f, 0.0f, -50.0f);


    floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
    floorBatch.Vertex3f(50.0f, 0.0f, -50.0f);


    floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
    floorBatch.Vertex3f(-50.0f, 0.0f, 50.0f);


    floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
    floorBatch.Vertex3f(50.0f, 0.0f, 50.0f);
    floorBatch.End();    

    glGenTextures(1, textures);

// Grass floor
    pBytes = gltReadTGABits("Grass.tga", &nWidth, &nHeight, &nComponents, &format);
    glBindTexture(GL_TEXTURE_2D, textures[0]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D,0,nComponents,nWidth, nHeight, 0,
    format, GL_UNSIGNED_BYTE, pBytes);
    glGenerateMipmap(GL_TEXTURE_2D);

    free(pBytes);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
    RenderScene(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    static GLfloat vFloorColor[] = { 0.0f, 1.0f, 0.0f, 1.0f};
    M3DMatrix44f mCamera;
    cameraFrame.GetCameraMatrix(mCamera);
    mModelview.PushMatrix(mCamera);
    mModelview.Translate( 0.0f, -0.3f, -2.5f);
    mModelview.PushMatrix();
    mModelview.Translate( 0.0f, -0.3f, 0.0f);
    mModelview.PushMatrix();
    glBindTexture(GL_TEXTURE_2D, textures[0]);
    shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), vFloorColor, 0);
    floorBatch.Draw();    
    mModelview.PopMatrix();
    mModelview.PopMatrix();
    mModelview.PushMatrix();
}
main()
{
            gltSetWorkingDirectory(argv[0]); // 

        glutInit(&argc, argv); //opengl initialization
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL); //display mode set
        glutInitWindowSize(800, 600); //window size
        glutCreateWindow("Neighbourhood"); // title ile pencereyi yarattik
        glutReshapeFunc(ChangeSize); // pencere boyutu degisince cagrilan fonksiyonun adi
        glutDisplayFunc(RenderScene); // her bir frame icin cagrilan fonksiyonun adi
            glutSpecialFunc(SpecialKeys);

// Add menu entries to change filter
        glutCreateMenu(ProcessMenu);
        glutAddMenuEntry("GL_NEAREST",0);
        glutAddMenuEntry("GL_LINEAR",1);
        glutAddMenuEntry("GL_NEAREST_MIPMAP_NEAREST",2);
        glutAddMenuEntry("GL_NEAREST_MIPMAP_LINEAR", 3);
        glutAddMenuEntry("GL_LINEAR_MIPMAP_NEAREST", 4);
        glutAddMenuEntry("GL_LINEAR_MIPMAP_LINEAR", 5);

        glutAttachMenu(GLUT_RIGHT_BUTTON);

        GLenum err = glewInit(); // bu ne a.q.
        if (GLEW_OK != err) {
            fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
            return 1;
            }

        SetupRC(); // opengle ozel kendimizce ayarlari initialize edecegimiz fonksiyon

        glutMainLoop(); // opengl calisiyor

        ShutdownRC();
        return 0;
}

person zgrw    schedule 05.04.2014    source источник
comment
Используйте перечисление GL_TEXTURE0 в качестве первого параметра в MultiTexCoord2d. Также с какой стати вы используете устаревший API OpenGL?   -  person Michael IV    schedule 05.04.2014
comment
Я попробую и хороший вопрос :) Я новичок, и книга Библии OpenGL использует этот API: / Я пробовал перечисление GL_TEXTURE0, но проблема не устранена.   -  person zgrw    schedule 05.04.2014
comment
Он падает внутри одного из методов FloorBatch? Пожалуйста, предоставьте более подробную информацию, даже если вы просто упаковываете вызовы OpenGL.   -  person Plow    schedule 05.04.2014
comment
GLBatch FloorBatch; // вот откуда это взялось, это не то, что я реализовал. Это часть библиотеки   -  person zgrw    schedule 05.04.2014
comment
floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);// эта строка вызывает ошибку сегментации.   -  person zgrw    schedule 05.04.2014


Ответы (2)


В функции glBatch.Begin() вы должны сообщить функции количество текстур, которые вы хотите использовать. Третий параметр здесь — количество текстур.

person NJUHOBBY    schedule 13.04.2014

Я не знаю почему, но изменение этой части на это решило проблему;

floorBatch.Begin(GL_TRIANGLE_STRIP, 4, 2);

floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
floorBatch.Vertex3f(-50.0f, 0.0f, -50.0f);

floorBatch.MultiTexCoord2f(0 , 1.0f, 0.0f);
floorBatch.Vertex3f(50.0f, 0.0f, -50.0f);

floorBatch.MultiTexCoord2f(0 , 0.0f, 1.0f);
floorBatch.Vertex3f(-50.0f, 0.0f, 50.0f);

floorBatch.MultiTexCoord2f(0 , 1.0f, 1.0f);
floorBatch.Vertex3f(50.0f, 0.0f, 50.0f);
floorBatch.End();
person zgrw    schedule 05.04.2014