opengl加载纹理,无法显示

sinblack 2009-05-04 10:18:18
一个OpenGL纹理加载程序,通过单步调试发现bmp加载成功,但纹理加载后就是无法显示,还请各位高手帮帮忙啊……
现附上代码:
#include <stdlib.h>
#include <gl/glut.h>
#include <gl/glaux.h>

GLuint texture[1]; // 存储一个纹理

AUX_RGBImageRec *LoadBMP(CHAR *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供
{
return NULL; // 如果没提供,返回 NULL
}
File=fopen(Filename,"r"); // 尝试打开文件
if (File) // 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoadA(Filename); // 载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}

int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理
{
int Status=FALSE; // 状态指示器
AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出
if (TextureImage[0]=LoadBMP("test.bmp"))
{
Status=TRUE; // 将 Status 设为 TRUE
glGenTextures(1, &texture[0]); // 创建纹理

// 使用来自位图数据生成的典型纹理
glBindTexture(GL_TEXTURE_2D, texture[0]);
// 生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,TextureImage[0]->data);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
}

if (TextureImage[0]) // 纹理是否存在
{
if (TextureImage[0]->data) // 纹理图像是否存在
{
free(TextureImage[0]->data); // 释放纹理图像占用的内存
}

free(TextureImage[0]); // 释放图像结构
}
return Status; // 返回 Status
}

void init(void)
{
glClearColor( 1.0, 1.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST);
LoadGLTextures();
}

void disp()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity();
/*将纹理映射到四边形上*/
glColor3f(1.0,1.0,0.0);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
// 后面
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
// 顶面
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
// 底面
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
// 右面
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
// 左面
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glEnd();
glFlush();
glutSwapBuffers();
}

void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0,-2.0, 2.0,-2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(300,300);
glutInitWindowPosition(200,200);
glutCreateWindow("Texture mapping");
init();
glutReshapeFunc(reshape);
glutDisplayFunc(disp);
glutMainLoop();
}
谢谢啊……
...全文
1412 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
diy2005 2011-06-03
  • 打赏
  • 举报
回复
我也遇到了问题 显示出来了后又弹错关闭了
wlpsjgs 2010-10-18
  • 打赏
  • 举报
回复
我也遇到这样的问题 加载不了, 白屏, 怀疑是图片文件格式的问题
kingkk123 2010-06-13
  • 打赏
  • 举报
回复
不是内行,看不出门道啊!帮顶了!!
bmflss 2010-06-04
  • 打赏
  • 举报
回复
俺今天也遇到同样的问题了 求解
huangchenghall 2010-04-28
  • 打赏
  • 举报
回复
友情帮顶了,

mngzilin 2010-04-27
  • 打赏
  • 举报
回复


glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
//这个在后面
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,TextureImage[0]->data);
神之泪花 2010-04-23
  • 打赏
  • 举报
回复
友情帮顶了,
huxinjie800 2010-04-20
  • 打赏
  • 举报
回复
额。。。我试了以上的两种方法,还是不对额。。。。。。。
是不是bmp图片本身的问题啊?
Adacore 2010-01-04
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <gl/glut.h>
#include <gl/glaux.h>

#pragma comment(lib,"GLAUX.LIB")

GLuint texture; // 存储一个纹理

AUX_RGBImageRec *LoadBMP(CHAR *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供
{
return NULL; // 如果没提供,返回 NULL
}
File=fopen(Filename,"r"); // 尝试打开文件
if (File) // 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoadA(Filename); // 载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}

int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理
{
int Status=FALSE; // 状态指示器
AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出
if (TextureImage[0]=LoadBMP("test.bmp"))
{
Status=TRUE; // 将 Status 设为 TRUE
glGenTextures(1, &texture); // 创建纹理

// 使用来自位图数据生成的典型纹理
glBindTexture(GL_TEXTURE_2D, texture);

// 设置纹理参数
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
// 生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,TextureImage[0]->data);


}

if (TextureImage[0]) // 纹理是否存在
{
if (TextureImage[0]->data) // 纹理图像是否存在
{
free(TextureImage[0]->data); // 释放纹理图像占用的内存
}

free(TextureImage[0]); // 释放图像结构
}
return Status; // 返回 Status
}

void init(void)
{
glClearColor( 1.0, 1.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST);
LoadGLTextures();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 首次清除屏幕和深度缓存
}

void disp()
{
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 在窗口没有改变内容时清除屏幕和深度缓存是多余的并且浪费资源的
glLoadIdentity();
/*将纹理映射到四边形上*/
glColor3f(1.0,1.0,0.0);
glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
// 后面
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
// 顶面
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
// 底面
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
// 右面
glTexCoord2f(1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下
// 左面
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上
glEnd();
glFlush();
glutSwapBuffers();
}

void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0,-2.0, 2.0,-2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
}

void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(300,300);
glutInitWindowPosition(200,200);
glutCreateWindow("Texture mapping");
init();
glutReshapeFunc(reshape);
glutDisplayFunc(disp);
glutMainLoop();
}
Adacore 2010-01-04
  • 打赏
  • 举报
