2012-12-18 63 views
1

我正在尝试使用凹多边形并将纹理应用于纹理。多边形可以有多个轮廓,内部孔和外部“岛”。它可以是任何形状,但会比图像更小,并适合其内部。它不一定会触及图像的边缘。OpenGL将纹理应用于镶嵌

我已经成功显示了棋盘格多边形,并且构造了一个简单的正方形,但无法让两者一起工作。

这里是我是如何加载纹理:

GLuint texture; 
    int width, height; 
    BYTE * data; 
    FILE * file; 

    // open texture data 
    file = fopen(filename, "rb"); 
    if (file == NULL) return 0; 

    // allocate buffer 
    width = 256; 
    height = 256; 
    data = (BYTE *)malloc(width * height * 3); 

    // read texture data 
    fread(data, width * height * 3, 1, file); 
    fclose(file); 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap ? GL_REPEAT : GL_CLAMP); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap ? GL_REPEAT : GL_CLAMP); 

    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width,height, GL_RGB, GL_UNSIGNED_BYTE, data); 

    free(data); 

    return texture; 

这里的镶嵌功能:

GLuint tessellate1() 
{ 
GLuint id = glGenLists(1); // create a display list 
if(!id) return id;   // failed to create a list, return 0 

GLUtesselator *tess = gluNewTess(); // create a tessellator 
if(!tess) return 0; // failed to create tessellation object, return 0 

GLdouble quad1[4][3] = { {-1,3,0}, {0,0,0}, {1,3,0}, {0,2,0} }; 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, GLTexture::LoadTextureRAW("texture.raw", true)); 

// register callback functions 
gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK *)())tessBeginCB); 
gluTessCallback(tess, GLU_TESS_END, (void (CALLBACK *)())tessEndCB); 
gluTessCallback(tess, GLU_TESS_ERROR, (void (CALLBACK *)())tessErrorCB); 
gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK *)())tessVertexCB); 

glNewList(id, GL_COMPILE); 
glColor3f(1,1,1); 
gluTessBeginPolygon(tess, 0);     // with NULL data 
    gluTessBeginContour(tess); 
     gluTessVertex(tess, quad1[0], quad1[0]); 
     gluTessVertex(tess, quad1[1], quad1[1]); 
     gluTessVertex(tess, quad1[2], quad1[2]); 
     gluTessVertex(tess, quad1[3], quad1[3]); 
    gluTessEndContour(tess); 
gluTessEndPolygon(tess); 
glEndList(); 

gluDeleteTess(tess);  // delete after tessellation 

glDisable(GL_TEXTURE_2D); 

setCamera(0, 0, 5, 0, 0, 0); 

return id;  // return handle ID of a display list 
} 

这里的细分顶点的回调函数:

// cast back to double type 
const GLdouble *ptr = (const GLdouble*)data; 

double dImageX = -1, dImageY = -1; 

//hardcoded extents of the polygon for the purposes of testing 
int minX = 607011, maxX = 616590; 
int minY = 4918219, maxY = 4923933; 

//get the % coord of the texture for a poly vertex. Assumes image and poly bounds are the same for the purposes of testing 
dImageX = (ptr[0] - minX)/(maxX - minX); 
dImageY = (ptr[1] - minY)/(maxY - minY); 

glTexCoord2d(dImageX, dImageY); 
glVertex2d(ptr[0], ptr[1]); 

而这里的显示回拨:

void displayCB() 
{ 
// clear buffer 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

// save the initial ModelView matrix before modifying ModelView matrix 
glPushMatrix(); 

// tramsform camera 
glTranslatef(0, 0, cameraDistance); 
glRotatef(cameraAngleX, 1, 0, 0); // pitch 
glRotatef(cameraAngleY, 0, 1, 0); // heading 

// draw meshes 
glCallList(listId1); //id of the tessellated poly 

// draw info messages 
showInfo(); 

glPopMatrix(); 

glutSwapBuffers(); 
} 

这样的结果是没有应用纹理的正确绘制的多边形。

+0

发布[SSCCE](http://sscce.org/)。 – genpfault

回答

1

之前显示列表内启用,或

  • BindTexture和启用(TEXTURE_2D)的问题是在该glDisable(GL_TEXTURE_2D)调用镶嵌功能。去除它后,纹理正确应用。

  • 1
    // init 
    glGenTextures(1, &texture); 
    
    // vertex callback 
    glBindTexture(GL_TEXTURE_2D, 1); 
    

    我不认为通过glGenTextures()返回的第一个ID必须为1

    尝试在您的glBindTexture()调用中使用texture而不是1

    此外,真的没有理由启用纹理并重新绑定纹理每个顶点。在调用tesselator之前,只需做一次。

    +0

    我将启用和绑定调用移动到镶嵌功能,并将相关代码添加到原始帖子中。 – BrickFrog

    1

    您没有捕获显示列表中的纹理绑定和启用,所以在重放时不会被考虑到。所以,无论是:

    • 夺BindTexture和调用呼叫清单
    +0

    非常欢迎您!感谢您的支持 – Bahbar