OpenGL-透明纹理重叠问题

OpenGL-透明纹理重叠问题,opengl,texturing,Opengl,Texturing,我是OpenGL的新手,我一直在学习教程。我试着为一个学校项目扩展它们。我遇到多个纹理渲染不正确的问题。由于某些原因,上一个纹理在下一个纹理下“停留”。我不确定这里发生了什么,希望能有一些见解。我在下面有一个问题的图片,我认为它清楚地显示了问题和下面的代码 这里是imgur上的链接,因为我还不能在这里发布图片: 代码如下: //Needed for SDL GLEW Support #define NO_SDL_GLEXT //Headers #include <GL/glew.h

我是OpenGL的新手,我一直在学习教程。我试着为一个学校项目扩展它们。我遇到多个纹理渲染不正确的问题。由于某些原因,上一个纹理在下一个纹理下“停留”。我不确定这里发生了什么,希望能有一些见解。我在下面有一个问题的图片,我认为它清楚地显示了问题和下面的代码

这里是imgur上的链接,因为我还不能在这里发布图片:

代码如下:

 //Needed for SDL GLEW Support
 #define NO_SDL_GLEXT

//Headers
#include <GL/glew.h>
#include <SDL.h>
#include <SDL_opengl.h>
#include <iostream>
#include <ctime>
#include <SOIL.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

// Shader sources
const char* vertexSource =
"#version 150\n"
"in vec2 position;"
"in vec3 color;"
"in vec2 texcoord;"
"out vec3 Color;"
"out vec2 Texcoord;"
"uniform mat4 trans;"
"void main() {"
"   Color = color;"
"   Texcoord = texcoord;"
"   gl_Position = vec4( position, 0.0, 1.0 );"
"}";

const char* fragmentSource =
"#version 150\n"
"in vec3 Color;"
"in vec2 Texcoord;"
"out vec4 outColor;"
"uniform sampler2D texture;"
"uniform int texNum;"
"void main() {"
"   outColor = texture( texture, Texcoord );"
"}";

int main( int argc, char *argv[] )
{
//Create the SDL Window
SDL_Init( SDL_INIT_VIDEO );
SDL_Surface* surface = SDL_SetVideoMode( 1280, 720, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL );
SDL_WM_SetCaption( "OpenGL", 0 );

// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();

//Enable transparency
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// Create Vertex Array Object
GLuint vao;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );

// Create a Vertex Buffer Object and copy the vertex data to it
GLuint vbo;
glGenBuffers( 1, &vbo );

float backgroundVertices[] = {
//  Position      Color             Texcoords
    //Background
    -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, //Bottom-left
     1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, //Bottom-right
     1.0f,  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
     1.0f,  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
    -1.0f,  1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, //Top-left
    -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, //Bottom-left

    //X
    -0.8f, -0.8f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, //Bottom-left
    -0.2f, -0.8f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, //Bottom-right
    -0.2f, -0.6f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
    -0.2f, -0.6f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
    -0.8f, -0.6f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, //Top-left
    -0.8f, -0.8f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, //Bottom-left

    //Y
     0.2f, -0.8f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, //Bottom-left
     0.8f, -0.8f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, //Bottom-right
     0.8f, -0.6f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
     0.8f, -0.6f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
     0.2f, -0.6f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, //Top-left
     0.2f, -0.8f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, //Bottom-left

    //Logo
    -0.25f, -0.1f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, //Bottom-left
     0.25f, -0.1f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, //Bottom-right
     0.25f,  0.7f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
     0.25f,  0.7f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, //Top-right
    -0.25f,  0.7f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, //Top-left
    -0.25f, -0.1f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f  //Bottom-left
};

glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferData( GL_ARRAY_BUFFER, sizeof( backgroundVertices ), backgroundVertices, GL_STATIC_DRAW );

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vbo );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( backgroundVertices ), backgroundVertices, GL_STATIC_DRAW );

// Create and compile the vertex shader
GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
glShaderSource( vertexShader, 1, &vertexSource, NULL );
glCompileShader( vertexShader );

// Create and compile the fragment shader
GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
glCompileShader( fragmentShader );

// Link the vertex and fragment shader into a shader program
GLuint shaderProgram = glCreateProgram();
glAttachShader( shaderProgram, vertexShader );
glAttachShader( shaderProgram, fragmentShader );
glBindFragDataLocation( shaderProgram, 0, "outColor" );
glLinkProgram( shaderProgram );
glUseProgram( shaderProgram );

// Specify the layout of the vertex data
GLint posAttrib = glGetAttribLocation( shaderProgram, "position" );
glEnableVertexAttribArray( posAttrib );
glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof( float ), 0 );

GLint colAttrib = glGetAttribLocation( shaderProgram, "color" );
glEnableVertexAttribArray( colAttrib );
glVertexAttribPointer( colAttrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof( float ), (void*)( 2 * sizeof( float ) ) );