回复
纹理参数的设置需要在生成纹理前进行设置。
Adacore 2010-01-04
  • 打赏
  • 举报
回复
with glew; use glew;
with glut; use glut;
with win32; use win32;
with Win32.Glaux; use Win32.Glaux;

with interfaces.c;

procedure TexMap is

pragma linker_options("-lglaux");

texture:aliased GLuint; -- texture index
function LoadBMP(fn:win32.char_array) return access AUX_RGBImageRec is
pf:aliased constant win32.char_array:=fn&NUL;
begin
return auxDIBImageLoadA(pf(0)'unrestricted_access);
end LoadBMP;

procedure LoadGLTextures is
bmp:access AUX_RGBImageRec:=new AUX_RGBImageRec;
begin
bmp:=LoadBMP("test.bmp");

glGenTextures(1,texture'unchecked_access);
glBindTexture(GL_TEXTURE_2D,texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); -- 必不可少!
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); -- 必不可少!

glTexImage2D(GL_TEXTURE_2D,0,3,win32.int(bmp.sizeX),win32.int(bmp.sizeY),0,GL_RGB,GL_UNSIGNED_BYTE,bmp.data.all'address);

end LoadGLTextures;


procedure init is
begin
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_TEXTURE_2D);
LoadGLTextures;
glClear(GL_COLOR_BUFFER_BIT); -- 首次显示屏幕清理
end init;

procedure display is
use type interfaces.c.c_float;
begin
glBindTexture(GL_TEXTURE_2D,texture);

glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,-1.0,1.0); -- 纹理和四边形的左下
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,-1.0,1.0); -- 纹理和四边形的右下
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0,1.0); -- 纹理和四边形的右上
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0,1.0); -- 纹理和四边形的左上
glEnd;

glFlush;
end display;

procedure reshape(w:in out glut.int;h:in out glut.int) is
use type interfaces.c.double;
begin
glViewport(0,0,win32.int(w),win32.int(h));
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(-2.0, 2.0,-2.0, 2.0,-2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glClear(GL_COLOR_BUFFER_BIT); -- 改变窗口大小后屏幕清理
end reshape;

Handle:integer;

begin
glutInit;
glutInitDisplayMode(GLUT_SINGLE or GLUT_RGB);
glutInitWindowSize(300,300);
glutInitWindowPosition(200,200);
handle:=glutCreateWindow("Texture"&CHARACTER'FIRST);
init;
glutDisplayFunc(display'address);
glutReshapeFunc(reshape'address);
glutMainLoop;
end TexMap;
haowensxsf 2009-12-25
  • 打赏
  • 举报
回复
在disp 函数中glEnable(GL_TEXTURE_2D) 放在glBindTexture(GL_TEXTURE_2D, texture[0])前,把
glBindTexture(GL_TEXTURE_2D, texture[0]) 前的那个glcolor3f()屏蔽掉试一下
xupeihuagudulei 2009-11-29
  • 打赏
  • 举报
回复
这版块人确实挺少的,在CSDN .net版块人都不多,别说这个了。
赵4老师 2009-11-26
  • 打赏
  • 举报
回复
参考‘学OpenGL编3D游戏’的源码不知有没有用。
xqhrs232 2009-11-25
  • 打赏
  • 举报
回复
我现在也遇到这样的问题,不知道问题出在什么地方!!!
sinblack 2009-05-04
  • 打赏
  • 举报
回复
怎么没人呢?

3,423

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