C++ OpenGL土壤纹理

C++ OpenGL土壤纹理,c++,c,opengl,textures,soil,C++,C,Opengl,Textures,Soil,我正在用openGL构建一个篮球游戏,不过我正在采取一些小步骤,将我的工作划分为几个部分。我现在专注于纹理,试图用土壤库建造一座房子 我对这一切都非常陌生,所以我可能设置了错误的东西,但我的主要问题是,从我所能看到的情况来看,纹理的行为就像被夹在边缘一样 目前,该项目是一个由砖块构成的单面墙,下面是我得到的输出图像: 以下是源代码: #include <stdlib.h> #include <GL/glut.h> #include <SOIL.h> #inc

我正在用openGL构建一个篮球游戏,不过我正在采取一些小步骤,将我的工作划分为几个部分。我现在专注于纹理,试图用土壤库建造一座房子

我对这一切都非常陌生,所以我可能设置了错误的东西,但我的主要问题是,从我所能看到的情况来看,纹理的行为就像被夹在边缘一样

目前,该项目是一个由砖块构成的单面墙,下面是我得到的输出图像:

以下是源代码:

#include <stdlib.h>
#include <GL/glut.h>
#include <SOIL.h>
#include <stdio.h>

float _angle = 0.0;
GLuint _textureBrick;

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, 1.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void renderScene(void)
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    // Front side brick wall
    glPushMatrix();
        glBindTexture(GL_TEXTURE_2D, _textureBrick);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTranslatef(0,0,-6);
        glRotatef(_angle, 0.0, 1.0, 0.0);
        glBegin(GL_QUADS);  // Wall
            glTexCoord3f(-50.0,2.0,0.1);  glVertex3f(-50,0,1);
            glTexCoord3f(50.0,2.0,0.1);  glVertex3f(50,0,1);
            glTexCoord3f(50.0,0.0,0.1);  glVertex3f(50,-1.5,1);
            glTexCoord3f(-50.0,0.0,0.1);  glVertex3f(-50,-1.5,1);
        glEnd();
    glPopMatrix();

    glutSwapBuffers();
}

void mySpecialFunc(int key, int x, int y){
    switch (key) {
    case GLUT_KEY_RIGHT:
        _angle += 1;
        if (_angle > 360) _angle = 0.0;
        break;
    case GLUT_KEY_LEFT:
        _angle -= 1;
        if (_angle > 360) _angle = 0.0;
        break;
    }
    glutPostRedisplay();
}

GLuint loadTex(const char* texname)
{
    GLuint texture = SOIL_load_OGL_texture
                    (
                        texname,
                        SOIL_LOAD_AUTO,
                        SOIL_CREATE_NEW_ID,
                        SOIL_FLAG_INVERT_Y

                    );

    if( 0 == texture )
    {
        printf( "SOIL loading error: '%s'\n", SOIL_last_result() );
    }

    //glBindTexture(GL_TEXTURE_2D, texture);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    return texture;
}