GLint texAttrib = glGetAttribLocation( shaderProgram, "texcoord" );
glEnableVertexAttribArray( texAttrib );
glVertexAttribPointer( texAttrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof( float ), (void*)( 5 * sizeof( float ) ) );

// Load textures
GLuint textures[4];
glGenTextures( 4, textures );

int width, height;
unsigned char* image;

glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, textures[0] );
    image = SOIL_load_image( "menubackground.png", &width, &height, 0, SOIL_LOAD_RGBA );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
    SOIL_free_image_data( image );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glActiveTexture( GL_TEXTURE1 );
glBindTexture( GL_TEXTURE_2D, textures[1] );
    image = SOIL_load_image( "winona.png", &width, &height, 0, SOIL_LOAD_RGBA );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
    SOIL_free_image_data( image );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glActiveTexture( GL_TEXTURE2 );
glBindTexture( GL_TEXTURE_2D, textures[2] );
    image = SOIL_load_image( "kombat.png", &width, &height, 0, SOIL_LOAD_RGBA );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
    SOIL_free_image_data( image );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glActiveTexture( GL_TEXTURE3 );
glBindTexture( GL_TEXTURE_2D, textures[3] );
    image = SOIL_load_image( "logo.png", &width, &height, 0, SOIL_LOAD_RGBA );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
    SOIL_free_image_data( image );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glActiveTexture( GL_TEXTURE4 );
glBindTexture( GL_TEXTURE_2D, textures[4] );
    image = SOIL_load_image( "JaredSpriteSheet.png", &width, &height, 0, SOIL_LOAD_RGBA );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
    SOIL_free_image_data( image );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

SDL_Event windowEvent;
while(true)
{
    if (SDL_PollEvent(&windowEvent))
    {
        if (windowEvent.type == SDL_QUIT ) break;
    }

    // Clear the screen to black
    glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
    glClear( GL_COLOR_BUFFER_BIT );

    //Draw rectangles from the 2 triangles using 6 indices and set textures
    //glActiveTexture( GL_TEXTURE0 );
    //glBindTexture( GL_TEXTURE_2D, textures[0] );
    glUniform1i( glGetUniformLocation( shaderProgram, "texture" ), 0 );
    glDrawArrays( GL_TRIANGLES, 0, 6 );

    //glActiveTexture( GL_TEXTURE1 );
    //glBindTexture( GL_TEXTURE_2D, textures[1] );
    glUniform1i( glGetUniformLocation( shaderProgram, "texture" ), 1 ); 
    glDrawArrays( GL_TRIANGLES, 6, 12 );

    //glActiveTexture( GL_TEXTURE2 );
    //glBindTexture( GL_TEXTURE_2D, textures[2] );
    glUniform1i( glGetUniformLocation( shaderProgram, "texture" ), 2 );
    glDrawArrays( GL_TRIANGLES, 12, 18 );

    //glActiveTexture( GL_TEXTURE3 );
    //glBindTexture( GL_TEXTURE_2D, textures[3] );
    glUniform1i( glGetUniformLocation( shaderProgram, "texture" ), 3 );
    glDrawArrays( GL_TRIANGLES, 18, 24 );

    glBindTexture( GL_TEXTURE_2D, 0 );

    SDL_GL_SwapBuffers();
}

SDL_Quit();
return 0;

glDeleteTextures( 4, textures );

glDeleteProgram( shaderProgram );
glDeleteShader( fragmentShader );
glDeleteShader( vertexShader );

glDeleteBuffers( 1, &vbo );

