Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
纹理不';t工作-OpenGL_Opengl - Fatal编程技术网

纹理不';t工作-OpenGL

纹理不';t工作-OpenGL,opengl,Opengl,我不知道为什么,但我的代码没有运行任何纹理。有人能告诉我怎么修吗 我正在使用一个函数来加载纹理,并将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; G

我不知道为什么,但我的代码没有运行任何纹理。有人能告诉我怎么修吗

我正在使用一个函数来加载纹理,并将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();
}
#包括
#包括
#包括
#包括
浮动角度=0.0;
int zoomX=0,zoomY=0;
胶合质构瘤;
GLfloat角度、fAspect、rotX、rotY、obsZ;
GLuint LoadTexture(常量字符*文件名、整数宽度、整数高度){
胶合结构;
无符号字符*数据;
文件*文件;
file=fopen(文件名为“rb”);
如果(file==NULL)返回0;
数据=(无符号字符*)malloc(宽度*高度*3);
fread(数据,宽度*高度*3,1,文件);
fclose(文件);
对于(int i=0;i
我试过很多其他的LIB,但都不管用。我在Windows10的代码块中运行这段代码。代码运行,但纹理不显示。这是因为Windows而发生的? 我需要添加任何库?

必须由初始化

在使用库的任何指令之前,在程序开始时初始化glut:

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");

     .....
必须在渲染循环结束时(循环中的最后一条语句)调用,才能对当前窗口执行缓冲区交换:

void Desenha(void)
{
    ......

    glutSwapBuffers();
}


顺便说一下,您的纹理坐标有一个错误,因为uv坐标(0,0)是两倍(
glTexCoord2f(0.0f,0.0f)
)。

您是否尝试过
glTexEnvi(GL\u texture\u ENV,GL\u texture\u ENV\u MODE,GL\u REPLACE)?顺便说一句,您正在使用OpenGL固定功能管道,该管道已被弃用十年了。你应该考虑移动到现代OpenGL。你有一些代码示例或者一个有更好的方法的网站吗?我是OpenGL的新手。至少在这段代码中没有。我建议你看另一个教程。如果我添加glutSwapBuffers(),glBegin和glEnd的任何教程都无法更新;渲染场景后,除了在glEnd()之后添加外,不会发生任何事情;场景错误。可能是因为glTexCoord2f()?
void Desenha(void)
{
    ......

    glutSwapBuffers();
}