void Initialize() {
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100.0, 100.0, -100.0, 100.0, -100.0, 100.0);

    //_textureFloor = loadTex("C:\\Users\\Mikle\\OneDrive\\Uni work\\Second Year\\Projects\\3D-House-using-OpenGL-and-C--master\\court.png");

    _textureBrick = loadTex("C:\\Users\\Mikle\\OneDrive\\Uni work\\Second Year\\Projects\\3D-House-using-OpenGL-and-C--master\\bricks.bmp");
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(0,0);
    glutInitWindowSize(600,600);
    glutCreateWindow("Textured House");
    glEnable(GL_DEPTH_TEST);

    glutReshapeFunc(resize);
    glutSpecialFunc(mySpecialFunc);
    glutDisplayFunc(renderScene);
    Initialize();

    glutMainLoop();

    return 0;
}
#包括
#包括
#包括
#包括
浮动角度=0.0;
胶合纤维;
静态空心调整大小(整型宽度、整型高度)
{
常量浮点ar=(浮点)宽度/(浮点)高度;
glViewport(0,0,宽度,高度);
glMatrixMode(GL_投影);
glLoadIdentity();
glFrustum(-ar,ar,-1.0,1.0,1.0,100.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
void renderScene(void)
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glEnable(GL_纹理_2D);
//正面砖墙
glPushMatrix();
glBindTexture(GL_TEXTURE_2D,_textureBrick);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTranslatef(0,0,-6);
glRotatef(_角,0.0,1.0,0.0);
glBegin(GL_四边形);//墙
glTexCoord3f(-50.0,2.0,0.1);glVertex3f(-50,0,1);
glTexCoord3f(50.0,2.0,0.1);glVertex3f(50,0,1);
glTexCoord3f(50.0,0.0,0.1);glVertex3f(50,-1.5,1);
glTexCoord3f(-50.0,0.0,0.1);glVertex3f(-50,-1.5,1);
格伦德();
glPopMatrix();
glutSwapBuffers();
}
void mySpecialFunc(整数键、整数x、整数y){
开关(钥匙){
案例过量键右:
_角度+=1;
如果(_角度>360)_角度=0.0;
打破
案例过剩\u键\u左:
_角度-=1;
如果(_角度>360)_角度=0.0;
打破
}
再发现();
}
GLuint loadTex(常量字符*texname)
{
胶合纹理=土壤\u荷载\u OGL\u纹理
(
texname,
土壤负荷自动控制,
土壤\u创建\u新的\u ID,
土壤标志倒置
);
如果(0==纹理)
{
printf(“土壤加载错误:'%s'\n',土壤上次结果());
}
//glBindTexture(GL_TEXTURE_2D,纹理);
//glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
//glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
返回纹理;
}
void Initialize(){
glClearColor(0.0,0.0,0.0,1.0);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-100.0,100.0,-100.0,100.0,-100.0,100.0);
//_textureFloor=loadTex(“C:\\Users\\Mikle\\OneDrive\\Uni work\\Second Year\\Projects\\3D-House-using-OpenGL-and-C--master\\court.png”);
_textureBrick=loadTex(“C:\\Users\\Mikle\\OneDrive\\Uni work\\Second Year\\Projects\\3D-House-using-OpenGL-and-C--master\\bricks.bmp”);
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_双精度| GLUT_RGBA | GLUT_深度);
位置(0,0);
glutInitWindowSize(600600);
窗户(“纹理房屋”);
glEnable(GLU深度试验);
GLUTEFUNC(调整大小);
glutSpecialFunc(mySpecialFunc);
glutDisplayFunc(渲染场景);
初始化();
glutMainLoop();
返回0;
}

任何帮助都将不胜感激,谢谢

迈克尔。为了生成mipmap并可能修复纹理,应将土壤荷载函数的参数更改为

GLuint texture = SOIL_load_OGL_texture
                (
                    texname,
                    SOIL_LOAD_AUTO,
                    SOIL_CREATE_NEW_ID,
                    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT

                );
这将从OpenGL库中自动生成mipmap,因为您之后没有调用glGenerateMipmaps()。它还节省了存储纹理所需的内存。另一个关于纹理夹紧和包装的建议是使用

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
使用加载功能后。祝你的OpenGL学习经验好运。我希望这对你有所帮助

编辑:


您也不应该在每一帧重复glTexParameteri。这会给您(或用户)的CPU带来过度和不必要的压力。

如果您刚开始使用OpenGL,使用旧的不推荐使用的API并不是最好的方法;)去学习现代可编程OpenGL。不幸的是,我的大学课程不允许这样做。图像看起来需要添加GL_纹理_包裹参数以及MIN/MAG过滤器。我一直在遵循,它们非常有用。@Jere我已经尝试在renderScene函数中更改TexParameters以进行纹理包裹,并尝试进行GL_重复,但没有任何变化。我没有使用您用于加载和创建纹理的土壤函数,我用它来加载数据,然后我做了创建纹理的工作。也许这个函数中的某些东西正在影响正在发生的事情?