你如何使用 OpenGL 将纹理放在正方形上?
How do you put textures on square with OpenGL?
我尝试使用以下代码将纹理应用于正方形,但它们没有应用。
上面的代码有问题吗?
"dd" 打印在控制台 window 上。
我认为它是读取 bmp 文件。
但是我只看到像下图这样的白色方块
位图文件位于项目文件夹中。
LoadBMP()
是打开bmp文件的函数。
LoadGLTextures()
是加载贴图的函数。
ps。我英语不好。对不起。
#define _CRT_SECURE_NO_DEPRECATE
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <GL/GLAUX.H>
#pragma comment (lib,"glaux.lib")
unsigned int MyTextureObiect[1];
AUX_RGBImageRec *pTextureImage[1];
AUX_RGBImageRec *LoadBMP(char *szFilename) {
FILE * pFile = NULL;
if (!szFilename) {
return NULL;
}
pFile = fopen(szFilename, "r");
if (pFile) {
fclose(pFile);
return auxDIBImageLoad(szFilename);
}
return NULL;
}
int LoadGLTextures() {
int Status = FALSE;
memset(pTextureImage, 0, sizeof(void *) * 1);
if (pTextureImage[0] = LoadBMP("butterflyans.bmp")) {
printf("dd");
Status = TRUE;
glGenTextures(1, &MyTextureObiect[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, pTextureImage[0]->sizeX, pTextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pTextureImage[0]->data);
glEnable(GL_TEXTURE_2D);
}
if (pTextureImage[0]) {
if (pTextureImage[0]->data) {
free(pTextureImage[0]->data);
}
free(pTextureImage[0]);
}
return Status;
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, MyTextureObiect[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-0.5, -0.5, 0.0);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(0.5, -0.5, 0.0);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(0.5, 0.5, 0.0);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-0.5, 0.5, 0.0);
glEnd();
glFlush();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("OpenGL Drawing Example");
glutDisplayFunc(myDisplay);
if (LoadGLTextures()) {
glEnable(GL_TEXTURE_2D);
}
glutMainLoop();
return 0;
}
在设置纹理参数和指定纹理之前,您错过了绑定 glBindTexture
纹理对象。
注意,glTexParameter
and glTexImage2D
应用于当前绑定的纹理:
glGenTextures(1, &MyTextureObiect[0]);
glBindTexture(GL_TEXTURE_2D, MyTextureObiect[0]); // <---- bind the texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D( .... );
顺便说一句,你设置了两次GL_TEXTURE_MIN_FILTER
,但你从未设置过GL_TEXTURE_MAG_FILTER
。
我尝试使用以下代码将纹理应用于正方形,但它们没有应用。 上面的代码有问题吗? "dd" 打印在控制台 window 上。 我认为它是读取 bmp 文件。 但是我只看到像下图这样的白色方块
位图文件位于项目文件夹中。
LoadBMP()
是打开bmp文件的函数。
LoadGLTextures()
是加载贴图的函数。
ps。我英语不好。对不起。
#define _CRT_SECURE_NO_DEPRECATE
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <GL/GLAUX.H>
#pragma comment (lib,"glaux.lib")
unsigned int MyTextureObiect[1];
AUX_RGBImageRec *pTextureImage[1];
AUX_RGBImageRec *LoadBMP(char *szFilename) {
FILE * pFile = NULL;
if (!szFilename) {
return NULL;
}
pFile = fopen(szFilename, "r");
if (pFile) {
fclose(pFile);
return auxDIBImageLoad(szFilename);
}
return NULL;
}
int LoadGLTextures() {
int Status = FALSE;
memset(pTextureImage, 0, sizeof(void *) * 1);
if (pTextureImage[0] = LoadBMP("butterflyans.bmp")) {
printf("dd");
Status = TRUE;
glGenTextures(1, &MyTextureObiect[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, pTextureImage[0]->sizeX, pTextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pTextureImage[0]->data);
glEnable(GL_TEXTURE_2D);
}
if (pTextureImage[0]) {
if (pTextureImage[0]->data) {
free(pTextureImage[0]->data);
}
free(pTextureImage[0]);
}
return Status;
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, MyTextureObiect[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-0.5, -0.5, 0.0);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(0.5, -0.5, 0.0);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(0.5, 0.5, 0.0);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-0.5, 0.5, 0.0);
glEnd();
glFlush();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("OpenGL Drawing Example");
glutDisplayFunc(myDisplay);
if (LoadGLTextures()) {
glEnable(GL_TEXTURE_2D);
}
glutMainLoop();
return 0;
}
在设置纹理参数和指定纹理之前,您错过了绑定 glBindTexture
纹理对象。
注意,glTexParameter
and glTexImage2D
应用于当前绑定的纹理:
glGenTextures(1, &MyTextureObiect[0]);
glBindTexture(GL_TEXTURE_2D, MyTextureObiect[0]); // <---- bind the texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D( .... );
顺便说一句,你设置了两次GL_TEXTURE_MIN_FILTER
,但你从未设置过GL_TEXTURE_MAG_FILTER
。