游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5950|回复: 15

请教:为何纹理在某些机器上显示不出来,640*480小纹理

[复制链接]

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2006-2-9 16:13:00 | 显示全部楼层 |阅读模式
在vc下用OpenGL做的,实时加载指定目录下的bmp图片作为纹理,
在自己电脑上一直没有问题;考到另一台机器上发现纹理根本无法显示出来。
试了几台机器,有的可以,有的不行;程序运行ok,也不报错或提示,
就是有特定几台上没有显示出纹理;试着把opengl,glut,glu的版本统一了也不行。

另:都是windows系统,纹理不大只有640*480,显卡再烂应该不会这都不行吧?
而且也都是中档显卡啊。。。

实在不知道究竟怎么回事,敬请各位高手指教,事先谢过!!

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-9 16:30:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

却是是显卡太烂,对于就显卡来说,128X128是十分庞大的

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-2-9 16:34:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

如果显卡的问题,那么应该更大的纹理也显示不了对不?
可是我另外一个程序用过4096*2048的图片居然也可以显示的阿。。。
不过那个程序不是实时选择加载,而是在初始化里就指定了的。
所以我很疑惑。。。会不会是我现在这种方法哪里出错么?

30

主题

569

帖子

569

积分

高级会员

Rank: 4

积分
569
发表于 2006-2-9 18:19:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

一般要求纹理的宽高必须是2的次幂

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-9 19:11:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

4楼正解

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-2-9 20:16:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

这个抱歉忘了说,原始图像640*480,后面是处理过的,扩展成2^m,2^n;还有bmp是24位的:
void COpenGLView:oadTexture(CString FilePath)
{
        wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
        glEnable(GL_TEXTURE_2D);

        TextureImage = auxDIBImageLoad(FilePath);
        int X1=TextureImage->sizeX;
        int Y1=TextureImage->sizeY;

        //对打开图象的长宽做处理,构造一个比原图象大的数组
        int X2=pow(2,(int)ceil(log(X1)/log(2)));
        int Y2=pow(2,(int)ceil(log(Y1)/log(2)));
        //拷贝数据
        data=new unsigned char[X2*Y2*3];
        int ucs=sizeof(unsigned char);
        for (int i=0;i<Y1;i++)
        {
                memset(data+ucs*X2*i*3,0,ucs*X2*3);
                memcpy(data+ucs*X2*i*3,TextureImage->data+ucs*X1*i*3,ucs*X1*3);
        }
        //计算长宽缩放比例
        XScale=X1*1.0f/X2;
        YScale=Y1*1.0f/Y2;       

        glTexImage2D(GL_TEXTURE_2D, 0, 3,X2, Y2,0, GL_RGB, GL_UNSIGNED_BYTE, data);

        //定义贴图
        glGenTextures(1, &texture);                  
        glBindTexture(GL_TEXTURE_2D, texture);   
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);

        glTexImage2D(GL_TEXTURE_2D, 0, 3,X2, Y2,0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);
}

如上,在我自己的机器上是显示正确,但是有些机器上不对,不好意思漏说了这个。。。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-2-9 22:06:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

我也不能确认是不是这个的问题,可是这么用确实也可以在几台机器上正常运行;
或者就是因为这样扩展了才出现的不稳定?
麻烦指出里面的不当之处好么?谢谢

如果今天找不出答案,明天我把能够显示和不能显示的机器显卡查一查列出来,
还请各位多多指教阿

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-2-9 23:18:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

好的,我明天找那几台机器去试试看,再来汇报结果~~

-------------------------------------------------------------------------------
确实是数组扩展的问题,自己太粗心了:
上面那段代码最后用的指针居然还是指向原始图像数据的,难怪了
一直没有发现这个低级错误,还麻烦各位帮我看了半天,不好意思
指针改过来就好了(“TexImage->”去掉),谢谢上几楼的指点!

不过也发现这个现象:
GeForce6600等系列的显卡支持即使不改变640*480大小的图片,
ATI 9550的就必须改成2的幂次尺寸;
还有两台都用Wildcat6100的有趣:一台支持,一台不支持,呵呵

虽然很不懂这里面的原因,问题解决了已经很感激 [em20] [em19]

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-2-10 12:58:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

640*480不能直接用(在某些显卡上)!

解决方案:
先将640*480的BMP图用画笔扩大成 1024*512 的 BMP 图,
扩大的部分可以是白色空白。
文理坐标定小些,只让它显示640*480的部分。

文理坐标从
(0.0f,0.0f)(1.0f,0.0f)(1.0f,1.0f)(0.0f,1.0f)变成
(0.0f,0.0f)(640/1024,0.0f)(640/1024,480/512)(0.0f,480/512)

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-2-10 13:05:00 | 显示全部楼层

Re:请教:为何纹理在某些机器上显示不出来,640*480小纹理

哦,楼上的好快啊,我刚忙着写的时候就更新了,
已经解决了,但还是谢谢你的方法,^_^
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 11:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表