2014-04-05 13 views
0

이 텍스처링 문제가 있습니다. 나는 땅으로 만들어진 쿼드 (quad)를 가지고 있으며 그 텍스처를 잔디 이미지로 채우기를 원합니다. 하지만 MultiTexCoord2f 값을 설정하려고하면 Segmentation Fault 오류가 발생합니다. 이유를 찾지 못했습니다. 여기서 내가 뭘 잘못하고 있니?쿼드 (OpenGL) 쿼드 텍스처

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; 
} 
+0

MultiTexCoord2d에 첫 번째 매개 변수로 GL_TEXTURE0 열거 형을 사용하십시오. 왜 지구상에서 더 이상 사용되지 않는 OpenGL API를 사용합니까? –

+0

나는 그것을 시도하고 좋은 질문을 줄 것이다 :) 나는 새로운 학습자이고 OpenGL 성경 책은이 API를 사용한다 : GL_TEXTURE0 열거 형을 시도했지만 문제가 지속된다. – zgrw

+0

floorBatch 메소드 중 하나에서 충돌이 발생 했습니까? OpenGL 호출을 래핑하는 경우에도 더 자세한 정보를 제공하십시오. – Plow

답변

1

glBatch.Begin() 함수에서 함수에 사용할 텍스처 수를 알려야합니다. 세 번째 매개 변수는 텍스처 수입니다.

0

이유는 모르지만 그 부분을 변경하면 문제가 해결됩니다.

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();