【问题标题】:OpenGL Texturing a QuadOpenGL纹理四边形
【发布时间】:2014-04-05 12:23:02
【问题描述】:

我陷入了这个纹理问题。我创建了一个四边形作为地面,我想用草图像填充它的纹理。但是,当我尝试设置 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;
}

【问题讨论】:

  • 在 MultiTexCoord2d 中使用 GL_TEXTURE0 枚举作为第一个参数。还有为什么你到底要使用已弃用的 OpenGL API?
  • 我会试一试,很好的问题 :) 我是一个新学习者,OpenGL 圣经书使用这个 API:/ 我试过 GL_TEXTURE0 枚举,但问题仍然存在。
  • 它在 floorBatch 的方法之一内崩溃?请提供更多详细信息,即使您只是包装 OpenGL 调用。
  • GLBatch floorBatch; // 这就是它的来源,不是我实现的。它是图书馆的一部分
  • floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);// 这行导致分段错误。

标签: opengl texture2d


【解决方案1】:

在 glBatch.Begin() 函数中,你应该告诉函数你想要使用的纹理数量。这里的第三个参数是纹理的数量。

【讨论】:

    【解决方案2】:

    我不知道为什么,但把那部分改成这个就解决了问题;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      相关资源
      最近更新 更多