glDeleteVertexArrays( 1, &vao );
//需要SDL GLEW支持
#定义NO_SDL_GLEXT
//标题
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//着色器源
常量字符*顶点源=
“#版本150\n”
“处于vec2位置;”
“使用vec3颜色;”
“在vec2 texcoord中;”
“输出vec3颜色;”
“out vec2 Texcoord;”
“统一mat4 trans;”
“void main(){”
“颜色=颜色;”
“Texcoord=Texcoord;”
“gl_位置=向量4(位置,0.0,1.0);”
"}";
常量字符*碎片源=
“#版本150\n”
“使用vec3颜色;”
“在vec2 Texcoord中;”
“out vec4 OUTCLOR;”
“均匀的二维纹理;”
“统一整数texNum;”
“void main(){”
outColor=纹理(纹理,Texcoord)
"}";
int main(int argc,char*argv[])
{
//创建SDL窗口
SDL_Init(SDL_Init_视频);
SDL_表面*表面=SDL_设置视频模式(1280、720、32,SDL_表面| SDL_DOUBLEBUF | SDL_OPENGL);
SDL_WM_SetCaption(“OpenGL”,0);
//初始化GLEW
glewExperimental=GL_TRUE;
glewInit();
//启用透明度
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
//创建顶点数组对象
GLuint-vao;
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
//创建顶点缓冲区对象并将顶点数据复制到该对象
GLuint vbo;
glGenBuffers(1,&vbo);
浮动背景顶点[]={
//定位颜色坐标
//背景
-1.0f,-1.0f,1.0f,1.0f,1.0f,0.0f,1.0f,//左下角
1.0f,-1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,//右下角
1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,0.0f,//右上角
1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,0.0f,//右上角
-1.0f、1.0f、1.0f、1.0f、1.0f、0.0f、0.0f、//左上角
-1.0f,-1.0f,1.0f,1.0f,1.0f,0.0f,1.0f,//左下角
//X
-0.8f,-0.8f,1.0f,1.0f,1.0f,0.0f,1.0f,//左下角
-0.2f、-0.8f、1.0f、1.0f、1.0f、1.0f、1.0f、//右下角
-0.2f、-0.6f、1.0f、1.0f、1.0f、1.0f、0.0f、//右上角
-0.2f、-0.6f、1.0f、1.0f、1.0f、1.0f、0.0f、//右上角
-0.8f,-0.6f,1.0f,1.0f,1.0f,0.0f,0.0f,//左上角
-0.8f,-0.8f,1.0f,1.0f,1.0f,0.0f,1.0f,//左下角
//Y
0.2f、-0.8f、1.0f、1.0f、1.0f、0.0f、1.0f、//左下角
0.8f,-0.8f,1.0f,1.0f,1.0f,1.0f,1.0f,//右下角
0.8f,-0.6f,1.0f,1.0f,1.0f,1.0f,0.0f,//右上角
0.8f,-0.6f,1.0f,1.0f,1.0f,1.0f,0.0f,//右上角
0.2f、-0.6f、1.0f、1.0f、1.0f、0.0f、0.0f、//左上角
0.2f、-0.8f、1.0f、1.0f、1.0f、0.0f、1.0f、//左下角
//标志
-0.25f、-0.1f、1.0f、1.0f、1.0f、0.0f、1.0f、//左下角
0.25f、-0.1f、1.0f、1.0f、1.0f、1.0f、1.0f、//右下角
0.25f、0.7f、1.0f、1.0f、1.0f、1.0f、0.0f、//右上角
0.25f、0.7f、1.0f、1.0f、1.0f、1.0f、0.0f、//右上角
-0.25f、0.7f、1.0f、1.0f、1.0f、0.0f、0.0f、//左上角
-0.25f、-0.1f、1.0f、1.0f、1.0f、0.0f、1.0f//左下角
};
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GL_数组_缓冲区、sizeof(背景顶点)、背景顶点、GL_静态_绘制);
glBindBuffer(GL_元素数组缓冲区,vbo);
glBufferData(GL元素\数组\缓冲区、sizeof(背景顶点)、背景顶点、GL静态\绘图);
//创建并编译顶点着色器
GLuint vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(顶点着色器,1和顶点源,NULL);
glCompileShader(顶点着色器);
//创建并编译片段着色器
GLuint fragmentShader=glCreateShader(GL\u fragmentShader);
glShaderSource(fragmentShader,1和fragmentSource,NULL);
glCompileShader(fragmentShader);
//将顶点和片段着色器链接到着色器程序中
GLuint shaderProgram=glCreateProgram();
glAttachShader(着色器程序、顶点着色器);
glAttachShader(着色器程序、碎片着色器);
glBindFragDataLocation(着色器程序,0,“outColor”);
GLLINK程序(着色器程序);
glUseProgram(shaderProgram);
//指定顶点数据的布局
GLint posAttrib=glGetAttribLocation(着色器程序,“位置”);
glEnableVertexAttribArray(posAttrib);
glvertexattributepointer(posAttrib,2,GL_FLOAT,GL_FALSE,7*sizeof(FLOAT),0);
GLint colAttrib=glGetAttrib(着色器程序,“颜色”);
glEnableVertexAttribArray(colAttrib);
glvertexattributepointer(colAttrib,3,GL_FLOAT,GL_FALSE,7*sizeof(FLOAT),(void*)(2*sizeof(FLOAT));
GLint-texAttrib=glGetAttribLocation(着色器程序,“texcoord”);
glEnableVertexAttribArray(texAttrib);
glvertexattributepointer(texAttrib,2,GL_FLOAT,GL_FALSE,7*sizeof(FLOAT),(void*)(5*sizeof(FLOAT));
//加载纹理
胶合纹理[4];
glGenTextures(4,纹理);
int宽度、高度;
无符号字符*图像;
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,纹理[0]);
image=SOIL\u load\u image(“menubackground.png”&宽度和高度,0,SOIL\u load\u RGBA);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGBA,宽度,高度,0,GL_RGBA,GL_无符号_字节,图像);
无土壤图像数据(图像);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
玻璃结构(GL_纹理1);
glBindTexture(GL_纹理_2D,纹理[1]);
image=SOIL\u load\u image(“winona.png”&宽度和高度,0,SOIL\u load\u RGBA);
glTexImage2D(GL_纹理_2D,