Я загружаю файл растрового изображения и создаю текстуру таким образом:
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)