首页 文章

在具有抗锯齿的平行六面体(具有剪切的矩形)上渲染纹理

提问于
浏览
1

我有一个消除锯齿的问题 . 我的目标是在“剪切的矩形”上渲染纹理,即平行六面体 . 但是使用下面的代码,垂直线是像素化的 . 我试过没有成功改变glShadeModel,glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);使用GL_LINEAR,GL_NEAREST_MIPMAP_LINEAR等 . 在“InitializeGL”序列中,我尝试添加“glEnable(GL_POLYGON_SMOOTH);”但我想这是多边形而不是纹理 . 我找到了关于使用mip-mapping或“特写”过滤器的文章,但没有理解如何在OpenGL中编写代码 . 在没有锯齿的情况下在平行六面体上渲染纹理的最佳方法是什么?在下面,您可以看到我必须获得剪切效果的“yTanAngle”:

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureId);
glBegin(GL_QUADS);
glColor4ub(255,255,255,incrustInfo->atexte);
glTexCoord2d(0.0, 0.0); glVertex2d(x0, y0);
glTexCoord2d(1.0, 0.0); glVertex2d(x1, y0);
glTexCoord2d(1.0,1.0);  glVertex2d(x1 + yTanAngle, y1);
glTexCoord2d(0.0,1.0);  glVertex2d(x0 + yTanAngle, y1);
glEnd();
glDisable(GL_TEXTURE_2D);

我还尝试应用剪切矩阵:

//--- Shearing
GLdouble shearing[16] = {1.0,0.0,0.0,0.0, tan(angle*M_PI/180.0),1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0};
glMultMatrixd(shearing);

但我仍然有一个像素化的图像 . 另一个问题是我想将这个剪切仅应用于此gl_quad,而不是全局矩阵(所有元素都被剪切) .

正如Nils Pipenbrinck所说,这是一个截图(但它是从保存到.BMP的Windows屏幕截图中完成的,并加载到freeimagehosting,它提供.PNG链接......但是我们可以看到标志的像素化):sheared flag needs antialiasing http://s0.uploads.im/QWx3i.png

2 回答

  • 0

    现在这是一个有趣的问题 . 从图中我可以看出它与设备空间完全吻合 . 您会认为过滤会解决此问题,但事实并非如此 .

    要了解为什么会出现这种情况,您需要了解过滤的工作原理 . 如果纹理像素不适合像素那么显卡应该做什么?使用GL_NEAREST,它会选择匹配最佳的纹素并使用它 . 使用GL_LINEAR,它采用落入像素的纹素的加权平均值 .

    当纹理像素与像素完美匹配时会发生什么?使用GL_NEAREST,按预期选择像素 . 使用GL_LINEAR所有像素,只需要一个像素,并采用它们的加权平均值 . 正如您在本案中所看到的,纹理完美复制 .

    你有什么选择?

    你可以做的最干净的事情是在你的图形编辑器中倾斜标志并绘制一个普通的矩形,尽管使用alpha混合 .

    一个稍微狡猾的解决方案是将矩形向左或向右移动0.5个设备坐标 . 这将改变完美重叠,并且将应用GL_LINEAR过滤 .


    顺便说一句,如果这是你的GUI并且它永远不会被缩放(就像在3D场景中使用的那样),那么你不应该使用mipmap,浪费你的内存空间 .

  • 0

    在创建纹理时使用mipmap最终成功了 .

    在glTexImage2D之前,我补充说:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    

    在glTexImage2D之后,我补充道:

    glGenerateMipmap(GL_TEXTURE_2D);
    

    并且我的200x300图像的CPU消耗没有改变 .

相关问题