纹理不起作用 - OpenGL
Texture doesn't work - OpenGL
我不知道为什么,但我的代码没有运行任何纹理。有人能告诉我怎么修吗?
GLUT库必须由我使用一个函数来加载纹理,并将GLuint返回到一个变量,并在对象中设置该变量。
#include <windows.h>
#include <gl/glut.h>
#include <stdlib.h>
#include <stdio.h>
float _angle = 0.0;
int zoomX = 0, zoomY=0;
GLuint texturaGrama;
GLfloat angle, fAspect, rotX, rotY, obsZ;
GLuint LoadTexture( const char * filename, int width, int height ){
GLuint texture;
unsigned char * data;
FILE * file;
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
data = (unsigned char *)malloc( width * height * 3 );
fread( data, width * height * 3, 1, file );
fclose( file );
for(int i = 0; i < width * height ; ++i)
{
int index = i*3;
unsigned char B,R;
B = data[index];
R = data[index+2];
data[index] = R;
data[index+2] = B;
}
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
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 );
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, data );
free( data );
return texture;
}
void Desenha(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_TEXTURE_2D);
// Grama
glPushMatrix();
glColor3f(0.0, 1.0, 0.0);
glTranslatef(0,0,-6);
glRotatef(_angle, 0.0, 1.0, 0.0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texturaGrama);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,0.0f); glVertex3f(-50,-1.5,50);
glTexCoord2f(1.0f,0.0f); glVertex3f(-50,-1.5,-50);
glTexCoord2f(1.0f,1.0f); glVertex3f(50,-1.5,-50);
glTexCoord2f(0.0f,0.0f); glVertex3f(50,-1.5,50);
glEnd();
glDisable(GL_TEXTURE_2D);
}
void PosicionaObservador(void)
{
// Especifica sistema de coordenadas do modelo
glMatrixMode(GL_MODELVIEW);
// Inicializa sistema de coordenadas do modelo
glLoadIdentity();
DefineIluminacao();
// Especifica posição do observador e do alvo
glTranslatef(zoomX,zoomY,-obsZ);
glRotatef(rotX,1,0,0);
glRotatef(rotY,0,1,0);
}
void Inicializa (void)
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
texturaGrama = LoadTexture("grass.bmp", 256, 256);
angle=50;
rotX = 30;
rotY = 0;
obsZ = 10;
}
static void resize(int width, int height)
{
const float ar = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
PosicionaObservador();
}
int main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(800,600);
glutInitWindowPosition(50,50);
glutCreateWindow("Casa Sinistra");
glutDisplayFunc(Desenha);
glEnable(GL_DEPTH_TEST);
glutSpecialFunc(MovimentoTela);
glutReshapeFunc(resize);
Inicializa();
glutMainLoop();
}
我试过很多其他的libs,但都不起作用。我正在Windows10的CodeBlocks中运行此代码。代码会运行,但纹理不会出现。这是因为Windows?我需要添加任何库吗?
glutInit
初始化。
在程序开始时初始化供过于求,然后再使用库的任何指令:
int main(int argc, char** argv)
{
glutInit(&argc, argv); // <------------
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(800,600);
glutInitWindowPosition(50,50);
glutCreateWindow("Casa Sinistra");
.....
由于您使用的是双缓冲窗口
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
您必须在渲染循环(循环中的最后一条语句(结束时调用glutSwapBuffers
,以执行当前窗口的缓冲区交换:
void Desenha(void)
{
......
glutSwapBuffers();
}
顺便说一句,纹理坐标有一个错误,因为uv坐标(0,0(是两倍(glTexCoord2f(0.0f,0.0f)
(。
相关文章:
- OpenGL 3.0+:正交矩阵不起作用
- OpenGL中使用Freetype进行字体渲染的问题不起作用
- 纹理不起作用 - OpenGL
- Opengl 4 调试输出不起作用
- 在某些情况下,多个 OpenGL 纹理不起作用?
- 检查刻度中的坐标不起作用(OpenGL)
- QT在CentOS 7的openGL不起作用
- OpenGL照明不起作用
- OpenGL 纹理坐标不起作用
- OpenGL 第一个多维数据集渲染不起作用
- Opengl 旋转不起作用
- OpenGL代码在GLFW上工作,但在QT OpenGL上不起作用
- OpenGL 深度测试不起作用
- 纹理绑定不起作用 / C++ / OpenGL
- 在OpenGL中绘制VBO不起作用
- OpenGL 移动对象不起作用
- C++ OpenGL 着色器不起作用
- 为什么我的 OpenGL 纹理不起作用?
- 使用默认构造函数调用的网格类不起作用 OpenGL C++
- C++ Opengl Lighting不起作用