我正在尝试在openGL中渲染纹理。我的代码是:
void startupDemo()
{
// int x, y, z, i;
time=0;
timebase=0;
frame=0;
sprintf( fps_glut, "FPS:init in progress" );
fpssss = 0.0;
glClearColor(0.0, 0.0, 0.0, 0.9) ;
//loadTextures();
glShadeModel(GL_SMOOTH);
//glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
// Enable lighting //////////////
//glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0,GL_POSITION, g_lightPosition);
glLightfv(GL_LIGHT0, GL_AMBIENT, g_lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, g_lightDiffuse);
// Mesh texture loading ////////////////////////////////////////////////////////////
if( g_texture_pixmap = BMP_Loader("dididj.jpg" ) )
{
glGenTextures( 1, &mesh.textureId );
// Creation d'un nouvel objetde texture //////////////
glBindTexture(GL_TEXTURE_2D, mesh.textureId);
// Stockage des data dans le nouvel objetde texture .
glTexImage2D( GL_TEXTURE_2D, 0, 3, g_texture_width, g_texture_height, 0, GL_RGB, GL_UNSIGNED_BYTE, g_texture_pixmap );
printf( "\nLoading texture 1 on board ok." );
}
else
{
printf( "\nLoading texture 1 failed!" );
}
if( g_texture_pixmap )
{
delete [] g_texture_pixmap;
g_texture_pixmap=NULL;
}
// Mesh texture loading ////////////////////////////////////////////////////////////
if( g_texture_pixmap = BMP_Loader( "data/virus.bmp" ) )
//if( g_texture_pixmap = BMP_Loader( "data/texture01.bmp" ) )
{
glGenTextures( 1, &g_texID );
// Creation d'un nouvel objetde texture //////////////
glBindTexture(GL_TEXTURE_2D, g_texID );
// Stockage des data dans le nouvel objetde texture .
glTexImage2D( GL_TEXTURE_2D, 0, 3, g_texture_width, g_texture_height, 0, GL_RGB, GL_UNSIGNED_BYTE, g_texture_pixmap );
printf( "\nLoading texture 2 on board ok." );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
// S et T : coordonnes du texel (texture element) ////////////////
// GL_REPEAT:repetition du motif dans le sens des S (GL_TEXTURE_WRAP_S)
// ou des T (GL_TEXTURE_WRAP_T) ///////////////////////////////////////
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// Positionne la fonction de texture active (cioe les valeurs des texels
// peuvent moduler la couleur dans laquelle le polygone serait rendu en
// l'absence de texture, ou plus simplement comment sont combinees les
// valeurs des texels avec les valeurs chromatiques du fragment traite)... ouf!
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
}
else
{
printf( "\nLoading texture 2 failed!" );
}
if( g_texture_pixmap )
{
delete [] g_texture_pixmap;
g_texture_pixmap=NULL;
}
/*
if( mesh.load( "data/chrome_logo.asc" ) )
{
shutdownDemo();
exit(0);
}
mesh.preProcess();
*/
glEnable(GL_DEPTH_TEST); // Turn depth testing on
// This is where we initialize our empty texture to be rendered too.
// We pass in the texture array to store it, the texture size,
// the channels (3 for R G B), the type of texture (RGB) and texture ID.
CreateBlankRenderTexture( &g_tex_0_ID, 512, 3, GL_RGB);
// Create the texture map for the spinning cube and assign it to texture ID 1
//CreateTexture(g_Texture, "Brick.bmp", 1);
g_tex_1_ID = g_texID;
}
我是OpenGL的新手,我已经尝试过调试代码,但我仍然没有得到结果。我已经验证了函数的参数是否正确,尽管我收到警告:
C:\Users\HP\Desktop\cg\project\main.cpp||In function 'void startupDemo()':|
C:\Users\HP\Desktop\cg\project\main.cpp|744|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
C:\Users\HP\Desktop\cg\project\main.cpp|768|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
我之前也看过这个警告,我认为它是无害的,所以不能成为错误的根源。
WRT Weather Vane的评论:使用此功能的程序可以正常运行,除了纹理无法加载和终端之外没有崩溃#34;纹理加载失败" 得到印刷。
答案 0 :(得分:3)
您的函数BMP_Loader()
适用于位图文件,顾名思义。
它的实现包含对带
的位图结构的引用data = (Byte_ *)(fileBuffer + sizeof(sBMP_header) + sizeof(sBMP_info) );
但是你要它处理JPG文件。
您的上述评论表示即使位图文件也无效。也许它们是错误的格式(你测试它)。也许位图struct
声明是错误的(未发布,但我看到字段名称已被翻译成法语。也许它们应该是packed
。也许数字字段的字节顺序错误。
使用调试器,找出哪一行从函数NULL
返回BMP_Loader()
。
更新 - 此示例显示打包struct
的区别。没有它,您的声明将与标题格式不匹配。
#include <stdio.h>
typedef unsigned int Dword_; // 32 bits
typedef unsigned short Word_; // 16 bits
typedef unsigned char Byte_; // 8 bits
#pragma pack(push, 1)
typedef struct tagBITMAPFILEHEADER { // my struct
Word_ bfType;
Dword_ bfSize;
Word_ bfReserved1;
Word_ bfReserved2;
Dword_ bfOffBits;
} BITMAPFILEHEADER;
#pragma pack(pop)
struct sBMP_header // your struct
{
Word_ codmag;
Dword_ taille;
Word_ reserv1;
Word_ reserv2;
Dword_ offsetImage;
};
int main(int argc, char const *argv[])
{
printf ("My struct size %d\n", sizeof(BITMAPFILEHEADER));
printf ("Your struct size %d\n", sizeof(struct sBMP_header));
return 0;
}
节目输出:
My struct size 14
Your struct size 16
我不知道你的编译器会使用什么语法pack
结构(我的是MSVC)。没有它,单独的第一个Word_
字段之后的下一个字段与32位对齐,而相邻的Word_
字段一起取32位,这解释了16位大小的差异。
另一个structs
同样如此。