我正在加载位图文件并以这种方式创建纹理:
LoadBitmapFromFile( "img.bmp", &bitmapFile );
glGenTextures(1, &texture[0] );
glBindTexture(GL_TEXTURE_2D, texture[0] );
glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmapFile.width, bitmapFile.height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
稍后,我尝试纹理三角形:
glEnable( GL_TEXTURE_2D );
glPushMatrix();
glBindTexture( GL_TEXTURE_2D, texture[0] );
glBegin( GL_TRIANGLE_STRIP );
glTexCoord2f( 0, 0 ); glVertex2f( 0, 768 );
glTexCoord2f( 1, 0 ); glVertex2f( 1024, 768 );
glTexCoord2f( 1, 1 ); glVertex2f( 0, 0 );
glTexCoord2f( 0, 1 ); glVertex2f( 1024, 0 );
glEnd();
glPopMatrix();
glDisable( GL_TEXTURE_2D );
但纹理不会在屏幕上显示,其他彩色基元也会显示。
它适用于glDrawPixel,但不会纹理三角形,可能出错?
我简化了我的应用只是为了显示问题: (还必须包括glext,因为它没有找到GL_CLAMP_TO_EDGE)
#include <GL/glfw.h>
#include <fstream>
#include <cstdlib>
#include "glext.h"
typedef struct BitmapFile
{
int width, height;
unsigned char* data;
};
BitmapFile bitmapFile;
GLuint texture[1];
void LoadBitmapFromFile( char *filename, BitmapFile *bitmap )
{
int bitmapSize = 0;
int i = 0;
FILE *file;
file = fopen( filename, "rb" );
if( !file )
{
fclose(file);
return;
}
fseek(file, 18, SEEK_SET);
fread(&bitmap->width, 4, 1, file);
fseek(file, 22, SEEK_SET);
fread(&bitmap->height, 4, 1, file);
fseek(file, 34, SEEK_SET);
fread(&bitmapSize, 4, 1, file);
bitmap->data = (unsigned char*)malloc(bitmapSize);
fseek(file, 54, SEEK_SET);
fread(bitmap->data, bitmapSize, 1, file);
for( i = 0; i < bitmapSize; i+=3 )
{
int tempByte = bitmap->data[i];
bitmap->data[i] = bitmap->data[i+2];
bitmap->data[i+2] = tempByte;
}
fclose(file);
}
int LoadGLTextures()
{
LoadBitmapFromFile( "img.bmp", &bitmapFile );
glGenTextures(1, &texture[0] );
glBindTexture(GL_TEXTURE_2D, texture[0] );
glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmapFile.width, bitmapFile.height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
/*glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );*/
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
return true;
}
int main()
{
glfwInit();
glEnable( GL_TEXTURE_2D );
glShadeModel( GL_SMOOTH );
LoadGLTextures();
glfwOpenWindowHint( GLFW_WINDOW_NO_RESIZE, GL_TRUE );
glfwOpenWindow( 1024, 768, 0, 0, 255, 0, 32, 0, GLFW_WINDOW );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1024, 768, 0, -1.0, 1.0);
glMatrixMode( GL_MODELVIEW );
while( !glfwGetKey( GLFW_KEY_ESC ) )
{
glClearColor(0.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture( GL_TEXTURE_2D, texture[0] );
glPushMatrix();
glBegin( GL_TRIANGLE_STRIP );
glTexCoord2f( 0, 0 ); glVertex2f( 0, 768 );
glTexCoord2f( 1, 0 ); glVertex2f( 1024, 768 );
glTexCoord2f( 1, 1 ); glVertex2f( 0, 0 );
glTexCoord2f( 0, 1 ); glVertex2f( 1024, 0 );
glEnd();
glPopMatrix();
glDrawPixels( bitmapFile.width, bitmapFile.height, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);
glfwSwapBuffers();
glFlush();
}
glfwTerminate();
}
http://imageshack.us/photo/my-images/254/89567090.jpg/
好吧,我无能为力,在最后一次更改加载功能后看起来像:
int LoadGLTextures()
{
LoadBitmapFromFile( "img.bmp", &bitmapFile );
glGenTextures(1, &texture[0] );
glBindTexture(GL_TEXTURE_2D, texture[0] );
//glGenerateMipmap(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmapFile.width, bitmapFile.height, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);
for( int i = 0 ; i < 8 ; i++ )
{
glTexImage2D(GL_TEXTURE_2D, i+1, GL_RGB, bitmapFile.width/(2*(i+1)), bitmapFile.height/(2*(i+1)), 0, GL_RGB, GL_UNSIGNED_BYTE, bitmapFile.data);
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
return true;
}
但在屏幕上仍然没有变化。 (位图是256x256)
答案 0 :(得分:2)
您只加载一个级别,但通过调用
启用mipmapingglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
如果只加载一个级别,则必须禁用使用
进行mipmapingglTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
或
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
OP试图在OpenGL上下文可用之前加载纹理。
答案 1 :(得分:1)
从相机位置查看时,是否逆时针绘制三角形?要测试这是否是问题,请致电glDisable(GL_CULL_FACE);
。
您还应始终在绑定前设置活动纹理单元,在绑定之前尝试glActiveTexture(GL_TEXTURE0);
。
答案 2 :(得分:1)
这个问题与我此前的回答类似:
Android OpenGL2.0 showing black textures
这是一个在OpenGL上纹理化的常见问题。
如果没有2个纹理的功能,在大多数驱动程序实现上,包装模式只能是GL_CLAMP_TO_EDGE。
您可以使用的过滤器也有限制,只能是GL_NEAREST或GL_LINEAR(换句话说,没有MIPMAPPING)
这里有两个选项:
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
到
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
干杯
答案 3 :(得分:1)
你“忘了”生成mipmap。
使用datenwolf建议的方法禁用mipmapping:
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
或
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); as
或生成mipmap。
生成mipmap:
glGenerateMipmap
。 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE)
作为纹理。gluBuild2DMipmaps
或自行为每个使用glTexImage2D
的纹理级别生成它们。 请注意,禁用mipmap可能会对性能产生负面影响。
要轻松访问Windows平台上的所有这些功能,您需要GLEW之类的内容。