当前位置: 首页 > 知识库问答 >
问题:

在具有抗混淆现象的平行六面体(带有剪切的矩形)上渲染纹理

蓬意致
2023-03-14

我有一个抗锯齿问题。我的目标是在“剪切矩形”上渲染纹理,即平行六面体。但是使用下面的代码,垂直线是像素化的。我试图改变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映射或“特写”过滤器的文章,但不了解如何在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,而不是全局矩阵(所有元素都被切变)。

共有2个答案

南门野
2023-03-14

在创建纹理时使用mipmap最终达到了目的。

在glTexImage2D之前,我添加了:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

在glTexImage2D之后,我添加了:

glGenerateMipmap(GL_TEXTURE_2D);

对于我的200x300图像,CPU消耗不会改变。

贺劲
2023-03-14

这是一个有趣的问题。从图片上看,我认为它完全适合设备空间。您可能认为过滤可以解决这个问题,但事实并非如此。

要了解为什么会这样,您需要了解过滤的工作原理。如果纹素不适合像素,显卡应该怎么做?对于GL_NEAREST它选择最匹配的纹素并使用它。对于GL_LINEAR它需要落入像素的纹素的称重平均值。

当texel和像素完美匹配时会发生什么?GL_最接近的像素按预期拾取。对于GL_LINEAR,所有像素,即恰好一个像素,取其加权平均值。如您所见,在这种情况下,纹理被完美复制。

你有什么选择?

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

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

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

 类似资料:
  • 我需要使用Qt3D在QtQuick应用程序中渲染本机预渲染的OpenGL纹理。 我使用cuda将场景实时渲染到绑定到帧缓冲区的纹理。然后我想在qml场景中显示渲染的纹理。 似乎,我必须以某种方式干预渲染传递并在我的纹理GLuint上调用glBindTexture()。 当然有一个解决方法,我可以将纹理从视频内存加载到一些缓冲区,然后创建QTexture2D,并使用QTextureImageData

  • 问题内容: 我想在matplotlib中渲染一个卷。该体积是一个简单的7x7x7多维数据集,并且我希望能够看到所有内部体素(即使我知道它看起来像一团糟)。 我已经能够渲染透明的体素,但是似乎从未绘制过表面上没有的任何体素。 该卷的每个7x7切片应如下所示: 我汇集了MWE 以下代码使用5x5的红色,绿色,蓝色,黄色和青色层创建5x5x5的体积。每层的Alpha设置为.5,因此整个过程应该是透明的。

  • 我试图在现有画布中的特定框顶部添加一些红色矩形,与预期结果图像完全相同,但它们根本没有出现,因为我的代码显示了部署应用程序时当前不希望出现的结果。我的代码是在顶行和底行分别创建4个矩形,但我只想将其添加到框2-6的顶部,但我知道需要为框1顶部的红色矩形添加额外的代码 activity_main.xml MainActivity.java

  • 我正在模型的多个网格上渲染不同的纹理,但是我对程序没有太多的线索。有人建议为每个网格创建自己的描述符集,并调用vkCmdBindInvptorSets()和vkCmdDrawIndexed()进行这样的渲染: 然而,上面的方法与chopper样本和vulkan样本有很大不同,这让我不知道从哪里开始改变。我真的很感激任何能帮我找到正确方向的帮助。 干杯