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

glTexImage2D与GluBuild2D地图

万俟浩
2023-03-14
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 );
//gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width,   height, GL_RGB, GL_UNSIGNED_BYTE, data );
glTexImage2D( GL_TEXTURE_2D,0, GL_RGB, width,   height,0, GL_RGB, GL_UNSIGNED_BYTE, data );
free( data );
return texture;
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture );

glPushMatrix();
glRotatef( theta, 0.0f, 0.0f, 1.0f );
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
glEnd();
glPopMatrix();

SwapBuffers( hDC );

使用glTexImage2D,除了使用gluBuild2DMipmaps工作,我看到了使用gDebugger正确创建纹理的结果。有什么问题吗?

共有1个答案

潘弘扬
2023-03-14

使用glTexImage2D(…) 在代码中,您不会构建mipmap complete纹理。它只为纹理LOD 0创建存储并提供数据。如果您使用的是GL\ux_MIPMAP_u3; 作为你的缩小过滤器,你需要每四分之一分辨率的步骤都有LOD(细节级别)。

例如,尺寸为32x32的纹理需要log232=5个额外的mipmap LOD,如下所述:

LOD 0: 32x32  ( 1 /    1 )  [1024 Texels]
LOD 1: 16x16  ( 1 /    4 )  [ 256 Texels]
LOD 2: 8x8    ( 1 /   16 )  [  64 Texels]
LOD 3: 4x4    ( 1 /   64 )  [  16 Texels]
LOD 4: 2x2    ( 1 /  256 )  [   4 Texels]
LOD 5: 1x1    ( 1 / 1024 )  [   1 Texel ]

>

  • OpenGL纹理中的默认LOD级别范围:1001

这将生成mipmap完整纹理,可与mipmap缩小过滤器一起使用。

OpenGL中的默认缩小过滤器是:GL\u NEAREST\u MIPMAP\u LINEAR,因此除非将其更改为GL\u LINEARGL\u NEAREST,否则需要MIPMAP complete纹理。

OpenGL中的LOD索引在某种程度上与直觉相反。较低的数字代表较高分辨率的图像,这就是为什么使用负LOD偏差有时被称为“纹理锐化”。

几何级数:11/41/161/64...1/N收敛到4/3;mipmap需要大约33%的额外存储空间。

 类似资料:
  • 问题内容: 我刚刚使用s 数组在我的LWJGL代码中工作了一个测试纹理。但是,现在,我需要从文件加载图像并将其存储在纹理中。我已经加载了图像并将数据放入一个对象,但是当我这样使用时: 纹理为空,将呈现为完全黑色。我已经看过其他人如何做到这一点,但似乎无济于事…函数调用也与数组相同,除了 类型 参数外。是的,我的图像是RGB,是的4x4。我可能没有得到一些 非常 简单的信息,因此可以提供任何帮助。

  • 问题内容: 我有一个Map是一个到值列表的映射,但是我需要将其求逆,以便 变成 例如我有 我想看看 除了要遍历映射条目并创建set条目(如果不存在)并添加到列表等之外,Java 8中还有什么更简单的方法可以做到这一点?我一直认为这确实很明显,但我无法解决。 提前致谢 问题答案: 未经测试,但是您可以执行以下操作:

  • 我已经绘制地图好几个星期了,但每次我都有那种geojson文件(Featurecollection)。卡萨布兰卡不同社区的多个坐标数组(在我的示例中) {“类型”:“特征集合”,“crs”:{“类型”:“名称”,“属性”:{“名称”:“urn:ogc:def:crs:ogc:1.3:CRS84”},“特征”:{“类型”:“特征”,“属性”:{“名称”:“sid elkhader”,“地区”:“Ha

  • 问题内容: 我想展平一个将键关联到的列表的a ,而不会丢失键映射。我很好奇,就好像它是可能的,与这样做有用的和。 我们从这样的东西开始: 假设mapFrom填充在某处,如下所示: 我们还假设列表中的值是唯一的。 现在,我想“展开”它以获得第二张地图,例如: 我可以这样做(或使用,非常类似): 现在,假设我要使用lambda而不是嵌套循环。我可能会做这样的事情: 我也尝试了,但是我不认为这是正确的方

  • 问题内容: 我有以下情况:有一个对象列表-ProductData,其中包含几个字段: 还有API,它返回以下对象的列表: 但它会返回带有空计划名称字段的对象,因为在提取此对象期间不允许使用该名称。我需要通过外部参照将产品数据与RatingTableRow链接,以便将计划名称设置为RatingTableRow,因为稍后需要使用此对象,因此我创建了以下代码来做到这一点: 我知道Java文档说这不满足这

  • 我试图实现一个地图使用谷歌地图与离子。我遵循了这个链接中的编码,但我得到的只是一个空白屏幕,不知道我哪里出错了。请帮忙 这是控制器 这是html文件 请帮忙。